@cofhe/react 0.5.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/cofhesdk/cofhesdk/packages/react/dist/chunk-3YAGCPSA.cjs","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/primitive/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/built-in/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/key-of-base/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-exclude/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-extract/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-omit/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/writable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/async-or-sync/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/async-or-sync-type/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/dictionary/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/dictionary-values/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/merge/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/merge-n/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/newable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-never/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/omit-properties/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/opaque/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/path-value/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/paths/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/pick-properties/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/prettify/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/safe-dictionary/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/union-to-intersection/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/value-of/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/xor/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-optional/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-readonly/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-required/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/mark-writable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/buildable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-mark-optional/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-mark-required/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-non-nullable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-nullable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-omit/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-partial/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-pick/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-readonly/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-required/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-undefinable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-writable/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-deep-omit/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/strict-deep-pick/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/optional-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/pick-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/readonly-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/required-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/writable-keys/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/exact/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-any/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-never/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-unknown/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/is-tuple/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-empty-object/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-array/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/array-or-single/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/element-of/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/head/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/non-empty-array/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/readonly-array-or-single/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/tail/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/tuple/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/camel-case/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/deep-camel-case-properties/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/any-function/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/predicate-function/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/predicate-type/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/unreachable-case-error/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/assert/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/create-factory-with-constraint/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/is-exact/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/functions/noop/index.ts","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/dist/awaited/index.js","../../../node_modules/.pnpm/ts-essentials@10.1.1_typescript@5.5.4/node_modules/ts-essentials/lib/index.ts","../src/providers/QueryProvider.tsx","../src/providers/CofheProvider.tsx","../src/hooks/useCofheAutoConnect.ts","../src/providers/internalQueryHooks.ts","../src/providers/queryUtils.ts","../src/hooks/useCofheConnect.ts","../src/config.ts","../src/utils/debug.ts","../src/hooks/useCofheClient.ts","../src/types/token.ts","../src/utils/utils.ts","../src/hooks/useCofheConnection.ts","../src/utils/cn.ts","../src/utils/waitUntilRpcAwareAndReadContract.ts","../src/utils/cofheErrors.ts","../src/hooks/useCofhePermits.ts","../src/hooks/useCofheEnabled.ts","../src/hooks/useCofheReadContract.ts","../src/utils/serializeBigint.ts","../src/hooks/useCofheTokenLists.ts","../src/stores/customTokensStore.ts","../src/hooks/useResolvedCofheToken.ts","../src/constants/erc20ABIs.ts","../src/constants/confidentialTokenWrapped.ts","../src/constants/confidentialTokenABIs.ts","../src/hooks/useCofheReadContractAndDecrypt.ts","../src/hooks/useCofheDecrypt.ts","../src/hooks/useCofheTokenDecryptedBalance.ts","../src/utils/format.ts","../src/utils/bigintJson.ts","../src/stores/transactionStore.ts","../src/hooks/useCofheEncrypt.ts","../src/hooks/internal/useStepsState.ts","../src/hooks/useCofheWriteContract.ts","../src/hooks/useCofheEncryptAndWriteContract.ts","../src/hooks/useCofheTokenTransfer.ts","../src/stores/portalModalStore.tsx","../src/stores/portalUIStore.tsx","../src/stores/portalStatuses.tsx","../src/stores/portalNavigationStore.tsx","../src/components/CofheFloatingButton/components/ToastPrimitives.tsx","../src/components/CofheFloatingButton/components/HashLink.tsx","../src/stores/portalToasts.tsx","../src/hooks/useTransactionGlobalLifecycle.ts","../src/hooks/useCofheTokenShield.ts","../src/hooks/useCofheTokenUnshield.ts","../src/hooks/useStoredTransaction.ts","../src/hooks/useStoredTransactions.ts","../src/hooks/useOnceTransactionMined.ts","../src/hooks/useOnceDecrypted.ts","../src/hooks/useCofheTokenClaimUnshielded.ts","../src/hooks/useCofheTokenClaimable.ts","../src/utils/decryptionAwareReadContract.ts","../src/stores/decryptionWatchingStore.ts","../src/hooks/useIsWaitingForDecryptionToInvalidate.ts","../src/hooks/useCofheTokensClaimable.ts","../src/hooks/useNormalizedList.ts","../src/hooks/useIsWaitingForDecryptionByAddress.ts","../src/hooks/useCofheTokensWithExistingEncryptedBalances.ts","../src/hooks/useCofheReadContracts.ts","../src/hooks/useTokensWithPublicBalances.ts","../src/hooks/useCofheTokenPublicBalance.ts","../src/hooks/useCofheSimulateWriteContract.ts","../src/hooks/permits/useCofheNavigateToCreatePermit.tsx","../src/hooks/useTransactionReceiptsByHash.ts","../src/utils/coingecko.ts","../src/hooks/useCoingeckoUsdPrice.ts","../src/hooks/useCoingeckoContractMarketChartRange.ts","../src/hooks/useTokenAllowance.ts","../src/hooks/useCofheTokenApprove.ts","../src/hooks/permits/usePermitDuration.ts","../src/hooks/permits/usePermitForm.ts","../src/stores/portalPersisted.tsx","../src/hooks/permits/useCofheCreatePermitMutation.ts","../src/hooks/permits/usePermitsList.ts","../src/hooks/permits/useReceivePermit.ts","../src/hooks/permits/usePermitDetailsAndActions.ts","../src/hooks/useCopyFeedback.ts","../src/hooks/useReschedulableTimeout.ts"],"names":["assert","createContext","useEffect","noopCofheReactLoggerMethod","jsx","useSyncExternalStore","DEFAULT_SNAPSHOT_GETTER","useMemo","useCallback","zeroAddress","onPoll","TransactionStatus","TransactionActionType","persist","useState","jsxs","ContractFunctionExecutionError","ContractFunctionRevertedError","createJSONStorage","bigintStorage","queryKey","isAddress","PermitUtils"],"mappings":"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AEuC;AAC1B,EAAA;AACJ,IAAA;AACH,MAAA;AACU,QAAA;AACN,UAAA;AACgB,YAAA;AACR,YAAA;AACA,YAAA;AACR,UAAA;AACF,QAAA;AACM,QAAA;AACG,QAAA;AACP,UAAA;AACgB,YAAA;AACR,YAAA;AACA,YAAA;AACR,UAAA;AACF,QAAA;AACiB,QAAA;AACX,QAAA;AACR,MAAA;AACF,IAAA;AACc,IAAA;AACI,IAAA;AACpB,EAAA;AACqB,EAAA;AACd,IAAA;AACH,MAAA;AACU,QAAA;AACN,UAAA;AACgB,YAAA;AACR,YAAA;AACA,YAAA;AACR,UAAA;AACF,QAAA;AACM,QAAA;AACG,QAAA;AACP,UAAA;AACgB,YAAA;AACR,YAAA;AACA,YAAA;AACR,UAAA;AACF,QAAA;AACiB,QAAA;AACX,QAAA;AACR,MAAA;AACF,IAAA;AACc,IAAA;AAChB,EAAA;AACsB,EAAA;AACf,IAAA;AACH,MAAA;AACU,QAAA;AACN,UAAA;AACgB,YAAA;AACR,YAAA;AACA,YAAA;AACR,UAAA;AACA,UAAA;AACc,YAAA;AACV,cAAA;AACgB,gBAAA;AACR,gBAAA;AACA,gBAAA;AACR,cAAA;AACA,cAAA;AACgB,gBAAA;AACR,gBAAA;AACA,gBAAA;AACR,cAAA;AACA,cAAA;AACgB,gBAAA;AACR,gBAAA;AACA,gBAAA;AACR,cAAA;AACA,cAAA;AACgB,gBAAA;AACR,gBAAA;AACA,gBAAA;AACR,cAAA;AACF,YAAA;AACc,YAAA;AACR,YAAA;AACA,YAAA;AACR,UAAA;AACF,QAAA;AACM,QAAA;AACG,QAAA;AACP,UAAA;AACgB,YAAA;AACR,YAAA;AACA,YAAA;AACR,UAAA;AACF,QAAA;AACiB,QAAA;AACX,QAAA;AACR,MAAA;AACF,IAAA;AACc,IAAA;AAChB,EAAA;AACQ,EAAA;AACI,IAAA;AACH,IAAA;AACU,MAAA;AACD,MAAA;AAChB,IAAA;AACQ,IAAA;AACS,MAAA;AACD,MAAA;AAChB,IAAA;AACa,IAAA;AACI,MAAA;AACD,MAAA;AAChB,IAAA;AACF,EAAA;AACU,EAAA;A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AACc,EAAA;AACF,EAAA;AACV,EAAA;AACR,IAAA;AACN,MAAA;AACE,QAAA;AACF,QAAA;AACR,MAAA;AACH,IAAA;AACoB,IAAA;AACT,MAAA;AACE,QAAA;AACF,QAAA;AACuB,QAAA;AAC/B,MAAA;AACH,IAAA;AACD,EAAA;AACoB,EAAA;AACF,IAAA;AACN,MAAA;AACE,QAAA;AACF,QAAA;AACR,MAAA;AACH,IAAA;AACoB,IAAA;AACT,MAAA;AACE,QAAA;AACF,QAAA;AACuB,QAAA;AAC/B,MAAA;AACH,IAAA;AACD,EAAA;AAEgC,EAAA;AACA,EAAA;AACC,EAAA;AAEA,EAAA;AACZ,IAAA;AACY,IAAA;AAEvB,IAAA;AACc,IAAA;AACd,EAAA;AAE0B,EAAA;AAEJ,EAAA;AACX,IAAA;AACY,IAAA;AACvB,EAAA;AAE0B,EAAA;AACtB,IAAA;AACE,EAAA;AAEoBA,EAAAA;AAClB,IAAA;AACoB,IAAA;AAC5B,IAAA;AACE,MAAA;AACF,MAAA;AACM,MAAA;AACd,IAAA;AAC+B,EAAA;AAEDA,EAAAA;AACF,IAAA;AACI,EAAA;AAERA,EAAAA;AACF,IAAA;AACI,EAAA;AAEtB,EAAA;AACmB,IAAA;AACxB,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACiC,IAAA;AACjC,IAAA;AACA,IAAA;AACF,EAAA;AACF;AvJqwKyC;AACA;AyJl3KrB;AAMoB;AAC4B,EAAA;AAElD,EAAA;AACD,IAAA;AACW,MAAA;AACS,QAAA;AAC/B,MAAA;AACF,IAAA;AACG,EAAA;AAEkC,EAAA;AACf,IAAA;AACS,MAAA;AAC/B,IAAA;AACoC,IAAA;AACzB,MAAA;AACiB,IAAA;AAC9B,EAAA;AAEqB,EAAA;AACG,IAAA;AACS,MAAA;AACV,MAAA;AACrB,IAAA;AACF,EAAA;AAE0B,EAAA;AAC5B;AzJ22KyC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/cofhesdk/cofhesdk/packages/react/dist/chunk-3YAGCPSA.cjs","sourcesContent":[null,"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJpbWl0aXZlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBQcmltaXRpdmUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50IHwgc3ltYm9sIHwgdW5kZWZpbmVkIHwgbnVsbDtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYnVpbHQtaW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gXCIuLi9wcmltaXRpdmVcIjtcblxuZXhwb3J0IHR5cGUgQnVpbHRpbiA9IFByaW1pdGl2ZSB8IEZ1bmN0aW9uIHwgRGF0ZSB8IEVycm9yIHwgUmVnRXhwO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIva2V5LW9mLWJhc2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIEtleW9mQmFzZSA9IGtleW9mIGFueTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LWV4Y2x1ZGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFN0cmljdEV4Y2x1ZGU8VW5pb25UeXBlLCBFeGNsdWRlZE1lbWJlcnMgZXh0ZW5kcyBVbmlvblR5cGU+ID0gRXhjbHVkZTxVbmlvblR5cGUsIEV4Y2x1ZGVkTWVtYmVycz47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LWV4dHJhY3QvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFN0cmljdEV4dHJhY3Q8VHlwZSwgVW5pb24gZXh0ZW5kcyBQYXJ0aWFsPFR5cGU+PiA9IEV4dHJhY3Q8VHlwZSwgVW5pb24+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LW9taXQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFueUFycmF5IH0gZnJvbSBcIi4uL2FueS1hcnJheVwiO1xuaW1wb3J0IHsgQW55UmVjb3JkIH0gZnJvbSBcIi4uL2FueS1yZWNvcmRcIjtcblxuZXhwb3J0IHR5cGUgU3RyaWN0T21pdDxUeXBlIGV4dGVuZHMgQW55UmVjb3JkLCBLZXlzIGV4dGVuZHMga2V5b2YgVHlwZT4gPSBUeXBlIGV4dGVuZHMgQW55QXJyYXlcbiAgPyBuZXZlclxuICA6IE9taXQ8VHlwZSwgS2V5cz47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvd3JpdGFibGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFdyaXRhYmxlPFR5cGU+ID0geyAtcmVhZG9ubHkgW0tleSBpbiBrZXlvZiBUeXBlXTogVHlwZVtLZXldIH07XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXN5bmMtb3Itc3luYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQXN5bmNPclN5bmM8VHlwZT4gPSBQcm9taXNlTGlrZTxUeXBlPiB8IFR5cGU7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXN5bmMtb3Itc3luYy10eXBlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3luY09yU3luYyB9IGZyb20gXCIuLi9hc3luYy1vci1zeW5jXCI7XG5cbmV4cG9ydCB0eXBlIEFzeW5jT3JTeW5jVHlwZTxBc3luY09yU3luY1R5cGU+ID0gQXN5bmNPclN5bmNUeXBlIGV4dGVuZHMgQXN5bmNPclN5bmM8aW5mZXIgVHlwZT4gPyBUeXBlIDogbmV2ZXI7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGljdGlvbmFyeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2V5b2ZCYXNlIH0gZnJvbSBcIi4uL2tleS1vZi1iYXNlXCI7XG5cbmV4cG9ydCB0eXBlIERpY3Rpb25hcnk8VHlwZSwgS2V5cyBleHRlbmRzIEtleW9mQmFzZSA9IHN0cmluZz4gPSB7IFtrZXkgaW4gS2V5c106IFR5cGUgfTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGljdGlvbmFyeS12YWx1ZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlcHJlY2F0ZWQgcGxlYXNlIHVzZSBgVmFsdWVPZmAgaW5zdGVhZFxuICovXG5leHBvcnQgdHlwZSBEaWN0aW9uYXJ5VmFsdWVzPFR5cGU+ID0gVHlwZVtrZXlvZiBUeXBlXTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWVyZ2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByZXR0aWZ5IH0gZnJvbSBcIi4uL3ByZXR0aWZ5XCI7XG5cbmV4cG9ydCB0eXBlIE1lcmdlPE9iamVjdDEsIE9iamVjdDI+ID0gUHJldHRpZnk8T21pdDxPYmplY3QxLCBrZXlvZiBPYmplY3QyPiAmIE9iamVjdDI+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWVyZ2Utbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWVyZ2UgfSBmcm9tIFwiLi4vbWVyZ2VcIjtcblxudHlwZSBfTWVyZ2VOPFR1cGxlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10sIFJlc3VsdD4gPSBUdXBsZSBleHRlbmRzIHJlYWRvbmx5IFtpbmZlciBIZWFkLCAuLi5pbmZlciBUYWlsXVxuICA/IF9NZXJnZU48VGFpbCwgTWVyZ2U8UmVzdWx0LCBIZWFkPj5cbiAgOiBSZXN1bHQ7XG5cbmV4cG9ydCB0eXBlIE1lcmdlTjxUdXBsZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdPiA9IF9NZXJnZU48VHVwbGUsIHt9PjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbmV3YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBOZXdhYmxlPFJldHVyblR5cGU+IHtcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFJldHVyblR5cGU7XG59XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbm9uLW5ldmVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBOb25OZXZlcjxUeXBlIGV4dGVuZHMge30+ID0gUGljazxcbiAgVHlwZSxcbiAgeyBbS2V5IGluIGtleW9mIFR5cGVdOiBUeXBlW0tleV0gZXh0ZW5kcyBuZXZlciA/IG5ldmVyIDogS2V5IH1ba2V5b2YgVHlwZV1cbj47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvb21pdC1wcm9wZXJ0aWVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBPbWl0UHJvcGVydGllczxUeXBlLCBWYWx1ZT4gPSB7IFtLZXkgaW4ga2V5b2YgVHlwZSBhcyBUeXBlW0tleV0gZXh0ZW5kcyBWYWx1ZSA/IG5ldmVyIDogS2V5XTogVHlwZVtLZXldIH07XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvb3BhcXVlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ0eXBlIFN0cmluZ0xpdGVyYWw8VHlwZT4gPSBUeXBlIGV4dGVuZHMgc3RyaW5nID8gKHN0cmluZyBleHRlbmRzIFR5cGUgPyBuZXZlciA6IFR5cGUpIDogbmV2ZXI7XG5cbmRlY2xhcmUgY29uc3QgX19PUEFRVUVfVFlQRV9fOiB1bmlxdWUgc3ltYm9sO1xuXG5leHBvcnQgdHlwZSBXaXRoT3BhcXVlPFRva2VuIGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgcmVhZG9ubHkgW19fT1BBUVVFX1RZUEVfX106IFRva2VuO1xufTtcblxuZXhwb3J0IHR5cGUgT3BhcXVlPFR5cGUsIFRva2VuIGV4dGVuZHMgc3RyaW5nPiA9IFRva2VuIGV4dGVuZHMgU3RyaW5nTGl0ZXJhbDxUb2tlbj4gPyBUeXBlICYgV2l0aE9wYXF1ZTxUb2tlbj4gOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcGF0aC12YWx1ZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcblxuLy8gVE9ETzogbWVyZ2UgdG8gRXh0cmFjdEZyb21BcnJheVxudHlwZSBFeHRyYWN0RnJvbU9iamVjdDxPYmogZXh0ZW5kcyBSZWNvcmQ8UHJvcGVydHlLZXksIHVua25vd24+LCBLZXk+ID0gS2V5IGV4dGVuZHMga2V5b2YgT2JqXG4gID8gT2JqW0tleV1cbiAgOiBLZXkgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTxPYmo+XG4gID8gTm9uTnVsbGFibGU8T2JqPltLZXldIHwgdW5kZWZpbmVkXG4gIDogdW5kZWZpbmVkO1xuXG4vLyBUT0RPOiBtZXJnZSB0byBFeHRyYWN0RnJvbU9iamVjdFxudHlwZSBFeHRyYWN0RnJvbUFycmF5PEFyciBleHRlbmRzIHJlYWRvbmx5IGFueVtdLCBLZXk+ID0gYW55W10gZXh0ZW5kcyBBcnJcbiAgPyBBcnIgZXh0ZW5kcyByZWFkb25seSAoaW5mZXIgVClbXVxuICAgID8gVCB8IHVuZGVmaW5lZFxuICAgIDogdW5kZWZpbmVkXG4gIDogS2V5IGV4dGVuZHMga2V5b2YgQXJyXG4gID8gQXJyW0tleV1cbiAgOiB1bmRlZmluZWQ7XG5cbnR5cGUgR2V0V2l0aEFycmF5PFR5cGUsIFBhdGgsIFByZXR0aWZpZWRUeXBlID0gUHJldHRpZnk8VHlwZT4+ID0gUGF0aCBleHRlbmRzIFtdXG4gID8gVHlwZVxuICA6IFBhdGggZXh0ZW5kcyBbaW5mZXIgS2V5LCAuLi5pbmZlciBSZXN0XVxuICA/IFByZXR0aWZpZWRUeXBlIGV4dGVuZHMgUmVjb3JkPFByb3BlcnR5S2V5LCB1bmtub3duPlxuICAgID8gR2V0V2l0aEFycmF5PEV4dHJhY3RGcm9tT2JqZWN0PFByZXR0aWZpZWRUeXBlLCBLZXk+LCBSZXN0PlxuICAgIDogVHlwZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdXG4gICAgPyBHZXRXaXRoQXJyYXk8RXh0cmFjdEZyb21BcnJheTxUeXBlLCBLZXk+LCBSZXN0PlxuICAgIDogdW5kZWZpbmVkXG4gIDogbmV2ZXI7XG5cbnR5cGUgUGF0aDxUeXBlPiA9IFR5cGUgZXh0ZW5kcyBgJHtpbmZlciBLZXl9LiR7aW5mZXIgUmVzdH1gXG4gID8gW0tleSwgLi4uUGF0aDxSZXN0Pl1cbiAgOiBUeXBlIGV4dGVuZHMgYCR7aW5mZXIgS2V5fWBcbiAgPyBbS2V5XVxuICA6IFtdO1xuXG5leHBvcnQgdHlwZSBQYXRoVmFsdWU8VHlwZSwgU3RyaW5nUGF0aD4gPSBHZXRXaXRoQXJyYXk8VHlwZSwgUGF0aDxTdHJpbmdQYXRoPj47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcGF0aHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElzTmV2ZXIgfSBmcm9tIFwiLi4vaXMtbmV2ZXJcIjtcbmltcG9ydCB7IENyZWF0ZVR5cGVPcHRpb25zIH0gZnJvbSBcIi4uL2NyZWF0ZS10eXBlLW9wdGlvbnNcIjtcbmltcG9ydCB7IFZhbHVlT2YgfSBmcm9tIFwiLi4vdmFsdWUtb2ZcIjtcbmltcG9ydCB7IEhhc1BhcnNhYmxlUGF0aCB9IGZyb20gXCIuLi9oYXMtcGFyc2FibGUtcGF0aFwiO1xuXG50eXBlIFBhdGhhYmxlID0gc3RyaW5nIHwgbnVtYmVyO1xuXG50eXBlIERlZmF1bHRSZWN1cnNpdmVQYXRoc09wdGlvbnMgPSB7XG4gIGRlcHRoOiBbXTtcbn07XG5cbi8qKlxuICogQHBhcmFtIGRlcHRoIFRoaXMgb3B0aW9uIGNvdW50cyB0aGUgbnVtYmVyIG9mIHJlY3Vyc2l2ZSBjYWxscyBpblxuICogYFJlY3Vyc2l2ZVBhdGhzT3B0aW9uc1snZGVwdGgnXVsnbGVuZ3RoJ11gLiBVc2VkIGluIGNvbWJpbmF0aW9uIHdpdGhcbiAqIGBQYXRoc09wdGlvbnNbJ2RlcHRoJ11gXG4gKi9cbnR5cGUgUmVjdXJzaXZlUGF0aHNPcHRpb25zID0ge1xuICBkZXB0aDogYW55W107XG59O1xuXG4vKipcbiAqIEBwYXJhbSBkZXB0aCBCeSBkZWZhdWx0LCB0aGUgZGVwdGggb3B0aW9uIGlzIHNldCB0byA3LiBJdCBzaG91bGQgY292ZXIgdGhlXG4gKiBtYWpvcml0eSBvZiB1c2UgY2FzZXMuIElmIGJ5IGFueSBjaGFuY2UgaXQgZG9lc24ndCBmaXQgeW91LCBmZWVsIGZyZWUgdG9cbiAqIGluY3JlYXNlIHRoZSB2YWx1ZS4gSG93ZXZlciwgdGhpcyBtYXkgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiBnZXR0aW5nXG4gKiBgVHlwZSBpbnN0YW50aWF0aW9uIGlzIGV4Y2Vzc2l2ZWx5IGRlZXAgYW5kIHBvc3NpYmx5IGluZmluaXRlYCBlcnJvci5cbiAqXG4gKiBAcGFyYW0gYW55QXJyYXlJbmRleEFjY2Vzc29yIEJ5IGRlZmF1bHQgdGhlcmUgaXMgbm8gd2lsZGNhcmQgYWNjZXNzIHRvXG4gKiBhcnJheSBpbmRpY2VzIC0gdXNhZ2UgbXVzdCBiZSBpbnRlbnRpb25hbGx5IGNvbmZpZ3VyZWQuXG4gKi9cbnR5cGUgRGVmYXVsdFBhdGhzT3B0aW9ucyA9IHtcbiAgZGVwdGg6IDc7XG4gIGFueUFycmF5SW5kZXhBY2Nlc3NvcjogYCR7bnVtYmVyfWA7XG59O1xuXG4vKipcbiAqIEBwYXJhbSBkZXB0aCBUaGlzIG9wdGlvbiByZXN0cmljdHMgdGhlIGRlcHRoIG9mIHRoZSBwYXRocyBsb29rdXAgYW5kIHJlbW92ZXMgYFR5cGVcbiAqIGluc3RhbnRpYXRpb24gaXMgZXhjZXNzaXZlbHkgZGVlcCBhbmQgcG9zc2libHkgaW5maW5pdGVgIGVycm9ycyBmb3JcbiAqIHBvdGVudGlhbGx5IGluZmluaXRlIHR5cGVzLlxuICpcbiAqIEBwYXJhbSBhbnlBcnJheUluZGV4QWNjZXNzb3IgVGhpcyB3aWxkY2FyZCB3aWxsIHNhdGlzZnkgYW55IGFycmF5IGluZGV4IGlmIGRlZmluZWQuXG4gKi9cbnR5cGUgUGF0aHNPcHRpb25zID0ge1xuICBkZXB0aDogbnVtYmVyO1xuICBhbnlBcnJheUluZGV4QWNjZXNzb3I6IHN0cmluZztcbn07XG5cbnR5cGUgQXBwZW5kPFR1cGxlIGV4dGVuZHMgYW55W10+ID0gWy4uLlR1cGxlLCAwXTtcblxudHlwZSBSZWN1cnNpdmVQYXRoczxcbiAgVHlwZSxcbiAgVXNlck9wdGlvbnMgZXh0ZW5kcyBSZXF1aXJlZDxQYXRoc09wdGlvbnM+LFxuICBDYWxsT3B0aW9ucyBleHRlbmRzIFJlY3Vyc2l2ZVBhdGhzT3B0aW9ucyxcbj4gPSBJc05ldmVyPGtleW9mIFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICA/IG5ldmVyXG4gIDogLy8gYE5vbk51bGxhYmxlYCByZW1vdmVzIGB1bmRlZmluZWRgIHdoZW4gcGFydGlhbCBwcm9wZXJ0aWVzIGV4aXN0IGluIG9iamVjdFxuICAgIE5vbk51bGxhYmxlPFxuICAgICAgVmFsdWVPZjx7XG4gICAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZV06IEtleSBleHRlbmRzIFBhdGhhYmxlXG4gICAgICAgICAgP1xuICAgICAgICAgICAgICB8IGAke0FueUFycmF5SW5kZXhBY2Nlc3Nvck9yS2V5PEtleSwgVXNlck9wdGlvbnM+fWBcbiAgICAgICAgICAgICAgfCAoQ2FsbE9wdGlvbnNbXCJkZXB0aFwiXVtcImxlbmd0aFwiXSBleHRlbmRzIFVzZXJPcHRpb25zW1wiZGVwdGhcIl1cbiAgICAgICAgICAgICAgICAgID8gLy8gU3RvcCBhdCB0aGUgY29uZmlndXJlZCBkZXB0aFxuICAgICAgICAgICAgICAgICAgICBuZXZlclxuICAgICAgICAgICAgICAgICAgOiBUeXBlW0tleV0gZXh0ZW5kcyBpbmZlciBWYWx1ZVxuICAgICAgICAgICAgICAgICAgPyBWYWx1ZSBleHRlbmRzIFZhbHVlXG4gICAgICAgICAgICAgICAgICAgID8gLy8gQXZvaWQgY2FsbGluZyBgVW5zYWZlUGF0aHNgIHRvIGtlZXAgYENhbGxPcHRpb25zYCBsb2NhbGx5XG4gICAgICAgICAgICAgICAgICAgICAgSGFzUGFyc2FibGVQYXRoPFZhbHVlPiBleHRlbmRzIHRydWVcbiAgICAgICAgICAgICAgICAgICAgICA/IFJlY3Vyc2l2ZVBhdGhzPFxuICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogQXBwZW5kPENhbGxPcHRpb25zW1wiZGVwdGhcIl0+O1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA+IGV4dGVuZHMgaW5mZXIgUmVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBJc05ldmVyPFJlc3Q+IGV4dGVuZHMgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogUmVzdCBleHRlbmRzIFBhdGhhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gYCR7QW55QXJyYXlJbmRleEFjY2Vzc29yT3JLZXk8S2V5LCBVc2VyT3B0aW9ucz59LiR7UmVzdH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbmV2ZXJcbiAgICAgICAgICAgICAgICAgICAgICA6IG5ldmVyXG4gICAgICAgICAgICAgICAgICAgIDogbmV2ZXJcbiAgICAgICAgICAgICAgICAgIDogbmV2ZXIpXG4gICAgICAgICAgOiBuZXZlcjtcbiAgICAgIH0+XG4gICAgPjtcblxudHlwZSBVbnNhZmVQYXRoczxUeXBlLCBPcHRpb25zIGV4dGVuZHMgUmVxdWlyZWQ8UGF0aHNPcHRpb25zPj4gPSBUeXBlIGV4dGVuZHMgVHlwZVxuICA/IEhhc1BhcnNhYmxlUGF0aDxUeXBlPiBleHRlbmRzIHRydWVcbiAgICA/IFJlY3Vyc2l2ZVBhdGhzPFR5cGUsIE9wdGlvbnMsIERlZmF1bHRSZWN1cnNpdmVQYXRoc09wdGlvbnM+XG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG50eXBlIEFueUFycmF5SW5kZXhBY2Nlc3Nvck9yS2V5PEtleSBleHRlbmRzIFBhdGhhYmxlLCBVc2VyT3B0aW9ucyBleHRlbmRzIFJlcXVpcmVkPFBhdGhzT3B0aW9ucz4+ID0gS2V5IGV4dGVuZHMgbnVtYmVyXG4gID8gS2V5IHwgVXNlck9wdGlvbnNbXCJhbnlBcnJheUluZGV4QWNjZXNzb3JcIl1cbiAgOiBLZXk7XG5cbmV4cG9ydCB0eXBlIFBhdGhzPFR5cGUsIE92ZXJyaWRlUGF0aE9wdGlvbnMgZXh0ZW5kcyBQYXJ0aWFsPFBhdGhzT3B0aW9ucz4gPSB7fT4gPSBVbnNhZmVQYXRoczxcbiAgVHlwZSxcbiAgQ3JlYXRlVHlwZU9wdGlvbnM8UGF0aHNPcHRpb25zLCBPdmVycmlkZVBhdGhPcHRpb25zLCBEZWZhdWx0UGF0aHNPcHRpb25zPlxuPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcGljay1wcm9wZXJ0aWVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBQaWNrUHJvcGVydGllczxUeXBlLCBWYWx1ZT4gPSB7XG4gIFtLZXkgaW4ga2V5b2YgVHlwZSBhcyBUeXBlW0tleV0gZXh0ZW5kcyBWYWx1ZSA/IEtleSA6IG5ldmVyXTogVHlwZVtLZXldO1xufTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJldHRpZnkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFByZXR0aWZ5PFR5cGU+ID0gVHlwZSBleHRlbmRzIEZ1bmN0aW9uXG4gID8gVHlwZVxuICA6IEV4dHJhY3Q8XG4gICAgICB7XG4gICAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZV06IFR5cGVbS2V5XTtcbiAgICAgIH0sXG4gICAgICBUeXBlXG4gICAgPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc2FmZS1kaWN0aW9uYXJ5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBLZXlvZkJhc2UgfSBmcm9tIFwiLi4va2V5LW9mLWJhc2VcIjtcblxuZXhwb3J0IHR5cGUgU2FmZURpY3Rpb25hcnk8VHlwZSwgS2V5cyBleHRlbmRzIEtleW9mQmFzZSA9IHN0cmluZz4gPSB7IFtrZXkgaW4gS2V5c10/OiBUeXBlIH07XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdW5pb24tdG8taW50ZXJzZWN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBVbmlvblRvSW50ZXJzZWN0aW9uPFVuaW9uPiA9IChVbmlvbiBleHRlbmRzIGFueSA/IChhcmc6IFVuaW9uKSA9PiB2b2lkIDogbmV2ZXIpIGV4dGVuZHMgKFxuICBhcmc6IGluZmVyIEludGVyc2VjdGlvbixcbikgPT4gdm9pZFxuICA/IEludGVyc2VjdGlvblxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdmFsdWUtb2YvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFueUFycmF5IH0gZnJvbSBcIi4uL2FueS1hcnJheVwiO1xuaW1wb3J0IHsgQW55RnVuY3Rpb24gfSBmcm9tIFwiLi4vYW55LWZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBQcmltaXRpdmUgfSBmcm9tIFwiLi4vcHJpbWl0aXZlXCI7XG5cbmV4cG9ydCB0eXBlIFZhbHVlT2Y8VHlwZT4gPSBUeXBlIGV4dGVuZHMgUHJpbWl0aXZlXG4gID8gVHlwZVxuICA6IFR5cGUgZXh0ZW5kcyBBbnlBcnJheVxuICA/IFR5cGVbbnVtYmVyXVxuICA6IFR5cGUgZXh0ZW5kcyBBbnlGdW5jdGlvblxuICA/IFJldHVyblR5cGU8VHlwZT5cbiAgOiBUeXBlW2tleW9mIFR5cGVdO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIveG9yL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJc1Vua25vd24gfSBmcm9tIFwiLi4vaXMtdW5rbm93blwiO1xuaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcblxuLy8gV2hlbiBUeXBlMiBpcyB1bmtub3duLCBpdCBjcmVhdGVzIHR5cGUgd2l0aCBhbGwgcHJvcGVydGllcyBleGNsdWRlZCBmcm9tIGl0XG4vLyBlLmcuIFdpdGhvdXQ8eyBmb286IG51bWJlcjsgYmFyOiBudW1iZXIgfSwgdW5rbm93bj4gaXMgeyBmb28/OiBuZXZlcjsgYmFyPzogbmV2ZXIgfVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RzLWVzc2VudGlhbHMvdHMtZXNzZW50aWFscy9pc3N1ZXMvNDAwXG5cbnR5cGUgV2l0aG91dDxUeXBlMSwgVHlwZTI+ID0gSXNVbmtub3duPFR5cGUyPiBleHRlbmRzIHRydWVcbiAgPyBuZXZlclxuICA6IHsgW1AgaW4gRXhjbHVkZTxrZXlvZiBUeXBlMSwga2V5b2YgVHlwZTI+XT86IG5ldmVyIH07XG5cbi8vIFRoaXMgdXRpbGl0eSB0eXBlIGJvZHkgaXMgYXV0b2dlbmVyYXRlZCBpbiBKUyBieSBydW5uaW5nOlxuLy8gY29uc3QgdHlwZXMgPSBBcnJheSg1MCkuZmlsbCgwKS5tYXAoKF8sIGluZGV4KSA9PiBgVHlwZSR7aW5kZXggKyAxfWApXG4vLyB0eXBlcy5tYXAodHlwZSA9PiBgV2l0aG91dDwke3R5cGVzLmZpbHRlcih0ID0+IHQgIT09IHR5cGUpLmpvaW4oJyYnKX0sICR7dHlwZX0+ICYgJHt0eXBlfWApLmpvaW4oJ3wnKVxuZXhwb3J0IHR5cGUgWE9SPFxuICBUeXBlMSxcbiAgVHlwZTIsXG4gIFR5cGUzID0gdW5rbm93bixcbiAgVHlwZTQgPSB1bmtub3duLFxuICBUeXBlNSA9IHVua25vd24sXG4gIFR5cGU2ID0gdW5rbm93bixcbiAgVHlwZTcgPSB1bmtub3duLFxuICBUeXBlOCA9IHVua25vd24sXG4gIFR5cGU5ID0gdW5rbm93bixcbiAgVHlwZTEwID0gdW5rbm93bixcbiAgVHlwZTExID0gdW5rbm93bixcbiAgVHlwZTEyID0gdW5rbm93bixcbiAgVHlwZTEzID0gdW5rbm93bixcbiAgVHlwZTE0ID0gdW5rbm93bixcbiAgVHlwZTE1ID0gdW5rbm93bixcbiAgVHlwZTE2ID0gdW5rbm93bixcbiAgVHlwZTE3ID0gdW5rbm93bixcbiAgVHlwZTE4ID0gdW5rbm93bixcbiAgVHlwZTE5ID0gdW5rbm93bixcbiAgVHlwZTIwID0gdW5rbm93bixcbiAgVHlwZTIxID0gdW5rbm93bixcbiAgVHlwZTIyID0gdW5rbm93bixcbiAgVHlwZTIzID0gdW5rbm93bixcbiAgVHlwZTI0ID0gdW5rbm93bixcbiAgVHlwZTI1ID0gdW5rbm93bixcbiAgVHlwZTI2ID0gdW5rbm93bixcbiAgVHlwZTI3ID0gdW5rbm93bixcbiAgVHlwZTI4ID0gdW5rbm93bixcbiAgVHlwZTI5ID0gdW5rbm93bixcbiAgVHlwZTMwID0gdW5rbm93bixcbiAgVHlwZTMxID0gdW5rbm93bixcbiAgVHlwZTMyID0gdW5rbm93bixcbiAgVHlwZTMzID0gdW5rbm93bixcbiAgVHlwZTM0ID0gdW5rbm93bixcbiAgVHlwZTM1ID0gdW5rbm93bixcbiAgVHlwZTM2ID0gdW5rbm93bixcbiAgVHlwZTM3ID0gdW5rbm93bixcbiAgVHlwZTM4ID0gdW5rbm93bixcbiAgVHlwZTM5ID0gdW5rbm93bixcbiAgVHlwZTQwID0gdW5rbm93bixcbiAgVHlwZTQxID0gdW5rbm93bixcbiAgVHlwZTQyID0gdW5rbm93bixcbiAgVHlwZTQzID0gdW5rbm93bixcbiAgVHlwZTQ0ID0gdW5rbm93bixcbiAgVHlwZTQ1ID0gdW5rbm93bixcbiAgVHlwZTQ2ID0gdW5rbm93bixcbiAgVHlwZTQ3ID0gdW5rbm93bixcbiAgVHlwZTQ4ID0gdW5rbm93bixcbiAgVHlwZTQ5ID0gdW5rbm93bixcbiAgVHlwZTUwID0gdW5rbm93bixcbj4gPSBQcmV0dGlmeTxcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMVxuICAgID4gJlxuICAgICAgVHlwZTEpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTJcbiAgICA+ICZcbiAgICAgIFR5cGUyKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUzXG4gICAgPiAmXG4gICAgICBUeXBlMylcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlNFxuICAgID4gJlxuICAgICAgVHlwZTQpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTVcbiAgICA+ICZcbiAgICAgIFR5cGU1KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU2XG4gICAgPiAmXG4gICAgICBUeXBlNilcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlN1xuICAgID4gJlxuICAgICAgVHlwZTcpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZThcbiAgICA+ICZcbiAgICAgIFR5cGU4KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU5XG4gICAgPiAmXG4gICAgICBUeXBlOSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUxMFxuICAgID4gJlxuICAgICAgVHlwZTEwKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTExXG4gICAgPiAmXG4gICAgICBUeXBlMTEpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMTJcbiAgICA+ICZcbiAgICAgIFR5cGUxMilcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUxM1xuICAgID4gJlxuICAgICAgVHlwZTEzKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTE0XG4gICAgPiAmXG4gICAgICBUeXBlMTQpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMTVcbiAgICA+ICZcbiAgICAgIFR5cGUxNSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUxNlxuICAgID4gJlxuICAgICAgVHlwZTE2KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTE3XG4gICAgPiAmXG4gICAgICBUeXBlMTcpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMThcbiAgICA+ICZcbiAgICAgIFR5cGUxOClcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUxOVxuICAgID4gJlxuICAgICAgVHlwZTE5KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTIwXG4gICAgPiAmXG4gICAgICBUeXBlMjApXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMjFcbiAgICA+ICZcbiAgICAgIFR5cGUyMSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUyMlxuICAgID4gJlxuICAgICAgVHlwZTIyKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTIzXG4gICAgPiAmXG4gICAgICBUeXBlMjMpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMjRcbiAgICA+ICZcbiAgICAgIFR5cGUyNClcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUyNVxuICAgID4gJlxuICAgICAgVHlwZTI1KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTI2XG4gICAgPiAmXG4gICAgICBUeXBlMjYpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMjdcbiAgICA+ICZcbiAgICAgIFR5cGUyNylcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUyOFxuICAgID4gJlxuICAgICAgVHlwZTI4KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTI5XG4gICAgPiAmXG4gICAgICBUeXBlMjkpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMzBcbiAgICA+ICZcbiAgICAgIFR5cGUzMClcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUzMVxuICAgID4gJlxuICAgICAgVHlwZTMxKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTMyXG4gICAgPiAmXG4gICAgICBUeXBlMzIpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMzNcbiAgICA+ICZcbiAgICAgIFR5cGUzMylcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUzNFxuICAgID4gJlxuICAgICAgVHlwZTM0KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTM1XG4gICAgPiAmXG4gICAgICBUeXBlMzUpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMzZcbiAgICA+ICZcbiAgICAgIFR5cGUzNilcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGUzN1xuICAgID4gJlxuICAgICAgVHlwZTM3KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTM4XG4gICAgPiAmXG4gICAgICBUeXBlMzgpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlMzlcbiAgICA+ICZcbiAgICAgIFR5cGUzOSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU0MFxuICAgID4gJlxuICAgICAgVHlwZTQwKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTQxXG4gICAgPiAmXG4gICAgICBUeXBlNDEpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlNDJcbiAgICA+ICZcbiAgICAgIFR5cGU0MilcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU0M1xuICAgID4gJlxuICAgICAgVHlwZTQzKVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTQ0XG4gICAgPiAmXG4gICAgICBUeXBlNDQpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDggJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlNDVcbiAgICA+ICZcbiAgICAgIFR5cGU0NSlcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU0OSAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU0NlxuICAgID4gJlxuICAgICAgVHlwZTQ2KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5ICZcbiAgICAgICAgVHlwZTUwLFxuICAgICAgVHlwZTQ3XG4gICAgPiAmXG4gICAgICBUeXBlNDcpXG4gIHwgKFdpdGhvdXQ8XG4gICAgICBUeXBlMSAmXG4gICAgICAgIFR5cGUyICZcbiAgICAgICAgVHlwZTMgJlxuICAgICAgICBUeXBlNCAmXG4gICAgICAgIFR5cGU1ICZcbiAgICAgICAgVHlwZTYgJlxuICAgICAgICBUeXBlNyAmXG4gICAgICAgIFR5cGU4ICZcbiAgICAgICAgVHlwZTkgJlxuICAgICAgICBUeXBlMTAgJlxuICAgICAgICBUeXBlMTEgJlxuICAgICAgICBUeXBlMTIgJlxuICAgICAgICBUeXBlMTMgJlxuICAgICAgICBUeXBlMTQgJlxuICAgICAgICBUeXBlMTUgJlxuICAgICAgICBUeXBlMTYgJlxuICAgICAgICBUeXBlMTcgJlxuICAgICAgICBUeXBlMTggJlxuICAgICAgICBUeXBlMTkgJlxuICAgICAgICBUeXBlMjAgJlxuICAgICAgICBUeXBlMjEgJlxuICAgICAgICBUeXBlMjIgJlxuICAgICAgICBUeXBlMjMgJlxuICAgICAgICBUeXBlMjQgJlxuICAgICAgICBUeXBlMjUgJlxuICAgICAgICBUeXBlMjYgJlxuICAgICAgICBUeXBlMjcgJlxuICAgICAgICBUeXBlMjggJlxuICAgICAgICBUeXBlMjkgJlxuICAgICAgICBUeXBlMzAgJlxuICAgICAgICBUeXBlMzEgJlxuICAgICAgICBUeXBlMzIgJlxuICAgICAgICBUeXBlMzMgJlxuICAgICAgICBUeXBlMzQgJlxuICAgICAgICBUeXBlMzUgJlxuICAgICAgICBUeXBlMzYgJlxuICAgICAgICBUeXBlMzcgJlxuICAgICAgICBUeXBlMzggJlxuICAgICAgICBUeXBlMzkgJlxuICAgICAgICBUeXBlNDAgJlxuICAgICAgICBUeXBlNDEgJlxuICAgICAgICBUeXBlNDIgJlxuICAgICAgICBUeXBlNDMgJlxuICAgICAgICBUeXBlNDQgJlxuICAgICAgICBUeXBlNDUgJlxuICAgICAgICBUeXBlNDYgJlxuICAgICAgICBUeXBlNDcgJlxuICAgICAgICBUeXBlNDkgJlxuICAgICAgICBUeXBlNTAsXG4gICAgICBUeXBlNDhcbiAgICA+ICZcbiAgICAgIFR5cGU0OClcbiAgfCAoV2l0aG91dDxcbiAgICAgIFR5cGUxICZcbiAgICAgICAgVHlwZTIgJlxuICAgICAgICBUeXBlMyAmXG4gICAgICAgIFR5cGU0ICZcbiAgICAgICAgVHlwZTUgJlxuICAgICAgICBUeXBlNiAmXG4gICAgICAgIFR5cGU3ICZcbiAgICAgICAgVHlwZTggJlxuICAgICAgICBUeXBlOSAmXG4gICAgICAgIFR5cGUxMCAmXG4gICAgICAgIFR5cGUxMSAmXG4gICAgICAgIFR5cGUxMiAmXG4gICAgICAgIFR5cGUxMyAmXG4gICAgICAgIFR5cGUxNCAmXG4gICAgICAgIFR5cGUxNSAmXG4gICAgICAgIFR5cGUxNiAmXG4gICAgICAgIFR5cGUxNyAmXG4gICAgICAgIFR5cGUxOCAmXG4gICAgICAgIFR5cGUxOSAmXG4gICAgICAgIFR5cGUyMCAmXG4gICAgICAgIFR5cGUyMSAmXG4gICAgICAgIFR5cGUyMiAmXG4gICAgICAgIFR5cGUyMyAmXG4gICAgICAgIFR5cGUyNCAmXG4gICAgICAgIFR5cGUyNSAmXG4gICAgICAgIFR5cGUyNiAmXG4gICAgICAgIFR5cGUyNyAmXG4gICAgICAgIFR5cGUyOCAmXG4gICAgICAgIFR5cGUyOSAmXG4gICAgICAgIFR5cGUzMCAmXG4gICAgICAgIFR5cGUzMSAmXG4gICAgICAgIFR5cGUzMiAmXG4gICAgICAgIFR5cGUzMyAmXG4gICAgICAgIFR5cGUzNCAmXG4gICAgICAgIFR5cGUzNSAmXG4gICAgICAgIFR5cGUzNiAmXG4gICAgICAgIFR5cGUzNyAmXG4gICAgICAgIFR5cGUzOCAmXG4gICAgICAgIFR5cGUzOSAmXG4gICAgICAgIFR5cGU0MCAmXG4gICAgICAgIFR5cGU0MSAmXG4gICAgICAgIFR5cGU0MiAmXG4gICAgICAgIFR5cGU0MyAmXG4gICAgICAgIFR5cGU0NCAmXG4gICAgICAgIFR5cGU0NSAmXG4gICAgICAgIFR5cGU0NiAmXG4gICAgICAgIFR5cGU0NyAmXG4gICAgICAgIFR5cGU0OCAmXG4gICAgICAgIFR5cGU1MCxcbiAgICAgIFR5cGU0OVxuICAgID4gJlxuICAgICAgVHlwZTQ5KVxuICB8IChXaXRob3V0PFxuICAgICAgVHlwZTEgJlxuICAgICAgICBUeXBlMiAmXG4gICAgICAgIFR5cGUzICZcbiAgICAgICAgVHlwZTQgJlxuICAgICAgICBUeXBlNSAmXG4gICAgICAgIFR5cGU2ICZcbiAgICAgICAgVHlwZTcgJlxuICAgICAgICBUeXBlOCAmXG4gICAgICAgIFR5cGU5ICZcbiAgICAgICAgVHlwZTEwICZcbiAgICAgICAgVHlwZTExICZcbiAgICAgICAgVHlwZTEyICZcbiAgICAgICAgVHlwZTEzICZcbiAgICAgICAgVHlwZTE0ICZcbiAgICAgICAgVHlwZTE1ICZcbiAgICAgICAgVHlwZTE2ICZcbiAgICAgICAgVHlwZTE3ICZcbiAgICAgICAgVHlwZTE4ICZcbiAgICAgICAgVHlwZTE5ICZcbiAgICAgICAgVHlwZTIwICZcbiAgICAgICAgVHlwZTIxICZcbiAgICAgICAgVHlwZTIyICZcbiAgICAgICAgVHlwZTIzICZcbiAgICAgICAgVHlwZTI0ICZcbiAgICAgICAgVHlwZTI1ICZcbiAgICAgICAgVHlwZTI2ICZcbiAgICAgICAgVHlwZTI3ICZcbiAgICAgICAgVHlwZTI4ICZcbiAgICAgICAgVHlwZTI5ICZcbiAgICAgICAgVHlwZTMwICZcbiAgICAgICAgVHlwZTMxICZcbiAgICAgICAgVHlwZTMyICZcbiAgICAgICAgVHlwZTMzICZcbiAgICAgICAgVHlwZTM0ICZcbiAgICAgICAgVHlwZTM1ICZcbiAgICAgICAgVHlwZTM2ICZcbiAgICAgICAgVHlwZTM3ICZcbiAgICAgICAgVHlwZTM4ICZcbiAgICAgICAgVHlwZTM5ICZcbiAgICAgICAgVHlwZTQwICZcbiAgICAgICAgVHlwZTQxICZcbiAgICAgICAgVHlwZTQyICZcbiAgICAgICAgVHlwZTQzICZcbiAgICAgICAgVHlwZTQ0ICZcbiAgICAgICAgVHlwZTQ1ICZcbiAgICAgICAgVHlwZTQ2ICZcbiAgICAgICAgVHlwZTQ3ICZcbiAgICAgICAgVHlwZTQ4ICZcbiAgICAgICAgVHlwZTQ5LFxuICAgICAgVHlwZTUwXG4gICAgPiAmXG4gICAgICBUeXBlNTApXG4+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWFyay1vcHRpb25hbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3B0aW9uYWxLZXlzIH0gZnJvbSBcIi4uL29wdGlvbmFsLWtleXNcIjtcbmltcG9ydCB7IFByZXR0aWZ5IH0gZnJvbSBcIi4uL3ByZXR0aWZ5XCI7XG5cbmV4cG9ydCB0eXBlIE1hcmtPcHRpb25hbDxUeXBlLCBLZXlzIGV4dGVuZHMga2V5b2YgVHlwZT4gPSBUeXBlIGV4dGVuZHMgVHlwZVxuICA/IFByZXR0aWZ5PFBhcnRpYWw8VHlwZT4gJiBSZXF1aXJlZDxPbWl0PFR5cGUsIEtleXMgfCBPcHRpb25hbEtleXM8VHlwZT4+Pj5cbiAgOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWFyay1yZWFkb25seS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhZG9ubHlLZXlzIH0gZnJvbSBcIi4uL3JlYWRvbmx5LWtleXNcIjtcbmltcG9ydCB7IFdyaXRhYmxlIH0gZnJvbSBcIi4uL3dyaXRhYmxlXCI7XG5pbXBvcnQgeyBQcmV0dGlmeSB9IGZyb20gXCIuLi9wcmV0dGlmeVwiO1xuXG5leHBvcnQgdHlwZSBNYXJrUmVhZG9ubHk8VHlwZSwgS2V5cyBleHRlbmRzIGtleW9mIFR5cGU+ID0gVHlwZSBleHRlbmRzIFR5cGVcbiAgPyBQcmV0dGlmeTxSZWFkb25seTxUeXBlPiAmIFdyaXRhYmxlPE9taXQ8VHlwZSwgS2V5cyB8IFJlYWRvbmx5S2V5czxUeXBlICYgb2JqZWN0Pj4+PlxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWFyay1yZXF1aXJlZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcblxuZXhwb3J0IHR5cGUgTWFya1JlcXVpcmVkPFR5cGUsIEtleXMgZXh0ZW5kcyBrZXlvZiBUeXBlPiA9IFR5cGUgZXh0ZW5kcyBUeXBlXG4gID8gUHJldHRpZnk8VHlwZSAmIFJlcXVpcmVkPE9taXQ8VHlwZSwgRXhjbHVkZTxrZXlvZiBUeXBlLCBLZXlzPj4+PlxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbWFyay13cml0YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV3JpdGFibGUgfSBmcm9tIFwiLi4vd3JpdGFibGVcIjtcbmltcG9ydCB7IFdyaXRhYmxlS2V5cyB9IGZyb20gXCIuLi93cml0YWJsZS1rZXlzXCI7XG5pbXBvcnQgeyBQcmV0dGlmeSB9IGZyb20gXCIuLi9wcmV0dGlmeVwiO1xuXG5leHBvcnQgdHlwZSBNYXJrV3JpdGFibGU8VHlwZSwgS2V5cyBleHRlbmRzIGtleW9mIFR5cGU+ID0gVHlwZSBleHRlbmRzIFR5cGVcbiAgPyBQcmV0dGlmeTxSZWFkb25seTxUeXBlPiAmIFdyaXRhYmxlPE9taXQ8VHlwZSwgRXhjbHVkZTxrZXlvZiBUeXBlLCBXcml0YWJsZUtleXM8VHlwZSAmIG9iamVjdD4gfCBLZXlzPj4+PlxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYnVpbGRhYmxlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWVwUGFydGlhbCB9IGZyb20gXCIuLi9kZWVwLXBhcnRpYWxcIjtcbmltcG9ydCB7IERlZXBXcml0YWJsZSB9IGZyb20gXCIuLi9kZWVwLXdyaXRhYmxlXCI7XG5cbmV4cG9ydCB0eXBlIEJ1aWxkYWJsZTxUeXBlPiA9IERlZXBQYXJ0aWFsPERlZXBXcml0YWJsZTxUeXBlPj47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1tYXJrLW9wdGlvbmFsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIYXNQYXJzYWJsZVBhdGggfSBmcm9tIFwiLi4vaGFzLXBhcnNhYmxlLXBhdGhcIjtcbmltcG9ydCB7IE1hcmtPcHRpb25hbCB9IGZyb20gXCIuLi9tYXJrLW9wdGlvbmFsXCI7XG5pbXBvcnQgeyBQYXRocyB9IGZyb20gXCIuLi9wYXRoc1wiO1xuaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcbmltcG9ydCB7IFVuaW9uVG9UdXBsZSB9IGZyb20gXCIuLi91bmlvbi10by10dXBsZVwiO1xuXG50eXBlIFJlY3Vyc2l2ZURlZXBNYXJrT3B0aW9uYWxTaW5nbGVQYXRoPFR5cGUsIEtleVBhdGg+ID0gVHlwZSBleHRlbmRzIG9iamVjdFxuICA/IEtleVBhdGggZXh0ZW5kcyBgJHtpbmZlciBQcm9wZXJ0eUtleX0uJHtpbmZlciBSZXN0S2V5UGF0aH1gXG4gICAgPyB7XG4gICAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZV06IEtleSBleHRlbmRzIFByb3BlcnR5S2V5XG4gICAgICAgICAgPyBQcmV0dGlmeTxSZWN1cnNpdmVEZWVwTWFya09wdGlvbmFsU2luZ2xlUGF0aDxUeXBlW0tleV0sIFJlc3RLZXlQYXRoPj5cbiAgICAgICAgICA6IFR5cGVbS2V5XTtcbiAgICAgIH1cbiAgICA6IFByZXR0aWZ5PE1hcmtPcHRpb25hbDxUeXBlLCBLZXlQYXRoICYga2V5b2YgVHlwZT4+XG4gIDogVHlwZTtcblxudHlwZSBSZWN1cnNpdmVEZWVwTWFya09wdGlvbmFsPEFjY3VtdWxhdG9yLCBLZXlQYXRocyBleHRlbmRzIHN0cmluZ1tdPiA9IEtleVBhdGhzIGV4dGVuZHMgW1xuICBpbmZlciBLZXlQYXRoLFxuICAuLi5pbmZlciBSZXN0S2V5UGF0aHMsXG5dXG4gID8gUmVzdEtleVBhdGhzIGV4dGVuZHMgc3RyaW5nW11cbiAgICA/IC8vIEtlZXAgYWxsIHRoZSBjaGFuZ2VzIGluIGBBY2N1bXVsYXRvcmBcbiAgICAgIFJlY3Vyc2l2ZURlZXBNYXJrT3B0aW9uYWw8UmVjdXJzaXZlRGVlcE1hcmtPcHRpb25hbFNpbmdsZVBhdGg8QWNjdW11bGF0b3IsIEtleVBhdGg+LCBSZXN0S2V5UGF0aHM+XG4gICAgOiBuZXZlclxuICA6IEFjY3VtdWxhdG9yO1xuXG5leHBvcnQgdHlwZSBEZWVwTWFya09wdGlvbmFsPFR5cGUsIEtleVBhdGhVbmlvbiBleHRlbmRzIFBhdGhzPFR5cGU+PiA9IEhhc1BhcnNhYmxlUGF0aDxUeXBlPiBleHRlbmRzIGZhbHNlXG4gID8gVHlwZVxuICA6IFJlY3Vyc2l2ZURlZXBNYXJrT3B0aW9uYWw8VHlwZSwgVW5pb25Ub1R1cGxlPEtleVBhdGhVbmlvbj4+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1tYXJrLXJlcXVpcmVkL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIYXNQYXJzYWJsZVBhdGggfSBmcm9tIFwiLi4vaGFzLXBhcnNhYmxlLXBhdGhcIjtcbmltcG9ydCB7IE1hcmtSZXF1aXJlZCB9IGZyb20gXCIuLi9tYXJrLXJlcXVpcmVkXCI7XG5pbXBvcnQgeyBQYXRocyB9IGZyb20gXCIuLi9wYXRoc1wiO1xuaW1wb3J0IHsgUHJldHRpZnkgfSBmcm9tIFwiLi4vcHJldHRpZnlcIjtcbmltcG9ydCB7IFVuaW9uVG9UdXBsZSB9IGZyb20gXCIuLi91bmlvbi10by10dXBsZVwiO1xuXG50eXBlIFJlY3Vyc2l2ZURlZXBNYXJrUmVxdWlyZWRTaW5nbGVQYXRoPFR5cGUsIEtleVBhdGg+ID0gVHlwZSBleHRlbmRzIG9iamVjdFxuICA/IEtleVBhdGggZXh0ZW5kcyBgJHtpbmZlciBQcm9wZXJ0eUtleX0uJHtpbmZlciBSZXN0S2V5UGF0aH1gXG4gICAgPyB7XG4gICAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZV06IEtleSBleHRlbmRzIFByb3BlcnR5S2V5XG4gICAgICAgICAgPyBQcmV0dGlmeTxSZWN1cnNpdmVEZWVwTWFya1JlcXVpcmVkU2luZ2xlUGF0aDxUeXBlW0tleV0sIFJlc3RLZXlQYXRoPj5cbiAgICAgICAgICA6IFR5cGVbS2V5XTtcbiAgICAgIH1cbiAgICA6IFByZXR0aWZ5PE1hcmtSZXF1aXJlZDxUeXBlLCBLZXlQYXRoICYga2V5b2YgVHlwZT4+XG4gIDogVHlwZTtcblxudHlwZSBSZWN1cnNpdmVEZWVwTWFya1JlcXVpcmVkPEFjY3VtdWxhdG9yLCBLZXlQYXRocyBleHRlbmRzIHN0cmluZ1tdPiA9IEtleVBhdGhzIGV4dGVuZHMgW1xuICBpbmZlciBLZXlQYXRoLFxuICAuLi5pbmZlciBSZXN0S2V5UGF0aHMsXG5dXG4gID8gUmVzdEtleVBhdGhzIGV4dGVuZHMgc3RyaW5nW11cbiAgICA/IC8vIEtlZXAgYWxsIHRoZSBjaGFuZ2VzIGluIGBBY2N1bXVsYXRvcmBcbiAgICAgIFJlY3Vyc2l2ZURlZXBNYXJrUmVxdWlyZWQ8UmVjdXJzaXZlRGVlcE1hcmtSZXF1aXJlZFNpbmdsZVBhdGg8QWNjdW11bGF0b3IsIEtleVBhdGg+LCBSZXN0S2V5UGF0aHM+XG4gICAgOiBuZXZlclxuICA6IEFjY3VtdWxhdG9yO1xuXG5leHBvcnQgdHlwZSBEZWVwTWFya1JlcXVpcmVkPFR5cGUsIEtleVBhdGhVbmlvbiBleHRlbmRzIFBhdGhzPFR5cGU+PiA9IEhhc1BhcnNhYmxlUGF0aDxUeXBlPiBleHRlbmRzIGZhbHNlXG4gID8gVHlwZVxuICA6IFJlY3Vyc2l2ZURlZXBNYXJrUmVxdWlyZWQ8VHlwZSwgVW5pb25Ub1R1cGxlPEtleVBhdGhVbmlvbj4+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1ub24tbnVsbGFibGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJ1aWx0aW4gfSBmcm9tIFwiLi4vYnVpbHQtaW5cIjtcblxuZXhwb3J0IHR5cGUgRGVlcE5vbk51bGxhYmxlPFR5cGU+ID0gVHlwZSBleHRlbmRzIEJ1aWx0aW5cbiAgPyBOb25OdWxsYWJsZTxUeXBlPlxuICA6IFR5cGUgZXh0ZW5kcyBNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IE1hcDxEZWVwTm9uTnVsbGFibGU8S2V5cz4sIERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seU1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gUmVhZG9ubHlNYXA8RGVlcE5vbk51bGxhYmxlPEtleXM+LCBEZWVwTm9uTnVsbGFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgV2Vha01hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gV2Vha01hcDxEZWVwTm9uTnVsbGFibGU8S2V5cz4sIERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFNldDxEZWVwTm9uTnVsbGFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5U2V0PERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBXZWFrU2V0PERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBQcm9taXNlPGluZmVyIFZhbHVlcz5cbiAgPyBQcm9taXNlPERlZXBOb25OdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyB7fVxuICA/IHsgW0tleSBpbiBrZXlvZiBUeXBlXTogRGVlcE5vbk51bGxhYmxlPFR5cGVbS2V5XT4gfVxuICA6IE5vbk51bGxhYmxlPFR5cGU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1udWxsYWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuaW1wb3J0IHsgSXNUdXBsZSB9IGZyb20gXCIuLi9pcy10dXBsZVwiO1xuXG5leHBvcnQgdHlwZSBEZWVwTnVsbGFibGU8VHlwZT4gPSBUeXBlIGV4dGVuZHMgQnVpbHRpblxuICA/IFR5cGUgfCBudWxsXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gTWFwPERlZXBOdWxsYWJsZTxLZXlzPiwgRGVlcE51bGxhYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBSZWFkb25seU1hcDxEZWVwTnVsbGFibGU8S2V5cz4sIERlZXBOdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrTWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyAvLyBUT0RPOiByZXBsYWNlIGl0IHdpdGggV2Vha0tleSAoaW50cm9kdWNlZCBhdCBUeXBlU2NyaXB0QDUuMilcbiAgICAvLyBXZWFrTWFwIGtleSBoYXMgdG8gc2F0aXNmeSBXZWFrS2V5IHdoaWNoIGlzIG9iamVjdCBhdCB0aGUgbW9tZW50XG4gICAgRGVlcE51bGxhYmxlPEtleXM+IGV4dGVuZHMgb2JqZWN0XG4gICAgPyBXZWFrTWFwPERlZXBOdWxsYWJsZTxLZXlzPiwgRGVlcE51bGxhYmxlPFZhbHVlcz4+XG4gICAgOiBuZXZlclxuICA6IFR5cGUgZXh0ZW5kcyBTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFNldDxEZWVwTnVsbGFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5U2V0PERlZXBOdWxsYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrU2V0PGluZmVyIFZhbHVlcz5cbiAgPyAvLyBUT0RPOiByZXBsYWNlIGl0IHdpdGggV2Vha0tleSAoaW50cm9kdWNlZCBhdCBUeXBlU2NyaXB0QDUuMilcbiAgICAvLyBXZWFrU2V0IGtleSBoYXMgdG8gc2F0aXNmeSBXZWFrS2V5IHdoaWNoIGlzIG9iamVjdCBhdCB0aGUgbW9tZW50XG4gICAgRGVlcE51bGxhYmxlPFZhbHVlcz4gZXh0ZW5kcyBvYmplY3RcbiAgICA/IFdlYWtTZXQ8RGVlcE51bGxhYmxlPFZhbHVlcz4+XG4gICAgOiBuZXZlclxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seUFycmF5PGluZmVyIFZhbHVlcz5cbiAgPyBUeXBlIGV4dGVuZHMgSXNUdXBsZTxUeXBlPlxuICAgID8geyBbS2V5IGluIGtleW9mIFR5cGVdOiBEZWVwTnVsbGFibGU8VHlwZVtLZXldPiB8IG51bGwgfVxuICAgIDogVHlwZSBleHRlbmRzIEFycmF5PFZhbHVlcz5cbiAgICA/IEFycmF5PERlZXBOdWxsYWJsZTxWYWx1ZXM+PlxuICAgIDogUmVhZG9ubHlBcnJheTxEZWVwTnVsbGFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBWYWx1ZT5cbiAgPyBQcm9taXNlPERlZXBOdWxsYWJsZTxWYWx1ZT4+XG4gIDogVHlwZSBleHRlbmRzIHt9XG4gID8geyBbS2V5IGluIGtleW9mIFR5cGVdOiBEZWVwTnVsbGFibGU8VHlwZVtLZXldPiB9XG4gIDogVHlwZSB8IG51bGw7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1vbWl0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbnlSZWNvcmQgfSBmcm9tIFwiLi4vYW55LXJlY29yZFwiO1xuaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuXG5leHBvcnQgdHlwZSBEZWVwT21pdDxUeXBlLCBGaWx0ZXI+ID0gVHlwZSBleHRlbmRzIEJ1aWx0aW5cbiAgPyBUeXBlXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gRmlsdGVyIGV4dGVuZHMgTWFwPEtleXMsIGluZmVyIEZpbHRlclZhbHVlcz5cbiAgICA/IE1hcDxLZXlzLCBEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBSZWFkb25seU1hcDxLZXlzLCBpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBSZWFkb25seU1hcDxLZXlzLCBEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFdlYWtNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IEZpbHRlciBleHRlbmRzIFdlYWtNYXA8S2V5cywgaW5mZXIgRmlsdGVyVmFsdWVzPlxuICAgID8gV2Vha01hcDxLZXlzLCBEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFNldDxpbmZlciBWYWx1ZXM+XG4gID8gRmlsdGVyIGV4dGVuZHMgU2V0PGluZmVyIEZpbHRlclZhbHVlcz5cbiAgICA/IFNldDxEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5U2V0PGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBSZWFkb25seVNldDxEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IEZpbHRlciBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgRmlsdGVyVmFsdWVzPlxuICAgID8gV2Vha1NldDxEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIEFycmF5PGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBBcnJheTxpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBBcnJheTxEZWVwT21pdDxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gRmlsdGVyIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBGaWx0ZXJWYWx1ZT5cbiAgICA/IFByb21pc2U8RGVlcE9taXQ8VmFsdWUsIEZpbHRlclZhbHVlPj5cbiAgICA6IFR5cGVcbiAgOiBGaWx0ZXIgZXh0ZW5kcyBBbnlSZWNvcmRcbiAgPyB7XG4gICAgICBbS2V5IGluIGtleW9mIFR5cGUgYXMgS2V5IGV4dGVuZHMga2V5b2YgRmlsdGVyXG4gICAgICAgID8gRmlsdGVyW0tleV0gZXh0ZW5kcyB0cnVlXG4gICAgICAgICAgPyBuZXZlclxuICAgICAgICAgIDogS2V5XG4gICAgICAgIDogS2V5XTogS2V5IGV4dGVuZHMga2V5b2YgRmlsdGVyID8gRGVlcE9taXQ8VHlwZVtLZXldLCBGaWx0ZXJbS2V5XT4gOiBUeXBlW0tleV07XG4gICAgfVxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1wYXJ0aWFsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWlsdGluIH0gZnJvbSBcIi4uL2J1aWx0LWluXCI7XG5pbXBvcnQgeyBJc1R1cGxlIH0gZnJvbSBcIi4uL2lzLXR1cGxlXCI7XG5pbXBvcnQgeyBJc1Vua25vd24gfSBmcm9tIFwiLi4vaXMtdW5rbm93blwiO1xuXG5leHBvcnQgdHlwZSBEZWVwUGFydGlhbDxUeXBlPiA9IFR5cGUgZXh0ZW5kcyBFeGNsdWRlPEJ1aWx0aW4sIEVycm9yPlxuICA/IFR5cGVcbiAgOiBUeXBlIGV4dGVuZHMgTWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBNYXA8RGVlcFBhcnRpYWw8S2V5cz4sIERlZXBQYXJ0aWFsPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBSZWFkb25seU1hcDxEZWVwUGFydGlhbDxLZXlzPiwgRGVlcFBhcnRpYWw8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgV2Vha01hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gV2Vha01hcDxEZWVwUGFydGlhbDxLZXlzPiwgRGVlcFBhcnRpYWw8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBTZXQ8RGVlcFBhcnRpYWw8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5U2V0PERlZXBQYXJ0aWFsPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFdlYWtTZXQ8RGVlcFBhcnRpYWw8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxpbmZlciBWYWx1ZXM+XG4gID8gVHlwZSBleHRlbmRzIElzVHVwbGU8VHlwZT5cbiAgICA/IHsgW0tleSBpbiBrZXlvZiBUeXBlXT86IERlZXBQYXJ0aWFsPFR5cGVbS2V5XT4gfVxuICAgIDogVHlwZSBleHRlbmRzIEFycmF5PFZhbHVlcz5cbiAgICA/IEFycmF5PERlZXBQYXJ0aWFsPFZhbHVlcz4gfCB1bmRlZmluZWQ+XG4gICAgOiBSZWFkb25seUFycmF5PERlZXBQYXJ0aWFsPFZhbHVlcz4gfCB1bmRlZmluZWQ+XG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gUHJvbWlzZTxEZWVwUGFydGlhbDxWYWx1ZT4+XG4gIDogVHlwZSBleHRlbmRzIHt9XG4gID8geyBbS2V5IGluIGtleW9mIFR5cGVdPzogRGVlcFBhcnRpYWw8VHlwZVtLZXldPiB9XG4gIDogSXNVbmtub3duPFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICA/IHVua25vd25cbiAgOiBQYXJ0aWFsPFR5cGU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1waWNrL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbnlSZWNvcmQgfSBmcm9tIFwiLi4vYW55LXJlY29yZFwiO1xuaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuXG5leHBvcnQgdHlwZSBEZWVwUGljazxUeXBlLCBGaWx0ZXI+ID0gVHlwZSBleHRlbmRzIEJ1aWx0aW5cbiAgPyBUeXBlXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gRmlsdGVyIGV4dGVuZHMgTWFwPEtleXMsIGluZmVyIEZpbHRlclZhbHVlcz5cbiAgICA/IE1hcDxLZXlzLCBEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBSZWFkb25seU1hcDxLZXlzLCBpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBSZWFkb25seU1hcDxLZXlzLCBEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFdlYWtNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IEZpbHRlciBleHRlbmRzIFdlYWtNYXA8S2V5cywgaW5mZXIgRmlsdGVyVmFsdWVzPlxuICAgID8gV2Vha01hcDxLZXlzLCBEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFNldDxpbmZlciBWYWx1ZXM+XG4gID8gRmlsdGVyIGV4dGVuZHMgU2V0PGluZmVyIEZpbHRlclZhbHVlcz5cbiAgICA/IFNldDxEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5U2V0PGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBSZWFkb25seVNldDxEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IEZpbHRlciBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgRmlsdGVyVmFsdWVzPlxuICAgID8gV2Vha1NldDxEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIEFycmF5PGluZmVyIFZhbHVlcz5cbiAgPyBGaWx0ZXIgZXh0ZW5kcyBBcnJheTxpbmZlciBGaWx0ZXJWYWx1ZXM+XG4gICAgPyBBcnJheTxEZWVwUGljazxWYWx1ZXMsIEZpbHRlclZhbHVlcz4+XG4gICAgOiBUeXBlXG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gRmlsdGVyIGV4dGVuZHMgUHJvbWlzZTxpbmZlciBGaWx0ZXJWYWx1ZT5cbiAgICA/IFByb21pc2U8RGVlcFBpY2s8VmFsdWUsIEZpbHRlclZhbHVlPj5cbiAgICA6IFR5cGVcbiAgOiBGaWx0ZXIgZXh0ZW5kcyBBbnlSZWNvcmRcbiAgPyB7XG4gICAgICAvLyBpdGVyYXRlIG92ZXIga2V5cyBvZiBUeXBlLCB3aGljaCBrZWVwcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQga2V5czogb3B0aW9uYWwsIHJlcXVpcmVkIG9yIHJlYWRvbmx5XG4gICAgICBbS2V5IGluIGtleW9mIFR5cGUgYXMgS2V5IGV4dGVuZHMga2V5b2YgRmlsdGVyID8gS2V5IDogbmV2ZXJdOiBGaWx0ZXJbS2V5ICYga2V5b2YgRmlsdGVyXSBleHRlbmRzIHRydWVcbiAgICAgICAgPyBUeXBlW0tleV1cbiAgICAgICAgOiBLZXkgZXh0ZW5kcyBrZXlvZiBGaWx0ZXJcbiAgICAgICAgPyBEZWVwUGljazxUeXBlW0tleV0sIEZpbHRlcltLZXldPlxuICAgICAgICA6IG5ldmVyO1xuICAgIH1cbiAgOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1yZWFkb25seS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55QXJyYXkgfSBmcm9tIFwiLi4vYW55LWFycmF5XCI7XG5pbXBvcnQgeyBCdWlsdGluIH0gZnJvbSBcIi4uL2J1aWx0LWluXCI7XG5pbXBvcnQgeyBJc05ldmVyIH0gZnJvbSBcIi4uL2lzLW5ldmVyXCI7XG5pbXBvcnQgeyBJc1R1cGxlIH0gZnJvbSBcIi4uL2lzLXR1cGxlXCI7XG5pbXBvcnQgeyBJc1Vua25vd24gfSBmcm9tIFwiLi4vaXMtdW5rbm93blwiO1xuXG5leHBvcnQgdHlwZSBEZWVwUmVhZG9ubHk8VHlwZT4gPSBUeXBlIGV4dGVuZHMgRXhjbHVkZTxCdWlsdGluLCBFcnJvcj5cbiAgPyBUeXBlXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gUmVhZG9ubHlNYXA8RGVlcFJlYWRvbmx5PEtleXM+LCBEZWVwUmVhZG9ubHk8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5TWFwPERlZXBSZWFkb25seTxLZXlzPiwgRGVlcFJlYWRvbmx5PFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IFdlYWtNYXA8RGVlcFJlYWRvbmx5PEtleXM+LCBEZWVwUmVhZG9ubHk8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBSZWFkb25seVNldDxEZWVwUmVhZG9ubHk8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5U2V0PERlZXBSZWFkb25seTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBXZWFrU2V0PERlZXBSZWFkb25seTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBQcm9taXNlPGluZmVyIFZhbHVlPlxuICA/IFByb21pc2U8RGVlcFJlYWRvbmx5PFZhbHVlPj5cbiAgOiBUeXBlIGV4dGVuZHMgQW55QXJyYXk8aW5mZXIgVmFsdWVzPlxuICA/IElzTmV2ZXI8SXNUdXBsZTxUeXBlPj4gZXh0ZW5kcyBmYWxzZVxuICAgID8geyByZWFkb25seSBbS2V5IGluIGtleW9mIFR5cGVdOiBEZWVwUmVhZG9ubHk8VHlwZVtLZXldPiB9XG4gICAgOiBSZWFkb25seUFycmF5PERlZXBSZWFkb25seTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyB7fVxuICA/IHsgcmVhZG9ubHkgW0tleSBpbiBrZXlvZiBUeXBlXTogRGVlcFJlYWRvbmx5PFR5cGVbS2V5XT4gfVxuICA6IElzVW5rbm93bjxUeXBlPiBleHRlbmRzIHRydWVcbiAgPyB1bmtub3duXG4gIDogUmVhZG9ubHk8VHlwZT47XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1yZXF1aXJlZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuaW1wb3J0IHR5cGUgeyBJc05ldmVyIH0gZnJvbSBcIi4uL2lzLW5ldmVyXCI7XG5pbXBvcnQgeyBJc1R1cGxlIH0gZnJvbSBcIi4uL2lzLXR1cGxlXCI7XG5cbmV4cG9ydCB0eXBlIERlZXBSZXF1aXJlZDxUeXBlPiA9IFR5cGUgZXh0ZW5kcyBFcnJvclxuICA/IFJlcXVpcmVkPFR5cGU+XG4gIDogVHlwZSBleHRlbmRzIEJ1aWx0aW5cbiAgPyBUeXBlXG4gIDogVHlwZSBleHRlbmRzIE1hcDxpbmZlciBLZXlzLCBpbmZlciBWYWx1ZXM+XG4gID8gTWFwPERlZXBSZXF1aXJlZDxLZXlzPiwgRGVlcFJlcXVpcmVkPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBSZWFkb25seU1hcDxEZWVwUmVxdWlyZWQ8S2V5cz4sIERlZXBSZXF1aXJlZDxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrTWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBXZWFrTWFwPERlZXBSZXF1aXJlZDxLZXlzPiwgRGVlcFJlcXVpcmVkPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFNldDxpbmZlciBWYWx1ZXM+XG4gID8gU2V0PERlZXBSZXF1aXJlZDxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBWYWx1ZXM+XG4gID8gUmVhZG9ubHlTZXQ8RGVlcFJlcXVpcmVkPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFdlYWtTZXQ8RGVlcFJlcXVpcmVkPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gUHJvbWlzZTxEZWVwUmVxdWlyZWQ8VmFsdWU+PlxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seUFycmF5PGluZmVyIFZhbHVlcz5cbiAgPyBJc05ldmVyPElzVHVwbGU8VHlwZT4+IGV4dGVuZHMgZmFsc2VcbiAgICA/IHsgW0tleSBpbiBrZXlvZiBUeXBlXS0/OiBEZWVwUmVxdWlyZWQ8VHlwZVtLZXldPiB9XG4gICAgOiBUeXBlIGV4dGVuZHMgQXJyYXk8VmFsdWVzPlxuICAgID8gQXJyYXk8RXhjbHVkZTxEZWVwUmVxdWlyZWQ8VmFsdWVzPiwgdW5kZWZpbmVkPj5cbiAgICA6IFJlYWRvbmx5QXJyYXk8RXhjbHVkZTxEZWVwUmVxdWlyZWQ8VmFsdWVzPiwgdW5kZWZpbmVkPj5cbiAgOiBUeXBlIGV4dGVuZHMge31cbiAgPyB7IFtLZXkgaW4ga2V5b2YgVHlwZV0tPzogRGVlcFJlcXVpcmVkPFR5cGVbS2V5XT4gfVxuICA6IFJlcXVpcmVkPFR5cGU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC11bmRlZmluYWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuaW1wb3J0IHsgSXNUdXBsZSB9IGZyb20gXCIuLi9pcy10dXBsZVwiO1xuXG5leHBvcnQgdHlwZSBEZWVwVW5kZWZpbmFibGU8VHlwZT4gPSBUeXBlIGV4dGVuZHMgQnVpbHRpblxuICA/IFR5cGUgfCB1bmRlZmluZWRcbiAgOiBUeXBlIGV4dGVuZHMgTWFwPGluZmVyIEtleXMsIGluZmVyIFZhbHVlcz5cbiAgPyBNYXA8RGVlcFVuZGVmaW5hYmxlPEtleXM+LCBEZWVwVW5kZWZpbmFibGU8VmFsdWVzPj5cbiAgOiBUeXBlIGV4dGVuZHMgUmVhZG9ubHlNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IFJlYWRvbmx5TWFwPERlZXBVbmRlZmluYWJsZTxLZXlzPiwgRGVlcFVuZGVmaW5hYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtNYXA8aW5mZXIgS2V5cywgaW5mZXIgVmFsdWVzPlxuICA/IC8vIFRPRE86IHJlcGxhY2UgaXQgd2l0aCBXZWFrS2V5IChpbnRyb2R1Y2VkIGF0IFR5cGVTY3JpcHRANS4yKVxuICAgIC8vIFdlYWtNYXAga2V5IGhhcyB0byBzYXRpc2Z5IFdlYWtLZXkgd2hpY2ggaXMgb2JqZWN0IGF0IHRoZSBtb21lbnRcbiAgICBEZWVwVW5kZWZpbmFibGU8S2V5cz4gZXh0ZW5kcyBvYmplY3RcbiAgICA/IFdlYWtNYXA8RGVlcFVuZGVmaW5hYmxlPEtleXM+LCBEZWVwVW5kZWZpbmFibGU8VmFsdWVzPj5cbiAgICA6IG5ldmVyXG4gIDogVHlwZSBleHRlbmRzIFNldDxpbmZlciBWYWx1ZXM+XG4gID8gU2V0PERlZXBVbmRlZmluYWJsZTxWYWx1ZXM+PlxuICA6IFR5cGUgZXh0ZW5kcyBSZWFkb25seVNldDxpbmZlciBWYWx1ZXM+XG4gID8gUmVhZG9ubHlTZXQ8RGVlcFVuZGVmaW5hYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IC8vIFRPRE86IHJlcGxhY2UgaXQgd2l0aCBXZWFrS2V5IChpbnRyb2R1Y2VkIGF0IFR5cGVTY3JpcHRANS4yKVxuICAgIC8vIFdlYWtTZXQga2V5IGhhcyB0byBzYXRpc2Z5IFdlYWtLZXkgd2hpY2ggaXMgb2JqZWN0IGF0IHRoZSBtb21lbnRcbiAgICBEZWVwVW5kZWZpbmFibGU8VmFsdWVzPiBleHRlbmRzIG9iamVjdFxuICAgID8gV2Vha1NldDxEZWVwVW5kZWZpbmFibGU8VmFsdWVzPj5cbiAgICA6IG5ldmVyXG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5QXJyYXk8aW5mZXIgVmFsdWVzPlxuICA/IFR5cGUgZXh0ZW5kcyBJc1R1cGxlPFR5cGU+XG4gICAgPyB7IFtLZXkgaW4ga2V5b2YgVHlwZV06IERlZXBVbmRlZmluYWJsZTxUeXBlW0tleV0+IHwgdW5kZWZpbmVkIH1cbiAgICA6IFR5cGUgZXh0ZW5kcyBBcnJheTxWYWx1ZXM+XG4gICAgPyBBcnJheTxEZWVwVW5kZWZpbmFibGU8VmFsdWVzPj5cbiAgICA6IFJlYWRvbmx5QXJyYXk8RGVlcFVuZGVmaW5hYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gUHJvbWlzZTxEZWVwVW5kZWZpbmFibGU8VmFsdWU+PlxuICA6IFR5cGUgZXh0ZW5kcyB7fVxuICA/IHsgW0tleSBpbiBrZXlvZiBUeXBlXTogRGVlcFVuZGVmaW5hYmxlPFR5cGVbS2V5XT4gfVxuICA6IFR5cGUgfCB1bmRlZmluZWQ7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC13cml0YWJsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVpbHRpbiB9IGZyb20gXCIuLi9idWlsdC1pblwiO1xuaW1wb3J0IHsgSXNVbmtub3duIH0gZnJvbSBcIi4uL2lzLXVua25vd25cIjtcblxuZXhwb3J0IHR5cGUgRGVlcFdyaXRhYmxlPFR5cGU+ID0gVHlwZSBleHRlbmRzIEV4Y2x1ZGU8QnVpbHRpbiwgRXJyb3I+XG4gID8gVHlwZVxuICA6IFR5cGUgZXh0ZW5kcyBNYXA8aW5mZXIgS2V5LCBpbmZlciBWYWx1ZT5cbiAgPyBNYXA8RGVlcFdyaXRhYmxlPEtleT4sIERlZXBXcml0YWJsZTxWYWx1ZT4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5TWFwPGluZmVyIEtleSwgaW5mZXIgVmFsdWU+XG4gID8gTWFwPERlZXBXcml0YWJsZTxLZXk+LCBEZWVwV3JpdGFibGU8VmFsdWU+PlxuICA6IFR5cGUgZXh0ZW5kcyBXZWFrTWFwPGluZmVyIEtleSwgaW5mZXIgVmFsdWU+XG4gID8gV2Vha01hcDxEZWVwV3JpdGFibGU8S2V5PiwgRGVlcFdyaXRhYmxlPFZhbHVlPj5cbiAgOiBUeXBlIGV4dGVuZHMgU2V0PGluZmVyIFZhbHVlcz5cbiAgPyBTZXQ8RGVlcFdyaXRhYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFJlYWRvbmx5U2V0PGluZmVyIFZhbHVlcz5cbiAgPyBTZXQ8RGVlcFdyaXRhYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFdlYWtTZXQ8aW5mZXIgVmFsdWVzPlxuICA/IFdlYWtTZXQ8RGVlcFdyaXRhYmxlPFZhbHVlcz4+XG4gIDogVHlwZSBleHRlbmRzIFByb21pc2U8aW5mZXIgVmFsdWU+XG4gID8gUHJvbWlzZTxEZWVwV3JpdGFibGU8VmFsdWU+PlxuICA6IFR5cGUgZXh0ZW5kcyB7fVxuICA/IHsgLXJlYWRvbmx5IFtLZXkgaW4ga2V5b2YgVHlwZV06IERlZXBXcml0YWJsZTxUeXBlW0tleV0+IH1cbiAgOiBJc1Vua25vd248VHlwZT4gZXh0ZW5kcyB0cnVlXG4gID8gdW5rbm93blxuICA6IFR5cGU7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LWRlZXAtb21pdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVlcE1vZGlmeSB9IGZyb20gXCIuLi9kZWVwLW1vZGlmeVwiO1xuaW1wb3J0IHsgRGVlcE9taXQgfSBmcm9tIFwiLi4vZGVlcC1vbWl0XCI7XG5cbmV4cG9ydCB0eXBlIFN0cmljdERlZXBPbWl0PFR5cGUsIEZpbHRlciBleHRlbmRzIERlZXBNb2RpZnk8VHlwZT4+ID0gRGVlcE9taXQ8VHlwZSwgRmlsdGVyPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvc3RyaWN0LWRlZXAtcGljay9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVlcE1vZGlmeSB9IGZyb20gXCIuLi9kZWVwLW1vZGlmeVwiO1xuaW1wb3J0IHsgRGVlcFBpY2sgfSBmcm9tIFwiLi4vZGVlcC1waWNrXCI7XG5cbmV4cG9ydCB0eXBlIFN0cmljdERlZXBQaWNrPFR5cGUsIEZpbHRlciBleHRlbmRzIERlZXBNb2RpZnk8VHlwZT4+ID0gRGVlcFBpY2s8VHlwZSwgRmlsdGVyPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvb3B0aW9uYWwta2V5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgT3B0aW9uYWxLZXlzPFR5cGU+ID0gVHlwZSBleHRlbmRzIG9iamVjdFxuICA/IGtleW9mIHtcbiAgICAgIFtLZXkgaW4ga2V5b2YgVHlwZSBhcyBUeXBlIGV4dGVuZHMgUmVxdWlyZWQ8UGljazxUeXBlLCBLZXk+PiA/IG5ldmVyIDogS2V5XTogbmV2ZXI7XG4gICAgfVxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcGljay1rZXlzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaWNrUHJvcGVydGllcyB9IGZyb20gXCIuLi9waWNrLXByb3BlcnRpZXNcIjtcblxuZXhwb3J0IHR5cGUgUGlja0tleXM8VHlwZSwgVmFsdWU+ID0ga2V5b2YgUGlja1Byb3BlcnRpZXM8VHlwZSwgVmFsdWU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVhZG9ubHkta2V5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSXNGdWxseVdyaXRhYmxlIH0gZnJvbSBcIi4uL2lzLWZ1bGx5LXdyaXRhYmxlXCI7XG5cbmV4cG9ydCB0eXBlIFJlYWRvbmx5S2V5czxUeXBlIGV4dGVuZHMgb2JqZWN0PiA9IFR5cGUgZXh0ZW5kcyB1bmtub3duXG4gID8ga2V5b2Yge1xuICAgICAgW0tleSBpbiBrZXlvZiBUeXBlIGFzIElzRnVsbHlXcml0YWJsZTxQaWNrPFR5cGUsIEtleT4+IGV4dGVuZHMgdHJ1ZSA/IG5ldmVyIDogS2V5XTogbmV2ZXI7XG4gICAgfVxuICA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVxdWlyZWQta2V5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3B0aW9uYWxLZXlzIH0gZnJvbSBcIi4uL29wdGlvbmFsLWtleXNcIjtcblxuZXhwb3J0IHR5cGUgUmVxdWlyZWRLZXlzPFR5cGU+ID0gVHlwZSBleHRlbmRzIHVua25vd24gPyBFeGNsdWRlPGtleW9mIFR5cGUsIE9wdGlvbmFsS2V5czxUeXBlPj4gOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvd3JpdGFibGUta2V5cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVhZG9ubHlLZXlzIH0gZnJvbSBcIi4uL3JlYWRvbmx5LWtleXNcIjtcblxuZXhwb3J0IHR5cGUgV3JpdGFibGVLZXlzPFR5cGUgZXh0ZW5kcyBvYmplY3Q+ID0gVHlwZSBleHRlbmRzIHVua25vd24gPyBFeGNsdWRlPGtleW9mIFR5cGUsIFJlYWRvbmx5S2V5czxUeXBlPj4gOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZXhhY3QvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFueVJlY29yZCB9IGZyb20gXCIuLi9hbnktcmVjb3JkXCI7XG5pbXBvcnQgeyBJc05ldmVyIH0gZnJvbSBcIi4uL2lzLW5ldmVyXCI7XG5cbnR5cGUgSXNVbmlvbjxUVW5pb24+ID0gVW5pb25Ub1R1cGxlPFRVbmlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAxID8gZmFsc2UgOiB0cnVlO1xuXG50eXBlIFVuaW9uVG9GdW5jdGlvbkluc2VydGlvbjxUVW5pb24+ID0gKFRVbmlvbiBleHRlbmRzIGFueSA/IChhcmc6ICgpID0+IFRVbmlvbikgPT4gYW55IDogbmV2ZXIpIGV4dGVuZHMgKFxuICBhcmc6IGluZmVyIFRQYXJhbSxcbikgPT4gYW55XG4gID8gVFBhcmFtXG4gIDogbmV2ZXI7XG5cbi8vIE5PVEU6IFdoZW4gcmVwbGFjaW5nIHRoZSB1dGlsaXR5IHR5cGUgd2l0aCBgVW5pb25Ub1R1cGxlYCBmcm9tIGAuLi91bmlvbi10by10dXBsZWAsXG4vLyBgaXNCQyhiY09yQmMzKWAgZmFpbHMgYmVjYXVzZSBgaXNCQ2AgYWxsb3dzIGBCQyB8IHtyZWFkb25seSBiOiAyO3JlYWRvbmx5IGM6IDM7fWAgYXMgcGFyYW1ldGVyPz8/XG50eXBlIFVuaW9uVG9UdXBsZTxUVW5pb24+ID0gVW5pb25Ub0Z1bmN0aW9uSW5zZXJ0aW9uPFRVbmlvbj4gZXh0ZW5kcyAoKSA9PiBpbmZlciBUUmV0dXJuVHlwZVxuICA/IFsuLi5VbmlvblRvVHVwbGU8RXhjbHVkZTxUVW5pb24sIFRSZXR1cm5UeXBlPj4sIFRSZXR1cm5UeXBlXVxuICA6IFtdO1xuXG50eXBlIEV4YWN0VW5pb25MZW5ndGg8VFZhbHVlLCBUU2hhcGU+ID0gVW5pb25Ub1R1cGxlPFRWYWx1ZT5bXCJsZW5ndGhcIl0gZXh0ZW5kcyBVbmlvblRvVHVwbGU8VFNoYXBlPltcImxlbmd0aFwiXVxuICA/IHRydWVcbiAgOiBmYWxzZTtcblxuLy8gTk9URTogYFhPUmAgY2Fubm90IGJlIHVzZWQgYXMgaXQncyBvbmx5IGhhbmR5IHdpdGggb2JqZWN0cywgbm90IGJvb2xlYW5zXG50eXBlIEJvb2xlYW5Yb3I8VCwgVT4gPSBUIGV4dGVuZHMgdHJ1ZSA/IChVIGV4dGVuZHMgdHJ1ZSA/IHRydWUgOiBmYWxzZSkgOiBVIGV4dGVuZHMgZmFsc2UgPyB0cnVlIDogZmFsc2U7XG5cbnR5cGUgQm9vbGVhbkFuZDxUVHVwbGU+ID0gVFR1cGxlIGV4dGVuZHMgW2luZmVyIEhlYWQsIC4uLmluZmVyIFJlc3RdXG4gID8gSGVhZCBleHRlbmRzIHRydWVcbiAgICA/IEJvb2xlYW5BbmQ8UmVzdD5cbiAgICA6IGZhbHNlXG4gIDogVFR1cGxlIGV4dGVuZHMgW11cbiAgPyB0cnVlXG4gIDogZmFsc2U7XG5cbnR5cGUgT2JqZWN0S2V5RXhhY3Q8VFZhbHVlLCBUU2hhcGU+ID0gQm9vbGVhbkFuZDxcbiAgW0lzTmV2ZXI8RXhjbHVkZTxrZXlvZiBUVmFsdWUsIGtleW9mIFRTaGFwZT4+LCBJc05ldmVyPEV4Y2x1ZGU8a2V5b2YgVFNoYXBlLCBrZXlvZiBUVmFsdWU+Pl1cbj47XG5cbnR5cGUgT2JqZWN0VmFsdWVEaWZmPFRWYWx1ZSwgVFNoYXBlPiA9IHtcbiAgW1RLZXkgaW4ga2V5b2YgVFZhbHVlXTogRXhjbHVkZTxUVmFsdWVbVEtleV0sIFRTaGFwZVtUS2V5ICYga2V5b2YgVFNoYXBlXT47XG59W2tleW9mIFRWYWx1ZV07XG5cbnR5cGUgT2JqZWN0VmFsdWVFeGFjdDxUVmFsdWUsIFRTaGFwZT4gPSBCb29sZWFuQW5kPFxuICBbSXNOZXZlcjxPYmplY3RWYWx1ZURpZmY8VFZhbHVlLCBUU2hhcGU+PiwgSXNOZXZlcjxPYmplY3RWYWx1ZURpZmY8VFNoYXBlLCBUVmFsdWU+Pl1cbj47XG5cbnR5cGUgT2JqZWN0RXhhY3Q8VFZhbHVlLCBUU2hhcGU+ID0gW1RWYWx1ZV0gZXh0ZW5kcyBbVFNoYXBlXVxuICA/IEJvb2xlYW5BbmQ8XG4gICAgICBbXG4gICAgICAgIEJvb2xlYW5Yb3I8SXNVbmlvbjxUVmFsdWU+LCBJc1VuaW9uPFRTaGFwZT4+LFxuICAgICAgICBFeGFjdFVuaW9uTGVuZ3RoPFRWYWx1ZSwgVFNoYXBlPixcbiAgICAgICAgT2JqZWN0S2V5RXhhY3Q8VFZhbHVlLCBUU2hhcGU+LFxuICAgICAgICBPYmplY3RWYWx1ZUV4YWN0PFRWYWx1ZSwgVFNoYXBlPixcbiAgICAgIF1cbiAgICA+IGV4dGVuZHMgdHJ1ZVxuICAgID8gVFZhbHVlXG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG50eXBlIElzQXJyYXk8VFZhbHVlPiA9IFtUVmFsdWVdIGV4dGVuZHMgW3JlYWRvbmx5IGFueVtdXSA/IHRydWUgOiBmYWxzZTtcblxudHlwZSBJc1JlYWRvbmx5PFRBcnJheT4gPSBSZWFkb25seTxUQXJyYXk+IGV4dGVuZHMgVEFycmF5ID8gdHJ1ZSA6IGZhbHNlO1xuXG50eXBlIFNhbWVMZW5ndGg8VFZhbHVlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10sIFRTaGFwZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdPiA9IElzTmV2ZXI8XG4gIFByaW1pdGl2ZUV4YWN0PFRWYWx1ZVtcImxlbmd0aFwiXSwgVFNoYXBlW1wibGVuZ3RoXCJdPlxuPiBleHRlbmRzIHRydWVcbiAgPyBmYWxzZVxuICA6IHRydWU7XG5cbnR5cGUgQXJyYXlFeGFjdDxUVmFsdWUgZXh0ZW5kcyByZWFkb25seSBhbnlbXSwgVFNoYXBlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10+ID0gQm9vbGVhbkFuZDxcbiAgW1xuICAgIC8vIGJvdGggYXJyYXlzXG4gICAgSXNBcnJheTxUVmFsdWU+LFxuICAgIElzQXJyYXk8VFNoYXBlPixcbiAgICAvLyBzYW1lIGxlbmd0aFxuICAgIFNhbWVMZW5ndGg8VFZhbHVlLCBUU2hhcGU+LFxuICAgIC8vIGJvdGggcmVhZG9ubHkgb3Igbm90XG4gICAgQm9vbGVhblhvcjxJc1JlYWRvbmx5PFRWYWx1ZT4sIElzUmVhZG9ubHk8VFNoYXBlPj4sXG4gIF1cbj4gZXh0ZW5kcyB0cnVlXG4gID8gW1RWYWx1ZSwgVFNoYXBlXSBleHRlbmRzIFtyZWFkb25seSAoaW5mZXIgVFZhbHVlRWxlbWVudClbXSwgcmVhZG9ubHkgKGluZmVyIFRTaGFwZUVsZW1lbnQpW11dXG4gICAgPyBFeGFjdDxUVmFsdWVFbGVtZW50LCBUU2hhcGVFbGVtZW50PiBleHRlbmRzIFRWYWx1ZUVsZW1lbnRcbiAgICAgID8gVFZhbHVlXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG4vLyBOT1RFOiBXaGVuIHJlcGxhY2luZyB0aGUgYm9keSB3aXRoIGBBcmVOb25EaXN0cmlidXRpdmVFcXVhbDxUVmFsdWUsIFRTaGFwZT4gZXh0ZW5kcyB0cnVlID8gVFZhbHVlIDogbmV2ZXJgLFxuLy8gYGlzQkNvckJDMyhiY09yQmMzKWAgZmFpbHMgYmVjYXVzZSBgYmNPckJjM2AgaXMgaW5mZXJyZWQgYXMgYEJDYD8/P1xudHlwZSBQcmltaXRpdmVFeGFjdDxUVmFsdWUsIFRTaGFwZT4gPSBbVFZhbHVlXSBleHRlbmRzIFtUU2hhcGVdID8gKFtUU2hhcGVdIGV4dGVuZHMgW1RWYWx1ZV0gPyBUVmFsdWUgOiBuZXZlcikgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgRXhhY3Q8VFZhbHVlLCBUU2hhcGU+ID0gW1RWYWx1ZV0gZXh0ZW5kcyBbcmVhZG9ubHkgYW55W11dXG4gID8gW1RTaGFwZV0gZXh0ZW5kcyBbcmVhZG9ubHkgYW55W11dXG4gICAgPyBBcnJheUV4YWN0PFRWYWx1ZSwgVFNoYXBlPlxuICAgIDogbmV2ZXJcbiAgOiBbVFZhbHVlXSBleHRlbmRzIFtBbnlSZWNvcmRdXG4gID8gT2JqZWN0RXhhY3Q8VFZhbHVlLCBUU2hhcGU+XG4gIDogUHJpbWl0aXZlRXhhY3Q8VFZhbHVlLCBUU2hhcGU+O1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaXMtYW55L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80OTkyNzUyMy9kaXNhbGxvdy1jYWxsLXdpdGgtYW55LzQ5OTI4MzYwIzQ5OTI4MzYwXG5leHBvcnQgdHlwZSBJc0FueTxUeXBlPiA9IDAgZXh0ZW5kcyAxICYgVHlwZSA/IHRydWUgOiBmYWxzZTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaXMtbmV2ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIElzTmV2ZXI8VHlwZT4gPSBbVHlwZV0gZXh0ZW5kcyBbbmV2ZXJdID8gdHJ1ZSA6IGZhbHNlO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaXMtdW5rbm93bi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSXNBbnkgfSBmcm9tIFwiLi4vaXMtYW55XCI7XG5cbmV4cG9ydCB0eXBlIElzVW5rbm93bjxUeXBlPiA9IElzQW55PFR5cGU+IGV4dGVuZHMgdHJ1ZSA/IGZhbHNlIDogdW5rbm93biBleHRlbmRzIFR5cGUgPyB0cnVlIDogZmFsc2U7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaXMtdHVwbGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIElzVHVwbGU8VHlwZT4gPSBUeXBlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10gPyAoYW55W10gZXh0ZW5kcyBUeXBlID8gbmV2ZXIgOiBUeXBlKSA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbm9uLWVtcHR5LW9iamVjdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55UmVjb3JkIH0gZnJvbSBcIi4uL2FueS1yZWNvcmRcIjtcblxuZXhwb3J0IHR5cGUgTm9uRW1wdHlPYmplY3Q8T2JqZWN0IGV4dGVuZHMgQW55UmVjb3JkPiA9IGtleW9mIE9iamVjdCBleHRlbmRzIG5ldmVyID8gbmV2ZXIgOiBPYmplY3Q7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYW55LWFycmF5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBBbnlBcnJheTxUeXBlID0gYW55PiA9IEFycmF5PFR5cGU+IHwgUmVhZG9ubHlBcnJheTxUeXBlPjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXJyYXktb3Itc2luZ2xlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBBcnJheU9yU2luZ2xlPFR5cGU+ID0gVHlwZSB8IFR5cGVbXTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZWxlbWVudC1vZi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgRWxlbWVudE9mPFR5cGUgZXh0ZW5kcyByZWFkb25seSBhbnlbXT4gPSBUeXBlIGV4dGVuZHMgcmVhZG9ubHkgKGluZmVyIFZhbHVlcylbXSA/IFZhbHVlcyA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvaGVhZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55QXJyYXkgfSBmcm9tIFwiLi4vYW55LWFycmF5XCI7XG5cbmV4cG9ydCB0eXBlIEhlYWQ8VHlwZSBleHRlbmRzIEFueUFycmF5PiA9IFR5cGUgZXh0ZW5kcyB1bmtub3duID8gKFR5cGVbXCJsZW5ndGhcIl0gZXh0ZW5kcyAwID8gbmV2ZXIgOiBUeXBlWzBdKSA6IG5ldmVyO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvbm9uLWVtcHR5LWFycmF5L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBOb25FbXB0eUFycmF5PFR5cGU+ID0gW1R5cGUsIC4uLlR5cGVbXV07XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVhZG9ubHktYXJyYXktb3Itc2luZ2xlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBSZWFkb25seUFycmF5T3JTaW5nbGU8VHlwZT4gPSBUeXBlIHwgcmVhZG9ubHkgVHlwZVtdO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdGFpbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW55QXJyYXkgfSBmcm9tIFwiLi4vYW55LWFycmF5XCI7XG5cbmV4cG9ydCB0eXBlIFRhaWw8VHlwZSBleHRlbmRzIEFueUFycmF5PiA9IFR5cGUgZXh0ZW5kcyByZWFkb25seSBbXVxuICA/IG5ldmVyXG4gIDogVHlwZSBleHRlbmRzIHJlYWRvbmx5IFthbnk/LCAuLi5pbmZlciBSZXN0XVxuICA/IFJlc3RcbiAgOiBuZXZlcjtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvdHVwbGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIFR1cGxlPFR5cGUgPSBhbnk+ID0gW1R5cGU/LCAuLi5UeXBlW11dO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvY2FtZWwtY2FzZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsidHlwZSBJc1N0cmluZ0xpdGVyYWw8VHlwZT4gPSBUeXBlIGV4dGVuZHMgc3RyaW5nID8gKHN0cmluZyBleHRlbmRzIFR5cGUgPyBmYWxzZSA6IHRydWUpIDogZmFsc2U7XG5cbnR5cGUgV29yZEluQ2FtZWxDYXNlPFR5cGUsIFdvcmQgZXh0ZW5kcyBzdHJpbmcgPSBcIlwiPiA9IFR5cGUgZXh0ZW5kcyBgJHtXb3JkfSR7aW5mZXIgTmV4dENoYXJhY3Rlcn0ke2luZmVyIF99YFxuICA/IE5leHRDaGFyYWN0ZXIgZXh0ZW5kcyBDYXBpdGFsaXplPE5leHRDaGFyYWN0ZXI+XG4gICAgPyBXb3JkXG4gICAgOiBXb3JkSW5DYW1lbENhc2U8VHlwZSwgYCR7V29yZH0ke05leHRDaGFyYWN0ZXJ9YD5cbiAgOiBXb3JkO1xuXG50eXBlIFNlcGFyYXRvciA9IFwiX1wiIHwgXCItXCI7XG5cbnR5cGUgSW5jbHVkZXNTZXBhcmF0b3I8VHlwZT4gPSBUeXBlIGV4dGVuZHMgYCR7c3RyaW5nfSR7U2VwYXJhdG9yfSR7c3RyaW5nfWAgPyB0cnVlIDogZmFsc2U7XG5cbnR5cGUgSXNPbmVXb3JkPFR5cGU+ID0gVHlwZSBleHRlbmRzIExvd2VyY2FzZTxUeXBlICYgc3RyaW5nPlxuICA/IHRydWVcbiAgOiBUeXBlIGV4dGVuZHMgVXBwZXJjYXNlPFR5cGUgJiBzdHJpbmc+XG4gID8gdHJ1ZVxuICA6IGZhbHNlO1xuXG50eXBlIElzQ2FtZWxDYXNlPFR5cGU+ID0gVHlwZSBleHRlbmRzIFVuY2FwaXRhbGl6ZTxUeXBlICYgc3RyaW5nPiA/IHRydWUgOiBmYWxzZTtcblxudHlwZSBJc1Bhc2NhbENhc2U8VHlwZT4gPSBUeXBlIGV4dGVuZHMgQ2FwaXRhbGl6ZTxUeXBlICYgc3RyaW5nPiA/IHRydWUgOiBmYWxzZTtcblxuLyoqIHNuYWtlX2Nhc2UsIENPTlNUQU5UX0NBU0UsIGtlYmFiLWNhc2Ugb3IgQ09CT0wtQ0FTRSAqL1xudHlwZSBTZXBhcmF0b3JDYXNlUGFyc2VyPFxuICBUeXBlLFxuICBUdXBsZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdID0gW10sXG4+ID0gVHlwZSBleHRlbmRzIGAke2luZmVyIFdvcmR9JHtTZXBhcmF0b3J9JHtpbmZlciBUYWlsfWBcbiAgPyBTZXBhcmF0b3JDYXNlUGFyc2VyPFRhaWwsIFsuLi5UdXBsZSwgTG93ZXJjYXNlPFdvcmQ+XT5cbiAgOiBUeXBlIGV4dGVuZHMgYCR7aW5mZXIgV29yZH1gXG4gID8gWy4uLlR1cGxlLCBMb3dlcmNhc2U8V29yZD5dXG4gIDogVHVwbGU7XG5cbnR5cGUgQ2FtZWxDYXNlUGFyc2VyPFR5cGUsIFR1cGxlIGV4dGVuZHMgcmVhZG9ubHkgYW55W10gPSBbXT4gPSBUeXBlIGV4dGVuZHMgXCJcIlxuICA/IFR1cGxlXG4gIDogVHlwZSBleHRlbmRzIGAke1dvcmRJbkNhbWVsQ2FzZTxUeXBlPn0ke2luZmVyIFRhaWx9YFxuICA/IFR5cGUgZXh0ZW5kcyBgJHtpbmZlciBXb3JkfSR7VGFpbH1gXG4gICAgPyBDYW1lbENhc2VQYXJzZXI8VW5jYXBpdGFsaXplPFRhaWw+LCBbLi4uVHVwbGUsIExvd2VyY2FzZTxXb3JkPl0+XG4gICAgOiBuZXZlclxuICA6IG5ldmVyO1xuXG4vLyBDb252ZXJ0IGZpcnN0IGNoYXJhY3RlciBvZiBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRvIGxvd2VyY2FzZSBhbmQgcmV1c2UgQ2FtZWxDYXNlUGFyc2VyXG50eXBlIFBhc2NhbENhc2VQYXJzZXI8VHlwZT4gPSBUeXBlIGV4dGVuZHMgc3RyaW5nID8gQ2FtZWxDYXNlUGFyc2VyPFVuY2FwaXRhbGl6ZTxUeXBlPj4gOiBuZXZlcjtcblxudHlwZSBTcGxpdEFueUNhc2U8VHlwZT4gPSBJbmNsdWRlc1NlcGFyYXRvcjxUeXBlPiBleHRlbmRzIHRydWVcbiAgPyBTZXBhcmF0b3JDYXNlUGFyc2VyPFR5cGU+XG4gIDogSXNPbmVXb3JkPFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICA/IFtMb3dlcmNhc2U8VHlwZSAmIHN0cmluZz5dXG4gIDogSXNDYW1lbENhc2U8VHlwZT4gZXh0ZW5kcyB0cnVlXG4gID8gQ2FtZWxDYXNlUGFyc2VyPFR5cGU+XG4gIDogSXNQYXNjYWxDYXNlPFR5cGU+IGV4dGVuZHMgdHJ1ZVxuICA/IFBhc2NhbENhc2VQYXJzZXI8VHlwZT5cbiAgOiBbXTtcblxudHlwZSBQYXNjYWxDYXBpdGFsaXplcjxUeXBlLCBUdXBsZSBleHRlbmRzIHJlYWRvbmx5IGFueVtdID0gW10+ID0gVHlwZSBleHRlbmRzIFtpbmZlciBIZWFkLCAuLi5pbmZlciBUYWlsXVxuICA/IEhlYWQgZXh0ZW5kcyBzdHJpbmdcbiAgICA/IFBhc2NhbENhcGl0YWxpemVyPFRhaWwsIFsuLi5UdXBsZSwgQ2FwaXRhbGl6ZTxIZWFkPl0+XG4gICAgOiBQYXNjYWxDYXBpdGFsaXplcjxUYWlsLCBUdXBsZT5cbiAgOiBUdXBsZTtcblxudHlwZSBDYW1lbENhcGl0YWxpemVyPFR5cGU+ID0gVHlwZSBleHRlbmRzIFtpbmZlciBGaXJzdCwgLi4uaW5mZXIgVGFpbF0gPyBQYXNjYWxDYXBpdGFsaXplcjxUYWlsLCBbRmlyc3RdPiA6IFtdO1xuXG50eXBlIEpvaW48VHlwZSwgSm9pbmVkU3RyaW5nIGV4dGVuZHMgc3RyaW5nID0gXCJcIj4gPSBUeXBlIGV4dGVuZHMgW2luZmVyIEhlYWQsIC4uLmluZmVyIFRhaWxdXG4gID8gSGVhZCBleHRlbmRzIHN0cmluZ1xuICAgID8gSm9pbjxUYWlsLCBgJHtKb2luZWRTdHJpbmd9JHtIZWFkfWA+XG4gICAgOiBKb2luPFRhaWw+XG4gIDogSm9pbmVkU3RyaW5nO1xuXG5leHBvcnQgdHlwZSBDYW1lbENhc2U8VHlwZT4gPSBJc1N0cmluZ0xpdGVyYWw8VHlwZT4gZXh0ZW5kcyB0cnVlID8gSm9pbjxDYW1lbENhcGl0YWxpemVyPFNwbGl0QW55Q2FzZTxUeXBlPj4+IDogVHlwZTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvZGVlcC1jYW1lbC1jYXNlLXByb3BlcnRpZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhbWVsQ2FzZSB9IGZyb20gXCIuLi9jYW1lbC1jYXNlXCI7XG5cbmV4cG9ydCB0eXBlIERlZXBDYW1lbENhc2VQcm9wZXJ0aWVzPFR5cGU+ID0gVHlwZSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gID8geyBbS2V5IGluIGtleW9mIFR5cGUgYXMgQ2FtZWxDYXNlPEtleT5dOiBEZWVwQ2FtZWxDYXNlUHJvcGVydGllczxUeXBlW0tleV0+IH1cbiAgOiBUeXBlO1xuIl19","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYW55LWZ1bmN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBBbnlGdW5jdGlvbjxBcmdzIGV4dGVuZHMgYW55W10gPSBhbnlbXSwgUmV0dXJuVHlwZSA9IGFueT4gPSAoLi4uYXJnczogQXJncykgPT4gUmV0dXJuVHlwZTtcbiJdfQ==","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJlZGljYXRlLWZ1bmN0aW9uL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBQcmVkaWNhdGVGdW5jdGlvbiA9ICh4OiBhbnksIC4uLl96OiBhbnlbXSkgPT4geCBpcyBhbnk7XG4iXX0=","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcHJlZGljYXRlLXR5cGUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFByZWRpY2F0ZUZ1bmN0aW9uIH0gZnJvbSBcIi4uL3ByZWRpY2F0ZS1mdW5jdGlvblwiO1xuXG5leHBvcnQgdHlwZSBQcmVkaWNhdGVUeXBlPFR5cGUgZXh0ZW5kcyBQcmVkaWNhdGVGdW5jdGlvbj4gPSBUeXBlIGV4dGVuZHMgKFxuICB0YXJnZXQ6IGFueSxcbiAgLi4ucmVzdDogYW55W11cbikgPT4gdGFyZ2V0IGlzIGluZmVyIE5hcnJvd2VkVHlwZVxuICA/IE5hcnJvd2VkVHlwZVxuICA6IG5ldmVyO1xuIl19","export class UnreachableCaseError extends Error {\n constructor(value: never) {\n super(`Unreachable case: ${value}`);\n }\n}\n","export function assert(condition: any, message: string = \"no additional info provided\"): asserts condition {\n if (!condition) {\n throw new Error(\"Assertion Error: \" + message);\n }\n}\n","export const createFactoryWithConstraint =\n <Constraint>() =>\n <Value extends Constraint>(value: Value): Value =>\n value;\n","import { Exact } from \"../../exact\";\n\nexport const isExact =\n <ExpectedShape>() =>\n <ActualShape>(x: Exact<ActualShape, ExpectedShape>) =>\n x as ExpectedShape;\n","export function noop(..._args: unknown[]): void {}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvYXdhaXRlZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBkZXByZWNhdGVkIHBsZWFzZSB1c2UgYnVpbHRpbiBgQXdhaXRlZGAgKi9cbmV4cG9ydCB0eXBlIEF3YWl0ZWQ8VHlwZT4gPSBUeXBlIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVmFsdWU+ID8gVmFsdWUgOiBuZXZlcjtcbiJdfQ==","// Basic\n\nexport * from \"./primitive\";\nexport * from \"./built-in\";\nexport * from \"./key-of-base\";\nexport * from \"./strict-exclude\";\nexport * from \"./strict-extract\";\nexport * from \"./strict-omit\";\nexport * from \"./writable\";\n\n// Utility types\n\nexport * from \"./async-or-sync\";\nexport * from \"./async-or-sync-type\";\nexport * from \"./dictionary\";\nexport * from \"./dictionary-values\";\nexport * from \"./merge\";\nexport * from \"./merge-n\";\nexport * from \"./newable\";\nexport * from \"./non-never\";\nexport * from \"./omit-properties\";\nexport * from \"./opaque\";\nexport * from \"./path-value\";\nexport * from \"./paths\";\nexport * from \"./pick-properties\";\nexport * from \"./prettify\";\nexport * from \"./safe-dictionary\";\nexport * from \"./union-to-intersection\";\nexport * from \"./value-of\";\nexport * from \"./xor\";\n\n// Mark wrapper types\n\nexport * from \"./mark-optional\";\nexport * from \"./mark-readonly\";\nexport * from \"./mark-required\";\nexport * from \"./mark-writable\";\n\n// Deep wrapper types\n\nexport * from \"./buildable\";\nexport * from \"./deep-mark-optional\";\nexport * from \"./deep-mark-required\";\nexport * from \"./deep-non-nullable\";\nexport * from \"./deep-nullable\";\nexport * from \"./deep-omit\";\nexport * from \"./deep-partial\";\nexport * from \"./deep-pick\";\nexport * from \"./deep-readonly\";\nexport * from \"./deep-required\";\nexport * from \"./deep-undefinable\";\nexport * from \"./deep-writable\";\nexport * from \"./strict-deep-omit\";\nexport * from \"./strict-deep-pick\";\n\n// Key types\n\nexport * from \"./optional-keys\";\nexport * from \"./pick-keys\";\nexport * from \"./readonly-keys\";\nexport * from \"./required-keys\";\nexport * from \"./writable-keys\";\n\n// Type checkers\n\nexport * from \"./exact\";\nexport * from \"./is-any\";\nexport * from \"./is-never\";\nexport * from \"./is-unknown\";\nexport * from \"./is-tuple\";\nexport * from \"./non-empty-object\";\n\n// Arrays and Tuples\n\nexport * from \"./any-array\";\nexport * from \"./array-or-single\";\nexport * from \"./element-of\";\nexport * from \"./head\";\nexport * from \"./non-empty-array\";\nexport * from \"./readonly-array-or-single\";\nexport * from \"./tail\";\nexport * from \"./tuple\";\n\n// Change case\n\nexport * from \"./camel-case\";\nexport * from \"./deep-camel-case-properties\";\n\n// Function types\n\nexport * from \"./any-function\";\nexport * from \"./predicate-function\";\nexport * from \"./predicate-type\";\n\n// Utility functions\n\nexport * from \"./functions/unreachable-case-error\";\nexport * from \"./functions/assert\";\nexport * from \"./functions/create-factory-with-constraint\";\nexport * from \"./functions/is-exact\";\nexport * from \"./functions/noop\";\n\n// Build-in types\n\nexport * from \"./awaited\";\n","import { QueryClient } from '@tanstack/react-query';\nimport { createContext, useContext, useMemo } from 'react';\n\n// Internal context to expose the QueryClient used by this module\nconst InternalQueryClientContext = createContext<QueryClient | null>(null);\n\nexport const useInternalQueryClient = (): QueryClient => {\n const qc = useContext(InternalQueryClientContext);\n if (!qc) throw new Error('QueryClient not available. Wrap with CofheProvider/QueryProvider.');\n return qc;\n};\n\nexport const QueryProvider = ({\n children,\n queryClient: overridingQueryClient,\n}: {\n children: React.ReactNode;\n queryClient?: QueryClient;\n}) => {\n // Create a client if not provided\n const queryClient = useMemo(() => {\n if (overridingQueryClient) return overridingQueryClient;\n return new QueryClient();\n }, [overridingQueryClient]);\n\n return <InternalQueryClientContext.Provider value={queryClient}>{children}</InternalQueryClientContext.Provider>;\n};\n","import { createContext, useContext, useMemo, useState } from 'react';\nimport type { CofheContextValue, CofheProviderProps } from '../types/index';\nimport { QueryProvider } from './QueryProvider';\nimport { createCofheClient } from '@cofhe/sdk/web';\nimport { useCofheAutoConnect } from '@/hooks/useCofheAutoConnect';\nimport { createCofheConfig } from '@/config';\nimport { chains } from '@cofhe/sdk/chains';\nimport { assert } from 'ts-essentials';\nimport type { FloatingButtonPosition } from '@/components/CofheFloatingButton/types';\n\nconst CofheContext = createContext<CofheContextValue | undefined>(undefined);\n\nexport function CofheProvider(props: CofheProviderProps) {\n const { children, queryClient, publicClient, walletClient } = props;\n\n const config = useMemo(() => {\n // priority: explicit config prop > config from provided client > create default config\n if (props.config) return props.config;\n if (props.cofheClient) {\n assert(props.cofheClient.config.environment === 'react', 'Provided cofheClient must have react config');\n return props.cofheClient.config;\n }\n return createCofheConfig({ supportedChains: Object.values(chains) });\n }, [props.config, props.cofheClient]);\n\n // use provided client or create a new one out of the config\n const cofheClient = useMemo(() => props.cofheClient ?? createCofheClient(config), [props.cofheClient, config]);\n\n // dynamic values\n const [position, setPosition] = useState<FloatingButtonPosition>(config.react.position);\n const [theme, setTheme] = useState(config.react.initialTheme);\n\n return (\n <CofheContext.Provider\n value={{\n client: cofheClient,\n state: {\n position,\n setPosition,\n theme,\n setTheme,\n },\n }}\n >\n <QueryProvider queryClient={queryClient}>\n <AutoConnect walletClient={walletClient} publicClient={publicClient} />\n {children}\n </QueryProvider>\n </CofheContext.Provider>\n );\n}\n\nfunction AutoConnect({ walletClient, publicClient }: Pick<CofheProviderProps, 'walletClient' | 'publicClient'>) {\n useCofheAutoConnect({ walletClient, publicClient });\n return null;\n}\n\nexport function useCofheContext(): CofheContextValue {\n const context = useContext(CofheContext);\n if (context === undefined) {\n throw new Error('useCofheContext must be used within a CofheProvider');\n }\n return context;\n}\n","import type { PublicClient, WalletClient } from 'viem';\nimport { useCofheClient } from './useCofheClient';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { useCofheConnect } from './useCofheConnect';\n\ntype Input = {\n publicClient?: PublicClient;\n walletClient?: WalletClient;\n};\nexport const useCofheAutoConnect = ({ walletClient, publicClient }: Input) => {\n const client = useCofheClient();\n\n const connectMutationFn = useCofheConnect().mutate;\n\n const supportedChainIds = useMemo(() => {\n return new Set(client.config.supportedChains.map((chain) => chain.id));\n }, [client.config.supportedChains]);\n\n const disconnectIfConnected = useCallback(() => {\n if (client.connected || client.connecting) {\n client.disconnect();\n }\n }, [client]);\n\n useEffect(() => {\n // Keep COFHE connection in sync with the upstream (wagmi) connection.\n // - if wagmi disconnects, it stops providing clients -> disconnect COFHE\n // - if wagmi provides clients -> ensure COFHE is connected\n if (!publicClient || !walletClient) {\n disconnectIfConnected();\n return;\n }\n\n const chainId = walletClient.chain?.id ?? publicClient.chain?.id;\n if (chainId !== undefined && !supportedChainIds.has(chainId)) {\n disconnectIfConnected();\n return;\n }\n\n if (client.connecting) return;\n connectMutationFn({ publicClient, walletClient });\n }, [publicClient, walletClient, client, connectMutationFn, supportedChainIds, disconnectIfConnected]);\n};\n","import {\n useQuery as rqUseQuery,\n useMutation as rqUseMutation,\n useQueries as rqUseQueries,\n type QueryKey,\n type UseQueryOptions,\n type UseQueryResult,\n type UseMutationOptions,\n type UseMutationResult,\n} from '@tanstack/react-query';\nimport { useInternalQueryClient } from './QueryProvider';\nimport { isPersistedQuery } from './queryUtils';\n\nfunction applyPersistedDefaults<TData, TError, TSelectedData>(\n options: UseQueryOptions<TData, TError, TSelectedData>\n): UseQueryOptions<TData, TError, TSelectedData> {\n if (!isPersistedQuery(options as { meta?: unknown; queryKey?: QueryKey })) return options;\n\n return {\n ...options,\n // Persisted results are typically deterministic. Default to not refetching on mount/focus/reconnect.\n // Consumers can override per-query when needed.\n staleTime: options.staleTime ?? Infinity,\n refetchOnMount: options.refetchOnMount ?? false,\n refetchOnWindowFocus: options.refetchOnWindowFocus ?? false,\n refetchOnReconnect: options.refetchOnReconnect ?? false,\n };\n}\n\n/**\n * Internal wrapper for TanStack's useQuery that always uses the module's QueryClient.\n * Drop-in replacement: use `useInternalQuery(options)`.\n */\nexport function useInternalQuery<TData = unknown, TError = Error, TSelectedData = TData>(\n options: UseQueryOptions<TData, TError, TSelectedData>\n): UseQueryResult<TSelectedData, TError> {\n const qc = useInternalQueryClient();\n return rqUseQuery<TData, TError, TSelectedData>(applyPersistedDefaults(options), qc);\n}\n\n/**\n * Internal wrapper for TanStack's useMutation that always uses the module's QueryClient.\n * Drop-in replacement: use `useInternalMutation(options)`.\n */\nexport function useInternalMutation<TData = unknown, TError = Error, TVariables = void, TContext = unknown>(\n options: UseMutationOptions<TData, TError, TVariables, TContext>\n): UseMutationResult<TData, TError, TVariables, TContext> {\n const qc = useInternalQueryClient();\n return rqUseMutation<TData, TError, TVariables, TContext>(options, qc);\n}\n\n/**\n * Internal wrapper for TanStack's useQueries that always uses the module's QueryClient.\n * Typing mirrors `rqUseQueries` so all generics and inference are preserved.\n */\nexport const useInternalQueries: typeof rqUseQueries = (options, _ignoredQueryClient) => {\n const qc = useInternalQueryClient();\n if (options && typeof options === 'object' && 'queries' in options) {\n const typedOptions = options as { queries: Array<UseQueryOptions<any, any, any>> };\n return rqUseQueries(\n {\n ...(options as any),\n queries: typedOptions.queries.map((q) => applyPersistedDefaults(q)),\n } as any,\n qc\n );\n }\n return rqUseQueries(options as any, qc);\n};\n","import { type QueryKey } from '@tanstack/react-query';\nimport { persistQueryClientRestore, persistQueryClientSubscribe } from '@tanstack/react-query-persist-client';\nimport { createAsyncStoragePersister } from '@tanstack/query-async-storage-persister';\nimport { useEffect } from 'react';\nimport type { useInternalQueryClient } from './QueryProvider';\nimport { createSsrStorage, hasDOM } from '@cofhe/sdk/web';\n\nexport function isPersistedQuery(options: { meta?: unknown; queryKey?: QueryKey }): boolean {\n const meta = options.meta as { persist?: boolean } | undefined;\n return meta?.persist === true;\n}\nconst persistenceConfig = {\n storage: 'localStorage' satisfies 'sessionStorage' | 'localStorage',\n key: 'cofhe:react-query',\n maxAgeMs: 86_400_000,\n};\n\nconst BIGINT_SENTINEL_KEY = '__cofhe_bigint__';\n\nfunction serializeWithBigInt(value: any): string {\n return JSON.stringify(value, (_key, v) => {\n if (typeof v === 'bigint') return { [BIGINT_SENTINEL_KEY]: v.toString() };\n return v;\n });\n}\n\nfunction deserializeWithBigInt(serialized: string): any {\n return JSON.parse(serialized, (_key, v) => {\n if (\n v &&\n typeof v === 'object' &&\n BIGINT_SENTINEL_KEY in (v as Record<string, unknown>) &&\n typeof (v as Record<string, unknown>)[BIGINT_SENTINEL_KEY] === 'string'\n ) {\n return BigInt((v as Record<string, unknown>)[BIGINT_SENTINEL_KEY] as string);\n }\n return v;\n });\n}\n\nconst storage = !hasDOM\n ? createSsrStorage()\n : persistenceConfig.storage === 'localStorage'\n ? window.localStorage\n : window.sessionStorage;\n\nconst persister = storage\n ? createAsyncStoragePersister({\n storage,\n key: persistenceConfig.key ?? 'cofhe:react-query',\n serialize: serializeWithBigInt,\n deserialize: deserializeWithBigInt,\n })\n : undefined;\n\nexport function usePersistentQueriesSubscription({\n queryClient,\n overridingQueryClient,\n}: {\n queryClient: ReturnType<typeof useInternalQueryClient>;\n overridingQueryClient?: ReturnType<typeof useInternalQueryClient>;\n}) {\n // IMPORTANT:\n // Do NOT use <PersistQueryClientProvider>.\n // It wraps children with TanStack's <QueryClientProvider>, which overrides any external provider\n // the consuming dapp (e.g. Wagmi) sets up. Instead, persist/restore imperatively against *our* client.\n useEffect(() => {\n // If the consumer explicitly provides a QueryClient do not attach persistence to it.\n if (overridingQueryClient) return;\n\n // if there's no persister, we can't persist - but we also don't want to throw an error since persistence is a nice-to-have, not a requirement\n if (!persister) return;\n\n let unsubscribe: (() => void) | undefined;\n let cancelled = false;\n\n const options = {\n queryClient: queryClient as any,\n persister,\n maxAge: persistenceConfig.maxAgeMs ?? 86_400_000,\n buster: 'cofhe-react-query-v1',\n dehydrateOptions: {\n // Persist only queries that opt-in via meta.persist.\n // Backwards-compat: also persist decrypt results by queryKey prefix.\n shouldDehydrateQuery: (query: unknown) => isPersistedQuery(query as any),\n },\n };\n\n persistQueryClientRestore(options)\n .catch(() => {\n // Ignore restore errors (e.g. corrupt storage); we'll simply start fresh.\n })\n .finally(() => {\n if (cancelled) return;\n unsubscribe = persistQueryClientSubscribe(options);\n });\n\n return () => {\n cancelled = true;\n unsubscribe?.();\n };\n }, [overridingQueryClient, queryClient]);\n}\n","import type { PublicClient, WalletClient } from 'viem';\nimport type { UseMutationOptions } from '@tanstack/react-query';\nimport { useCofheClient } from './useCofheClient';\nimport { useInternalMutation } from '@/providers/internalQueryHooks';\n\ntype ConnectVars = { publicClient: PublicClient; walletClient: WalletClient };\n\ntype ConnectMutationOptions = Omit<UseMutationOptions<void, Error, ConnectVars, unknown>, 'mutationKey' | 'mutationFn'>;\n\nexport const useCofheConnect = (options?: ConnectMutationOptions) => {\n const client = useCofheClient();\n return useInternalMutation<void, Error, ConnectVars>({\n // spread user-provided options first; enforce critical keys afterwards\n ...options,\n mutationKey: ['cofhe', 'connect'],\n mutationFn: async ({ publicClient, walletClient }) => {\n await client.connect(publicClient, walletClient);\n },\n });\n};\n","import { z } from 'zod';\nimport { type CofheConfig, type CofheInputConfig } from '@cofhe/sdk';\nimport { createCofheConfig as createCofheConfigWeb } from '@cofhe/sdk/web';\nimport { getAddress, isAddress, zeroAddress } from 'viem';\nimport { setReactLogger } from '@/utils/debug';\n\nexport type CofheReactLoggerMethod = ((...args: unknown[]) => void) | null;\n\n/**\n * Logger used by @cofhe/react internal debug logs.\n *\n * - Omitted/undefined: disables internal logging\n * - Object: enables logging and calls only the provided methods\n * - Method set to null: disables that method\n */\nexport type CofheReactLogger = {\n log?: CofheReactLoggerMethod;\n warn?: CofheReactLoggerMethod;\n debug?: CofheReactLoggerMethod;\n error?: CofheReactLoggerMethod;\n};\n\nexport type CofheReactLoggerResolved = {\n log: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n debug: (...args: unknown[]) => void;\n error: (...args: unknown[]) => void;\n};\n\nconst noopCofheReactLoggerMethod = (..._args: unknown[]) => {};\n\nexport const NOOP_COFHE_REACT_LOGGER: CofheReactLoggerResolved = {\n log: noopCofheReactLoggerMethod,\n warn: noopCofheReactLoggerMethod,\n debug: noopCofheReactLoggerMethod,\n error: noopCofheReactLoggerMethod,\n};\n\nfunction resolveLoggerMethod(method: unknown): (...args: unknown[]) => void {\n return typeof method === 'function' ? (method as (...args: unknown[]) => void) : noopCofheReactLoggerMethod;\n}\n\nexport function resolveCofheReactLogger(logger: unknown): CofheReactLoggerResolved {\n if (logger === null || logger === undefined) return NOOP_COFHE_REACT_LOGGER;\n if (typeof logger !== 'object') return NOOP_COFHE_REACT_LOGGER;\n\n const obj = logger as Record<string, unknown>;\n return {\n log: resolveLoggerMethod(obj.log),\n warn: resolveLoggerMethod(obj.warn),\n debug: resolveLoggerMethod(obj.debug),\n error: resolveLoggerMethod(obj.error),\n };\n}\n\nconst CofheReactLoggerSchema = z\n .custom<CofheReactLogger | null>((value) => value === null || (typeof value === 'object' && value !== null), {\n error: 'Invalid logger',\n })\n .optional()\n .default(null)\n .transform((value) => resolveCofheReactLogger(value));\n\n/**\n * Zod schema for react configuration validation\n */\n\nexport const addressSchema = z\n .string()\n .refine((val) => isAddress(val), {\n error: 'Invalid address',\n })\n .refine((val) => val !== zeroAddress, {\n error: 'Must not be zeroAddress',\n })\n .transform((val) => getAddress(val));\n\nexport const CofheReactConfigSchema = z.object({\n shareablePermits: z.boolean().optional().default(false),\n enableShieldUnshield: z.boolean().optional().default(true),\n autogeneratePermits: z.boolean().optional().default(true),\n projectName: z.string().trim().optional().default(''),\n logger: CofheReactLoggerSchema,\n permitExpirationOptions: z\n .array(\n z.object({\n label: z.string(),\n intervalSeconds: z.number().min(0),\n })\n )\n .optional()\n .default([\n { label: '1 Day', intervalSeconds: 86400 },\n { label: '1 Week', intervalSeconds: 604800 },\n { label: '1 Month', intervalSeconds: 2592000 },\n ]),\n defaultPermitExpirationSeconds: z.number().optional().default(604800), // 1 week\n pinnedTokens: z.record(z.string(), addressSchema).optional(),\n tokenLists: z\n .record(z.string(), z.array(z.string()))\n .transform((lists) => lists as Partial<Record<number, string[]>>)\n .optional(),\n position: z.enum(['bottom-right', 'bottom-left', 'top-right', 'top-left']).optional().default('bottom-right'),\n initialTheme: z.enum(['dark', 'light']).optional().default('light'),\n});\n\n/**\n * Input config type inferred from the schema\n */\nexport type CofheReactInputConfig = CofheInputConfig & {\n react?: z.input<typeof CofheReactConfigSchema>;\n};\n\nexport type CofheConfigWithReact = CofheConfig & {\n react: z.output<typeof CofheReactConfigSchema>;\n};\n/**\n * Creates a CoFHE client plus React configuration with reasonable defaults.\n * @param config - Cofhe client input merged with a `react` object (fheKeyStorage defaults to IndexedDB when omitted).\n * @returns The combined client configuration with a validated `react` section and Web defaults applied.\n */\nexport function createCofheConfig(config: CofheReactInputConfig): CofheConfigWithReact {\n const { react: reactConfigInput = {}, ...webConfig } = config;\n\n const webClientConfig = createCofheConfigWeb({\n environment: 'react',\n ...webConfig,\n });\n const reactConfigResult = CofheReactConfigSchema.safeParse(reactConfigInput);\n\n if (!reactConfigResult.success) {\n throw new Error(`Invalid cofhe react configuration: ${z.prettifyError(reactConfigResult.error)}`, {\n cause: reactConfigResult.error,\n });\n }\n\n // Configure internal logger immediately (outside of React render lifecycle).\n setReactLogger(reactConfigResult.data.logger);\n\n return {\n ...webClientConfig,\n react: reactConfigResult.data,\n };\n}\n","import type { CofheReactLoggerResolved } from '@/config';\n\nconst noopCofheReactLoggerMethod = (..._args: unknown[]) => {};\n\nconst NOOP_LOGGER = {\n log: noopCofheReactLoggerMethod,\n warn: noopCofheReactLoggerMethod,\n debug: noopCofheReactLoggerMethod,\n error: noopCofheReactLoggerMethod,\n} satisfies CofheReactLoggerResolved;\n\nexport let cofheLogger: CofheReactLoggerResolved = NOOP_LOGGER;\n\n/**\n * Configure @cofhe/react internal logger without env vars.\n * Intended for internal use by CofheProvider.\n */\nexport function setReactLogger(logger: CofheReactLoggerResolved | null | undefined): void {\n cofheLogger = logger ?? NOOP_LOGGER;\n}\n","import type { CofheClient } from '@cofhe/sdk';\nimport { useCofheContext } from '../providers';\nimport type { CofheConfigWithReact } from '@/config';\n\nexport const useCofheClient = (): CofheClient<CofheConfigWithReact> => {\n return useCofheContext().client;\n};\n","/**\n * Token types shared across hooks/components/utils.\n *\n * IMPORTANT: Keep this file dependency-free (no imports from hooks/providers/utils)\n * to avoid circular dependencies.\n */\n\nimport { baseSepolia, sepolia } from '@cofhe/sdk/chains';\nimport type { Address } from 'viem';\n\n/**\n * Special address representing native ETH (used in erc20Pair for ConfidentialETH tokens)\n */\nexport const ETH_ADDRESS_LOWERCASE = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' as const;\n\ntype TokenWithoutExtensions = Omit<Token, 'extensions'>;\nexport function constructNativeToken(chainId: number): TokenWithoutExtensions {\n return {\n chainId,\n address: ETH_ADDRESS_LOWERCASE,\n name: 'Ether',\n symbol: 'ETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n };\n}\n\n/**\n * ERC20 pair information for wrapped confidential tokens\n */\nexport type Erc20Pair = {\n /** Address of the underlying ERC20 token (or ETH_ADDRESS for native ETH) */\n address: Address;\n symbol: string;\n decimals: number;\n logoURI?: string;\n};\n\nexport type TokenSupportOperation =\n | 'confidentialBalance'\n | 'transfer'\n | 'publicBalance'\n | 'shield'\n | 'unshield'\n | 'claim'\n | 'claimable';\n\nexport const TOKEN_CONFIDENTIALITY_SUPPORT = {\n wrapped: {\n enabled: true,\n label: 'Wrapped confidential token',\n confidentialValueType: 'uint128',\n publicBalanceSource: 'erc20Pair',\n operations: {\n confidentialBalance: true,\n transfer: true,\n publicBalance: true,\n shield: true,\n unshield: true,\n claim: true,\n claimable: true,\n },\n },\n pure: {\n enabled: false,\n label: 'Pure confidential token',\n confidentialValueType: 'uint64',\n publicBalanceSource: null,\n operations: {\n confidentialBalance: false,\n transfer: false,\n publicBalance: false,\n shield: false,\n unshield: false,\n claim: false,\n claimable: false,\n },\n },\n dual: {\n enabled: false,\n label: 'Dual-balance confidential token',\n confidentialValueType: 'uint64',\n publicBalanceSource: 'token',\n operations: {\n confidentialBalance: false,\n transfer: false,\n publicBalance: false,\n shield: false,\n unshield: false,\n claim: false,\n claimable: false,\n },\n },\n} as const;\n\nexport type TokenConfidentialityType = keyof typeof TOKEN_CONFIDENTIALITY_SUPPORT;\ntype EnabledTokenConfidentialityType<T extends Record<string, { enabled: boolean }>> = {\n [K in keyof T]: T[K]['enabled'] extends true ? K : never;\n}[keyof T];\n\nexport type SupportedTokenConfidentialityType = EnabledTokenConfidentialityType<typeof TOKEN_CONFIDENTIALITY_SUPPORT>;\n\nexport const TOKEN_CONFIDENTIALITY_TYPES = Object.keys(TOKEN_CONFIDENTIALITY_SUPPORT) as TokenConfidentialityType[];\n\nexport function isTokenConfidentialityType(value: string | undefined): value is TokenConfidentialityType {\n return typeof value === 'string' && value in TOKEN_CONFIDENTIALITY_SUPPORT;\n}\n\nexport function isSupportedTokenConfidentialityType(\n value: string | undefined\n): value is SupportedTokenConfidentialityType {\n return isTokenConfidentialityType(value) && TOKEN_CONFIDENTIALITY_SUPPORT[value].enabled;\n}\n\nexport function isTokenOperationSupported(type: string | undefined, operation: TokenSupportOperation): boolean {\n return isTokenConfidentialityType(type) && TOKEN_CONFIDENTIALITY_SUPPORT[type].operations[operation];\n}\n\nexport function getPublicBalanceSourceType(\n type: string | undefined\n): (typeof TOKEN_CONFIDENTIALITY_SUPPORT)[TokenConfidentialityType]['publicBalanceSource'] | null {\n if (!isTokenConfidentialityType(type)) return null;\n return TOKEN_CONFIDENTIALITY_SUPPORT[type].publicBalanceSource;\n}\n\nexport function getTokenConfidentialityLabel(type: string | undefined): string | null {\n if (!isTokenConfidentialityType(type)) return null;\n return TOKEN_CONFIDENTIALITY_SUPPORT[type].label;\n}\n\nexport function getTokenConfidentialValueType(\n type: TokenConfidentialityType\n): (typeof TOKEN_CONFIDENTIALITY_SUPPORT)[TokenConfidentialityType]['confidentialValueType'] {\n return TOKEN_CONFIDENTIALITY_SUPPORT[type].confidentialValueType;\n}\n\nexport function assertTokenOperationSupported(\n type: string | undefined,\n operation: TokenSupportOperation\n): asserts type is SupportedTokenConfidentialityType {\n if (isTokenOperationSupported(type, operation)) return;\n throw new Error(`${operation} not supported for confidentialityType: ${type ?? 'undefined'}`);\n}\n\nexport type Token = {\n chainId: number;\n address: `0x${string}`;\n symbol: string;\n decimals: number;\n name: string;\n logoURI?: string;\n extensions: Record<string, unknown> & {\n fhenix: {\n confidentialityType: TokenConfidentialityType;\n confidentialValueType: 'uint64' | 'uint128';\n /** ERC20 pair for wrapped tokens - contains underlying token info */\n erc20Pair?: Erc20Pair;\n };\n };\n};\n\n// source: https://storage.googleapis.com/cofhesdk/sepolia.json\nexport const WETH_SEPOLIA_TOKEN: Token = {\n chainId: 11155111,\n address: '0x87A3effB84CBE1E4caB6Ab430139eC41d156D55A',\n name: 'Redact eETH',\n symbol: 'eETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n extensions: {\n fhenix: {\n confidentialityType: 'wrapped',\n confidentialValueType: 'uint128',\n erc20Pair: {\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n },\n },\n },\n};\n\n// source: https://storage.googleapis.com/cofhesdk/base-sepolia.json\nconst WETH_BASE_SEPOLIA_TOKEN: Token = {\n chainId: 84532,\n address: '0xbED96aa98a49FeA71fcC55d755b915cF022a9159',\n name: 'Redact eETH',\n symbol: 'eETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n extensions: {\n coingeckoId: 'eeth',\n fhenix: {\n confidentialityType: 'wrapped',\n confidentialValueType: 'uint128',\n erc20Pair: {\n address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',\n symbol: 'ETH',\n decimals: 18,\n logoURI: 'https://storage.googleapis.com/cofhesdk/token-icons/eth.webp',\n },\n },\n },\n};\nexport const DEFAULT_TOKEN_BY_CHAIN_ID: Record<number, Token> = {\n [sepolia.id]: WETH_SEPOLIA_TOKEN,\n [baseSepolia.id]: WETH_BASE_SEPOLIA_TOKEN,\n};\n","import * as viemChains from 'viem/chains';\nimport {\n ETH_ADDRESS_LOWERCASE,\n isSupportedTokenConfidentialityType,\n type Token,\n type Erc20Pair,\n} from '../types/token.js';\nimport type { FheTypeValue } from '@cofhe/sdk';\nimport { isValidElement } from 'react';\n\n// Build a lookup map of chainId -> viem chain (for block explorers, etc.)\nconst viemChainById = Object.values(viemChains).reduce<Record<number, (typeof viemChains)[keyof typeof viemChains]>>(\n (acc, chain) => {\n if (chain && typeof chain === 'object' && 'id' in chain) {\n acc[chain.id] = chain;\n }\n return acc;\n },\n {}\n);\n\n/**\n * Gets the block explorer URL for a given chain ID\n * @param chainId - The chain ID to look up\n * @returns The block explorer base URL, or undefined if not found\n */\nexport const getBlockExplorerUrl = (chainId: number): string | undefined => {\n const chain = viemChainById[chainId];\n return chain?.blockExplorers?.default?.url;\n};\n\n/**\n * Gets the block explorer transaction URL for a given chain ID and transaction hash\n * @param chainId - The chain ID\n * @param hash - The transaction hash\n * @returns The full transaction URL, or undefined if chain not found\n */\nexport const getBlockExplorerTxUrl = (chainId: number, hash: string): string | undefined => {\n const baseUrl = getBlockExplorerUrl(chainId);\n return baseUrl ? `${baseUrl}/tx/${hash}` : undefined;\n};\n\n/**\n * Gets the block explorer address URL for a given chain ID and address\n * @param chainId - The chain ID\n * @param address - The address\n * @returns The full address URL, or undefined if chain not found\n */\nexport const getBlockExplorerAddressUrl = (chainId: number, address: string): string | undefined => {\n const baseUrl = getBlockExplorerUrl(chainId);\n return baseUrl ? `${baseUrl}/address/${address}` : undefined;\n};\n\n/**\n * Gets the block explorer token URL for a given chain ID and token address\n * @param chainId - The chain ID\n * @param tokenAddress - The token contract address\n * @returns The full token URL, or undefined if chain not found\n */\nexport const getBlockExplorerTokenUrl = (chainId: number, tokenAddress: string): string | undefined => {\n const baseUrl = getBlockExplorerUrl(chainId);\n return baseUrl ? `${baseUrl}/token/${tokenAddress}` : undefined;\n};\n\n// ============================================================================\n// Token Helper Functions\n// ============================================================================\n\n/**\n * Check if an erc20Pair address is the native ETH address\n * @param erc20Pair - The ERC20 pair object from token extensions\n * @returns True if the pair address matches ETH_ADDRESS\n */\nexport const isEthPair = (erc20Pair: Erc20Pair | undefined): boolean => {\n if (!erc20Pair) return false;\n return erc20Pair.address.toLowerCase() === ETH_ADDRESS_LOWERCASE;\n};\n\n/**\n * Check if a token is a wrapped ETH token (ConfidentialETH)\n * @param token - The token object\n * @returns True if the token is a wrapped token with ETH as the underlying pair\n */\nexport const isWrappedEthToken = (token: Token): boolean => {\n if (!isSupportedTokenConfidentialityType(token.extensions.fhenix.confidentialityType)) return false;\n return isEthPair(token.extensions.fhenix.erc20Pair);\n};\n\nexport interface FheTypeOption {\n label: string;\n value: FheTypeValue;\n maxValue: bigint | null;\n description: string;\n}\n\nexport const FheTypesList: FheTypeOption[] = [\n {\n label: 'Encrypted Bool',\n value: 'bool',\n maxValue: BigInt(1), // 0 or 1\n description: 'Boolean value (true/false)',\n },\n {\n label: 'Encrypted Uint8',\n value: 'uint8',\n maxValue: BigInt(2 ** 8 - 1), // 255\n description: '8-bit unsigned integer (0 to 255)',\n },\n {\n label: 'Encrypted Uint16',\n value: 'uint16',\n maxValue: BigInt(2 ** 16 - 1), // 65,535\n description: '16-bit unsigned integer (0 to 65,535)',\n },\n {\n label: 'Encrypted Uint32',\n value: 'uint32',\n maxValue: BigInt(2 ** 32 - 1), // 4,294,967,295\n description: '32-bit unsigned integer (0 to 4,294,967,295)',\n },\n {\n label: 'Encrypted Uint64',\n value: 'uint64',\n maxValue: BigInt(2 ** 64 - 1), // 18,446,744,073,709,551,615\n description: '64-bit unsigned integer (0 to 18,446,744,073,709,551,615)',\n },\n {\n label: 'Encrypted Uint128',\n value: 'uint128',\n maxValue: BigInt(2 ** 128 - 1), // Very large number\n description: '128-bit unsigned integer',\n },\n {\n label: 'Encrypted Address',\n value: 'address',\n maxValue: null, // Address validation is different\n description: 'Ethereum address (0x...)',\n },\n];\n\nexport const NOOP_CALLBACK = () => () => {};\n\n/**\n * Truncates a hex string (address or hash) to show beginning and end with ellipsis\n * @param value - The hex string to truncate (address, hash, etc.)\n * @param start - Number of characters to show at the start (default: 6, includes 0x)\n * @param end - Number of characters to show at the end (default: 4)\n * @returns Truncated string, or original if too short\n *\n * @example\n * truncateHash('0x1234567890abcdef1234567890abcdef12345678')\n * // Returns: '0x1234...5678'\n */\nexport const truncateHash = (value: string, start = 6, end = 4): string => {\n if (value.length <= start + end) return value;\n return `${value.slice(0, start)}...${value.slice(-end)}`;\n};\n\n/**\n * Truncates an Ethereum address (alias for truncateHash with address-friendly defaults)\n * @param address - The full Ethereum address (0x...)\n * @param start - Number of characters to show at the start (default: 6, includes 0x)\n * @param end - Number of characters to show at the end (default: 4)\n * @returns Truncated address string, or undefined if address is invalid\n *\n * @example\n * truncateAddress('0x1234567890abcdef1234567890abcdef12345678')\n * // Returns: '0x1234...5678'\n */\nexport function truncateAddress(\n address: string | undefined | null,\n start: number = 6,\n end: number = 4\n): string | undefined {\n if (!address) return undefined;\n return truncateHash(address, start, end);\n}\n\n/**\n * Sanitizes numeric input to only allow numbers and a single decimal point\n * @param value - The input value to sanitize\n * @returns Sanitized value with only numbers and at most one decimal point\n *\n * @example\n * sanitizeNumericInput('123.45.67') // Returns: '123.4567'\n * sanitizeNumericInput('abc123.45') // Returns: '123.45'\n * sanitizeNumericInput('123') // Returns: '123'\n */\nexport function sanitizeNumericInput(value: string): string {\n // Only allow numbers and decimal point\n const cleaned = value.replace(/[^0-9.]/g, '');\n\n // Ensure only one decimal point\n const parts = cleaned.split('.');\n if (parts.length > 2) {\n return parts[0] + '.' + parts.slice(1).join('');\n }\n\n return cleaned;\n}\n\n/**\n * Formats a timestamp as a relative time string (e.g., \"2 hours ago\")\n * @param timestamp - Unix timestamp in milliseconds\n * @returns Formatted relative time string\n */\nexport const formatRelativeTime = (timestamp: number): string => {\n const now = Date.now();\n const diff = now - timestamp;\n\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (days > 0) return `${days} day${days > 1 ? 's' : ''} ago`;\n if (hours > 0) return `${hours} hour${hours > 1 ? 's' : ''} ago`;\n if (minutes > 0) return `${minutes} minute${minutes > 1 ? 's' : ''} ago`;\n return 'Just now';\n};\n\nexport const formatExpirationLabel = (expiration?: number) => {\n if (!expiration) {\n return { label: 'Unknown', expired: false, expiringSoon: false };\n }\n\n const now = Math.floor(Date.now() / 1000);\n const diff = expiration - now;\n\n const expired = diff <= 0;\n const expiringSoon = diff <= 1 * 60 * 60;\n if (expired) {\n return { label: 'Expired', expired: true, expiringSoon: false };\n }\n\n const day = 60 * 60 * 24;\n const hour = 60 * 60;\n const minute = 60;\n\n if (diff >= day) {\n const days = Math.ceil(diff / day);\n return { label: `${days} Day${days === 1 ? '' : 's'}`, expired: false, expiringSoon };\n }\n\n if (diff >= hour) {\n const hours = Math.ceil(diff / hour);\n return { label: `${hours} Hour${hours === 1 ? '' : 's'}`, expired: false, expiringSoon };\n }\n\n const minutes = Math.max(1, Math.ceil(diff / minute));\n return { label: `${minutes} Minute${minutes === 1 ? '' : 's'}`, expired: false, expiringSoon };\n};\n\nexport function isReactNode(data: unknown): data is React.ReactNode {\n // Check for primitive types that are valid React nodes or if it's a valid React element\n if (\n data === null ||\n data === undefined ||\n typeof data === 'string' ||\n typeof data === 'number' ||\n typeof data === 'boolean' ||\n isValidElement(data)\n ) {\n return true;\n }\n\n // Check if it's an array of React nodes (recursive check)\n if (Array.isArray(data)) {\n return data.every(isReactNode);\n }\n\n return false;\n}\n","import { useMemo, useSyncExternalStore } from 'react';\nimport { CONNECT_STORE_DEFAULTS, type CofheClient, type CofheClientConnectionState } from '@cofhe/sdk';\nimport { useCofheContext } from '../providers';\nimport { NOOP_CALLBACK } from '../utils';\n\nconst subscribeToConnectionConstructor = (client: CofheClient) => (onStoreChange: () => void) => {\n return client.subscribe(() => {\n onStoreChange();\n });\n};\nconst getConnectionSnapshotConstructor = (client: CofheClient) => () => client.getSnapshot();\n\nconst DEFAULT_SNAPSHOT_GETTER = () => CONNECT_STORE_DEFAULTS;\n\n// sync core store\nexport const useCofheConnection = (): CofheClientConnectionState => {\n const client = useCofheContext().client;\n const { subscribeToConnection, getConnectionSnapshot } = useMemo(() => {\n return {\n subscribeToConnection: client && subscribeToConnectionConstructor(client),\n getConnectionSnapshot: client && getConnectionSnapshotConstructor(client),\n };\n }, [client]);\n\n return useSyncExternalStore(\n // fallback to default store and no subscription if client is not initialized yet\n subscribeToConnection || NOOP_CALLBACK,\n getConnectionSnapshot || DEFAULT_SNAPSHOT_GETTER,\n getConnectionSnapshot || undefined\n );\n};\n\nexport const useCofheIsConnected = (): boolean => {\n const { connected } = useCofheConnection();\n return connected;\n};\n\nexport const useCofheAccount = (): `0x${string}` | undefined => {\n const { account } = useCofheConnection();\n return account;\n};\n\nexport const useCofheChainId = (): number | undefined => {\n const { chainId } = useCofheConnection();\n return chainId;\n};\n\nexport const useCofheSupportedChains = () => {\n const client = useCofheContext().client;\n return client.config.supportedChains;\n};\n\nexport const useCofhePublicClient = () => useCofheConnection().publicClient;\n\nexport const useCofheWalletClient = () => useCofheConnection().walletClient;\n","/**\n * Simple utility to merge class names\n * Filters out falsy values and joins with spaces\n */\nexport const cn = (...classes: (string | undefined | null | false)[]): string => {\n return classes.filter(Boolean).join(' ').replace(/\\s+/g, ' ').trim();\n};\n","import {\n type Abi,\n type Address,\n type ContractFunctionArgs,\n type ContractFunctionName,\n type ContractFunctionReturnType,\n type PublicClient,\n} from 'viem';\nimport { cofheLogger } from './debug';\n\nexport type WaitUntilRpcAwareAndReadContractOptions = {\n onSuccess?: () => void;\n pollingInterval?: number;\n signal?: AbortSignal;\n};\n\nfunction abortError(message = 'Aborted') {\n const err = new Error(message);\n err.name = 'AbortError';\n return err;\n}\n\nasync function sleep(ms: number, signal?: AbortSignal) {\n if (ms <= 0) return;\n if (signal?.aborted) throw abortError();\n\n await new Promise<void>((resolve, reject) => {\n const cleanup = () => {\n if (signal) signal.removeEventListener('abort', onAbort);\n };\n\n const onAbort = () => {\n clearTimeout(timeout);\n cleanup();\n reject(abortError());\n };\n\n const timeout = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n\n if (signal) signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/**\n * Waits until an RPC node is aware of a specific `blockHash`, then performs the\n * contract read.\n *\n * Implementation detail: the function issues two RPC calls concurrently:\n * - `eth_getBlockByHash(blockHash)` to confirm the node has the block\n * - `eth_call` (via `publicClient.call`) for the actual contract read\n *\n * If your viem client transport has batching enabled, these concurrent calls are\n * typically sent as a single JSON-RPC batch — which is important when your RPC\n * provider load-balances across nodes.\n */\nexport type ReadContractResult<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n> = ContractFunctionReturnType<\n TAbi,\n 'pure' | 'view',\n TfunctionName,\n ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>\n>;\nexport async function maybeWaitUntilRpcAwareAndReadContract<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n>(\n publicClient: PublicClient,\n params: {\n blockHashToBeAwareOf?: `0x${string}`;\n address: Address;\n abi: TAbi;\n functionName: TfunctionName;\n args: ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>;\n },\n options: WaitUntilRpcAwareAndReadContractOptions = {}\n): Promise<ReadContractResult<TAbi, TfunctionName>> {\n // if no blockHash given to be aware of, just read directly\n if (!params.blockHashToBeAwareOf)\n return publicClient.readContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n });\n\n const pollingInterval = options.pollingInterval ?? 1_000;\n\n cofheLogger.log(`Waiting until RPC is aware of block ${params.blockHashToBeAwareOf} to read contract...`);\n let done = false;\n while (!done) {\n if (options.signal?.aborted) throw abortError();\n\n const [blockRes, readRes] = await Promise.allSettled([\n publicClient.request({\n method: 'eth_getBlockByHash',\n params: [params.blockHashToBeAwareOf, false],\n }),\n publicClient.readContract({\n address: params.address,\n abi: params.abi,\n functionName: params.functionName,\n args: params.args,\n }),\n ]);\n\n const blockKnown = blockRes.status === 'fulfilled' && blockRes.value != null;\n\n if (blockKnown && readRes.status === 'fulfilled') {\n options?.onSuccess?.();\n done = true;\n return readRes.value;\n }\n\n await sleep(pollingInterval, options.signal);\n }\n\n // Unreachable, but keeps TS happy.\n throw new Error('Unexpected exit from wait loop');\n}\n","import errorsJson from '@fhenixprotocol/cofhe-errors/errors.json';\nimport { ContractFunctionExecutionError, ContractFunctionRevertedError } from 'viem';\n\nexport type CofheSolidityError = {\n name: string;\n selector: `0x${string}`;\n signature: string;\n source: string;\n inputs: string[];\n inputTypes: string[];\n};\n\nfunction is0xString(value: string): value is `0x${string}` {\n return value.startsWith('0x');\n}\n\nfunction isStringArray(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((v) => typeof v === 'string');\n}\n\nfunction isCofheSolidityError(value: unknown): value is CofheSolidityError {\n if (typeof value !== 'object' || value === null) return false;\n if (!('name' in value) || typeof value.name !== 'string') return false;\n if (!('selector' in value) || typeof value.selector !== 'string') return false;\n if (!is0xString(value.selector)) return false;\n if (!('signature' in value) || typeof value.signature !== 'string') return false;\n if (!('source' in value) || typeof value.source !== 'string') return false;\n if (!('inputs' in value) || !isStringArray(value.inputs)) return false;\n if (!('inputTypes' in value) || !isStringArray(value.inputTypes)) return false;\n return true;\n}\n\nfunction parseCofheSolidityErrors(value: unknown): readonly CofheSolidityError[] {\n if (!Array.isArray(value)) return [];\n return value.filter(isCofheSolidityError);\n}\n\nconst errorsJsonUnknown: unknown = errorsJson;\nconst errors = parseCofheSolidityErrors(errorsJsonUnknown);\n\nfunction normalizeSelector(selector: string): `0x${string}` | undefined {\n if (typeof selector !== 'string') return undefined;\n const s = selector.trim().toLowerCase();\n if (!s.startsWith('0x')) return undefined;\n // Solidity custom error selector is 4 bytes => 10 chars including 0x prefix.\n if (s.length < 10) return undefined;\n const candidate = s.slice(0, 10);\n if (!is0xString(candidate)) return undefined;\n return candidate;\n}\n\nexport function decodeCofheErrorSelector(selectorOrRevertData: string): CofheSolidityError | undefined {\n const selector = normalizeSelector(selectorOrRevertData);\n if (!selector) return undefined;\n return errors.find((e) => e.selector.toLowerCase() === selector);\n}\n\nexport function cofheHumanizeRevertReason(reasonOfRevert: string): string | undefined {\n const decoded = decodeCofheErrorSelector(reasonOfRevert);\n if (!decoded) return undefined;\n\n // Keep it compact for UI toasts, but still useful.\n // Example: \"OwnableUnauthorizedAccount(address) (Ownable2StepUpgradeable)\"\n return `${decoded.signature} (${decoded.source})`;\n}\n\nfunction extractSelectorFromMessage(message: string): string | undefined {\n // Common viem patterns:\n // - \"execution reverted: 0x118cdaa7\"\n // - \"... reverted with the following signature: 0xd8aba367 ...\"\n const match = message.match(/0x[0-9a-fA-F]{8}/);\n return match?.[0];\n}\n\nexport function cofheHumanizeViemError(error: unknown): string | undefined {\n if (error instanceof ContractFunctionExecutionError) {\n if (error.cause instanceof ContractFunctionRevertedError) {\n const raw = error.cause.raw;\n if (typeof raw === 'string') {\n return cofheHumanizeRevertReason(raw);\n }\n }\n }\n\n if (error instanceof Error) {\n const selector = extractSelectorFromMessage(error.message);\n if (selector) return cofheHumanizeRevertReason(selector);\n }\n\n return undefined;\n}\n","import type { CofheClient } from '@cofhe/sdk';\nimport { useCofheContext } from '../providers';\nimport { useCallback, useMemo, useSyncExternalStore } from 'react';\nimport { NOOP_CALLBACK } from '../utils';\nimport { PERMIT_STORE_DEFAULTS, PermitUtils, type Permit } from '@cofhe/sdk/permits';\nimport { useCofheConnection } from './useCofheConnection';\n\nconst subscribeToPermitsConstructor = (client: CofheClient) => (onStoreChange: () => void) => {\n return client.permits.subscribe(() => {\n onStoreChange();\n });\n};\n\nconst getPermitsSnapshotConstructor = (client: CofheClient) => () => client.permits.getSnapshot();\n\n// type PermitsState = ReturnType<CofheClientPermits['getSnapshot']>;\n\nconst DEFAULT_SNAPSHOT_GETTER = () => PERMIT_STORE_DEFAULTS;\n\nconst useCofhePermitsStore = () => {\n const client = useCofheContext().client;\n const { subscribeToConnection, getConnectionSnapshot } = useMemo(() => {\n return {\n subscribeToConnection: client && subscribeToPermitsConstructor(client),\n getConnectionSnapshot: client && getPermitsSnapshotConstructor(client),\n };\n }, [client]);\n\n const state = useSyncExternalStore(\n // fallback to default store and no subscription if client is not initialized yet\n subscribeToConnection || NOOP_CALLBACK,\n getConnectionSnapshot || DEFAULT_SNAPSHOT_GETTER,\n getConnectionSnapshot || undefined\n );\n return { state, client };\n};\n\nexport const useCofheActivePermit = ():\n | {\n permit: Permit;\n isValid: boolean;\n }\n | undefined => {\n const { account, chainId, connected } = useCofheConnection();\n\n const { state } = useCofhePermitsStore();\n\n const allPermits = chainId && account ? state.permits[chainId]?.[account] : undefined;\n // active permit\n\n const hash = account && chainId ? state.activePermitHash[chainId]?.[account] : undefined;\n const serialized = hash && allPermits ? allPermits[hash] : undefined;\n\n const permitData = useMemo(() => {\n const _permit = serialized ? PermitUtils.deserialize(serialized) : undefined;\n if (!_permit || !hash) return undefined;\n return {\n permit: _permit,\n isValid: _permit ? PermitUtils.isValid(_permit).valid : false,\n hash,\n };\n }, [serialized, hash]);\n\n return connected ? permitData : undefined;\n};\n\nexport const useCofheActivePermitHash = (): string | undefined => {\n const activePermit = useCofheActivePermit();\n return useMemo(() => activePermit?.permit.hash, [activePermit?.permit.hash]);\n};\n\nexport const useCofheAllPermits = (): Permit[] => {\n const { account, chainId, connected } = useCofheConnection();\n\n const { state } = useCofhePermitsStore();\n\n const allPermits = chainId && account ? state.permits[chainId]?.[account] : undefined;\n\n const allPermitsWithHashes = useMemo(\n () =>\n allPermits\n ? Object.keys(allPermits)\n .filter((hash) => !!allPermits[hash])\n .map((hash) => {\n const serializedPermit = allPermits[hash];\n if (!serializedPermit) throw new Error('Permit data missing');\n\n return PermitUtils.deserialize(serializedPermit);\n })\n : [],\n [allPermits]\n );\n\n return connected ? allPermitsWithHashes : [];\n};\n\nexport const useCofhePermit = (hash: string): Permit | undefined => {\n const { account, chainId, connected } = useCofheConnection();\n const { state } = useCofhePermitsStore();\n return useMemo(() => {\n if (!connected || !chainId || !account) return undefined;\n const serializedPermit = state.permits[chainId]?.[account]?.[hash];\n if (!serializedPermit) return undefined;\n return PermitUtils.deserialize(serializedPermit);\n }, [connected, chainId, account, hash, state.permits]);\n};\n\ntype Callbacks = {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n};\n\nexport const useCofheRemovePermit = ({ onSuccess, onError }: Callbacks = {}) => {\n const { account, chainId } = useCofheConnection();\n const { client } = useCofhePermitsStore();\n\n return useCallback(\n async (hashToRemove: string) => {\n try {\n if (!client || !chainId || !account) {\n throw new Error('Client, chainId, and account must be defined to remove a permit');\n }\n\n client.permits.removePermit(hashToRemove, chainId, account);\n onSuccess?.();\n } catch (error) {\n onError?.(new Error(error instanceof Error ? error.message : 'Unknown error'));\n }\n },\n [client, chainId, account, onSuccess, onError]\n );\n};\n\nexport const useCofheSelectPermit = ({ onSuccess, onError }: Callbacks = {}) => {\n const { account, chainId } = useCofheConnection();\n const { client } = useCofhePermitsStore();\n\n return useCallback(\n (hashToSet: string) => {\n try {\n if (!client || !chainId || !account) {\n throw new Error('Client, chainId, and account must be defined to set active permit hash');\n }\n client.permits.selectActivePermit(hashToSet, chainId, account);\n onSuccess?.();\n } catch (error) {\n onError?.(new Error(error instanceof Error ? error.message : 'Unknown error'));\n }\n },\n [client, chainId, account, onSuccess, onError]\n );\n};\n","import { TASK_MANAGER_ADDRESS } from '@cofhe/sdk';\nimport {\n useCofheReadContract,\n type UseCofheReadContractQueryOptions,\n type UseCofheReadContractResult,\n} from './useCofheReadContract';\n\nconst TASK_MANAGER_IS_ENABLED_ABI = [\n {\n type: 'function',\n name: 'isEnabled',\n inputs: [],\n outputs: [\n {\n name: 'enabled',\n type: 'bool',\n internalType: 'bool',\n },\n ],\n stateMutability: 'view',\n },\n] as const;\n\nexport type UseCofheEnabledOptions = UseCofheReadContractQueryOptions<typeof TASK_MANAGER_IS_ENABLED_ABI, 'isEnabled'>;\n\nexport type UseCofheEnabledResult = UseCofheReadContractResult<typeof TASK_MANAGER_IS_ENABLED_ABI, 'isEnabled'>;\n\n/**\n * Reads `TaskManager.isEnabled()` to determine whether Cofhe is enabled on the connected chain.\n */\nexport function useCofheEnabled(options?: UseCofheEnabledOptions): UseCofheEnabledResult {\n return useCofheReadContract(\n {\n address: TASK_MANAGER_ADDRESS,\n abi: TASK_MANAGER_IS_ENABLED_ABI,\n functionName: 'isEnabled',\n requiresPermit: false,\n },\n options\n );\n}\n","import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport {\n type Address,\n type ContractFunctionReturnType,\n type ContractFunctionName,\n type ContractFunctionArgs,\n type ReadContractReturnType,\n} from 'viem';\nimport { useCofheChainId, useCofhePublicClient } from './useCofheConnection';\nimport { useCofheActivePermit } from './useCofhePermits';\nimport { assert } from 'ts-essentials';\nimport { useInternalQuery } from '../providers/index';\nimport { transformEncryptedReturnTypes, type Abi, type CofheReturnType, type ContractReturnType } from '@cofhe/abi';\nimport { serializeBigintRecursively } from '../utils/serializeBigint.js';\n\nconst QUERY_CACHE_PREFIX = 'cofheReadContract';\n\nexport function constructCofheReadContractQueryKey({\n cofheChainId,\n address,\n functionName,\n args,\n requiresPermit,\n activePermitHash,\n enabled,\n}: {\n cofheChainId?: number;\n address?: Address;\n functionName?: string;\n args?: readonly unknown[];\n requiresPermit?: boolean;\n activePermitHash?: string;\n enabled?: boolean;\n}): readonly unknown[] {\n return [\n ...constructCofheReadContractQueryForInvalidation({\n cofheChainId,\n address,\n functionName,\n }),\n\n args ? serializeBigintRecursively(args) : [],\n requiresPermit ? activePermitHash : undefined,\n // normally, \"enabled\" shouldn't be part of queryKey, but without adding it, there is a weird bug: when there's a CofheError, query still running queryFn resulting in the blank screen\n enabled,\n ];\n}\n\nexport function constructCofheReadContractQueryForInvalidation({\n cofheChainId,\n address,\n functionName,\n}: {\n cofheChainId?: number;\n address?: Address;\n functionName?: string;\n // add more specificity if needed. Just make sure it matches the order of keys\n}): readonly unknown[] {\n return [QUERY_CACHE_PREFIX, cofheChainId, address, functionName];\n}\n\nexport type UseCofheReadContractQueryOptions<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n> = Omit<UseQueryOptions<CofheReturnType<TAbi, TfunctionName>, Error>, 'queryKey' | 'queryFn'> & {\n enabled?: boolean; // TODO: check callback variant, maybe it'll fix the issue above about forcing enable to be query key\n};\n\nexport function getEnabledForCofheReadContract(params: {\n publicClient: unknown;\n address?: Address;\n abi?: Abi;\n functionName?: string;\n requiresPermit: boolean;\n hasActivePermit: boolean;\n userEnabled?: boolean;\n}): boolean {\n const { publicClient, address, abi, functionName, requiresPermit, hasActivePermit, userEnabled } = params;\n\n return (\n !!publicClient &&\n !!address &&\n !!abi &&\n !!functionName &&\n (!requiresPermit || hasActivePermit) &&\n (userEnabled ?? true)\n );\n}\n\nfunction convertReadContractResultToCofheReturnType<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n TArgs extends ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>,\n>(\n value: ContractFunctionReturnType<TAbi, 'pure' | 'view', TfunctionName, TArgs>\n): ContractReturnType<\n TAbi,\n TfunctionName\n //TArgs\n> {\n // TODO: convertViemReturnTypeToCofheReturnType -- need core typing changes, currently seems to not support fn overloads\n // viems inferred TArgs mismatch Cofhe's\n return value as ContractReturnType<\n TAbi,\n TfunctionName\n //TArgs\n >;\n}\n\nexport function createCofheReadContractQueryOptions<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n TArgs extends ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>,\n>(params: {\n enabled: boolean;\n cofheChainId?: number;\n address?: Address;\n abi?: TAbi;\n functionName?: TfunctionName;\n args?: TArgs;\n requiresPermit: boolean;\n activePermitHash?: string;\n publicClient: ReturnType<typeof useCofhePublicClient>;\n queryOptions?: UseCofheReadContractQueryOptions<TAbi, TfunctionName>;\n}): UseQueryOptions<CofheReturnType<TAbi, TfunctionName>, Error> {\n const {\n enabled,\n cofheChainId,\n address,\n abi,\n functionName,\n args,\n requiresPermit,\n activePermitHash,\n publicClient,\n queryOptions,\n } = params;\n\n const { enabled: _ignoredEnabled, ...restQueryOptions } = queryOptions || {};\n\n return {\n enabled,\n queryKey: constructCofheReadContractQueryKey({\n cofheChainId,\n address,\n functionName,\n args: Array.isArray(args) ? args : undefined,\n requiresPermit,\n activePermitHash,\n enabled,\n }),\n queryFn: async () => {\n assert(address, 'Contract address should be guaranteed by enabled check');\n assert(publicClient, 'PublicClient should be guaranteed by enabled check');\n assert(abi, 'ABI should be guaranteed by enabled check');\n assert(functionName, 'Function name should be guaranteed by enabled check');\n\n const out = await publicClient.readContract({\n address,\n abi,\n functionName,\n args,\n });\n\n const convertedOut = convertReadContractResultToCofheReturnType<TAbi, TfunctionName, TArgs>(out);\n\n const transformed = transformEncryptedReturnTypes(abi, functionName, convertedOut);\n\n return transformed;\n },\n ...restQueryOptions,\n };\n}\n\n/**\n * Generic hook: read a contract and return the result (with permit/error gating support).\n * is Cofhe-ABI aware: returns CofheReturnType (but doesn't support TArgs typing yet).\n */\nexport type UseCofheReadContractResult<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n> = UseQueryResult<CofheReturnType<TAbi, TfunctionName>, Error> & {\n disabledDueToMissingValidPermit: boolean;\n};\nexport function useCofheReadContract<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n>(\n params: {\n address?: Address;\n abi?: TAbi;\n functionName?: TfunctionName;\n args?: ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>;\n requiresPermit?: boolean;\n },\n queryOptions?: UseCofheReadContractQueryOptions<TAbi, TfunctionName>\n): UseCofheReadContractResult<TAbi, TfunctionName> {\n const { address, abi, functionName, args, requiresPermit = true } = params;\n\n const publicClient = useCofhePublicClient();\n const cofheChainId = useCofheChainId();\n const activePermit = useCofheActivePermit();\n\n const enabled = getEnabledForCofheReadContract({\n publicClient,\n address,\n abi,\n functionName,\n requiresPermit,\n hasActivePermit: !!activePermit,\n userEnabled: queryOptions?.enabled,\n });\n\n const result = useInternalQuery(\n createCofheReadContractQueryOptions({\n enabled,\n cofheChainId,\n address,\n abi,\n functionName,\n args: Array.isArray(args) ? args : undefined,\n requiresPermit,\n activePermitHash: activePermit?.permit.hash,\n publicClient,\n queryOptions,\n })\n );\n\n return {\n ...result,\n disabledDueToMissingValidPermit: requiresPermit && (!activePermit || !activePermit.isValid),\n };\n}\n","function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nexport function serializeIfBigint(value: unknown): unknown {\n if (typeof value === 'bigint') return value.toString();\n return value;\n}\n\n/**\n * Converts `bigint` values to strings so structures can safely be used in e.g. react-query keys.\n *\n * - Arrays are mapped recursively\n * - Plain objects are copied recursively\n * - All other values are returned as-is (except bigint -> string)\n */\nexport function serializeBigintRecursively(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(serializeBigintRecursively);\n if (isRecord(value)) {\n const out: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(value)) out[key] = serializeBigintRecursively(nested);\n return out;\n }\n return serializeIfBigint(value);\n}\n","import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { useCofheContext } from '../providers/CofheProvider';\nimport { useMemo } from 'react';\nimport {\n ETH_ADDRESS_LOWERCASE,\n isSupportedTokenConfidentialityType,\n type Erc20Pair,\n type Token,\n} from '../types/token.js';\nimport { useInternalQueries } from '../providers/index.js';\nimport type { Address } from 'viem';\nimport { useCofheChainId } from './useCofheConnection';\nimport { useCustomTokensStore } from '@/stores/customTokensStore';\nimport { useResolvedCofheToken } from './useResolvedCofheToken';\n\nexport { ETH_ADDRESS_LOWERCASE, type Token, type Erc20Pair };\n\nfunction isSupportedToken(token: Token): boolean {\n const confidentialityType = token.extensions?.fhenix?.confidentialityType;\n return isSupportedTokenConfidentialityType(confidentialityType);\n}\n\ntype TokenList = {\n name: string;\n timestamp: string;\n version: {\n major: number;\n minor: number;\n patch: number;\n };\n tokens: Token[];\n};\n\ntype UseTokenListsResult = UseQueryResult<TokenList, Error>[];\ntype UseTokenListsInput = {\n chainId?: number;\n};\ntype UseTokenListsOptions = Omit<UseQueryOptions<TokenList, Error>, 'queryKey' | 'queryFn' | 'select'>;\n\nfunction getCustomTokensForChain(customTokensByChainId: Record<string, Token[]>, chainId?: number): Token[] {\n if (!chainId) return [];\n return customTokensByChainId[chainId.toString()] ?? [];\n}\n\n// Returns array of query results for token lists for the current network\nexport function useCofheTokenLists(\n { chainId }: UseTokenListsInput,\n queryOptions?: UseTokenListsOptions\n): UseTokenListsResult {\n const widgetConfig = useCofheContext().client.config.react;\n const tokensListsUrls = chainId ? widgetConfig.tokenLists?.[chainId] : [];\n\n const queriesOptions: UseQueryOptions<TokenList, Error>[] =\n tokensListsUrls?.map((url) => ({\n cacheTime: Infinity,\n staleTime: Infinity,\n refetchOnMount: false,\n refetchOnWindowFocus: false,\n queryKey: ['tokenList', chainId, url],\n queryFn: async ({ signal }): Promise<TokenList> => {\n const timestamp = Date.now();\n const urlWithCacheBust = `${url}${url.includes('?') ? '&' : '?'}v=${timestamp}`;\n const res = await fetch(urlWithCacheBust, { signal });\n if (!res.ok) {\n throw new Error(`Failed to fetch token list: ${res.status} ${res.statusText}`);\n }\n return await res.json();\n },\n select: (data: TokenList): TokenList => {\n // filter only tokens for the current chain (some lists contain multiple chains)\n return {\n ...data,\n tokens: data.tokens.filter((token) => token.chainId === chainId && isSupportedToken(token)),\n };\n },\n ...queryOptions,\n })) || [];\n\n const result = useInternalQueries({\n queries: queriesOptions,\n });\n\n return result;\n}\n\nexport function selectTokensFromTokensList(tokenList: TokenList): Token[] {\n return tokenList.tokens;\n}\n\nexport function useCofheTokens(chainId?: number): Token[] {\n const tokenLists = useCofheTokenLists({ chainId });\n const customTokensByChainId = useCustomTokensStore((state) => state.customTokensByChainId);\n const customTokens = getCustomTokensForChain(customTokensByChainId, chainId);\n\n const tokens = useMemo(() => {\n const map = new Map<string, Token>();\n\n tokenLists.forEach((result) => {\n if (!result.data) return;\n\n result.data.tokens.forEach((token) => {\n const key = `${token.chainId}-${token.address.toLowerCase()}`;\n if (map.has(key)) return;\n map.set(key, token);\n });\n });\n\n customTokens.forEach((token) => {\n const key = `${token.chainId}-${token.address.toLowerCase()}`;\n if (map.has(key)) return;\n map.set(key, token);\n });\n\n return Array.from(map.values());\n }, [customTokens, tokenLists]);\n return tokens;\n}\n\nexport function useCofheToken(\n { chainId: _chainId, address }: { chainId?: number; address?: Address },\n // TODO: after adding this functionality, don't fetch if not enabled\n metdataQueryOptions?: Omit<UseQueryOptions<Token | undefined, Error>, 'queryKey' | 'queryFn' | 'select'>\n) {\n const cofheChainId = useCofheChainId();\n const chainId = _chainId ?? cofheChainId;\n\n const tokens = useCofheTokens(chainId);\n const tokenFromList = useMemo(() => {\n if (!address || !chainId) return;\n return tokens.find((t) => t.chainId === chainId && t.address.toLowerCase() === address.toLowerCase());\n }, [address, chainId, tokens]);\n\n const resolvedToken = useResolvedCofheToken(\n {\n chainId,\n address,\n },\n {\n ...metdataQueryOptions,\n enabled: (metdataQueryOptions?.enabled ?? true) && !!address && !!chainId && !tokenFromList,\n }\n );\n\n return tokenFromList ?? resolvedToken.data;\n}\n","import { create } from 'zustand';\nimport { createJSONStorage, persist } from 'zustand/middleware';\n\nimport type { Token } from '@/types/token';\n\ntype CustomTokensStore = {\n customTokensByChainId: Record<string, Token[]>;\n};\n\ntype CustomTokensActions = {\n addCustomToken: (token: Token) => void;\n removeCustomToken: (params: { chainId: number; address: Token['address'] }) => void;\n};\n\nexport const useCustomTokensStore = create<CustomTokensStore & CustomTokensActions>()(\n persist(\n (set) => ({\n customTokensByChainId: {},\n addCustomToken: (token) => {\n set((state) => {\n const chainKey = token.chainId.toString();\n const existing = state.customTokensByChainId[chainKey] ?? [];\n const normalizedAddress = token.address.toLowerCase();\n\n return {\n customTokensByChainId: {\n ...state.customTokensByChainId,\n [chainKey]: [token, ...existing.filter((item) => item.address.toLowerCase() !== normalizedAddress)],\n },\n };\n });\n },\n removeCustomToken: ({ chainId, address }) => {\n set((state) => {\n const chainKey = chainId.toString();\n const existing = state.customTokensByChainId[chainKey] ?? [];\n const filtered = existing.filter((item) => item.address.toLowerCase() !== address.toLowerCase());\n\n if (filtered.length === existing.length) {\n return state;\n }\n\n const next = { ...state.customTokensByChainId };\n if (filtered.length === 0) {\n delete next[chainKey];\n } else {\n next[chainKey] = filtered;\n }\n\n return {\n customTokensByChainId: next,\n };\n });\n },\n }),\n {\n name: 'cofhesdk-react-custom-tokens',\n storage: createJSONStorage(() => localStorage),\n }\n )\n);\n","import type { UseQueryOptions } from '@tanstack/react-query';\nimport { type Address, isAddress, parseAbi, zeroAddress } from 'viem';\n\nimport { ERC20_DECIMALS_ABI, ERC20_NAME_ABI, ERC20_SYMBOL_ABI } from '@/constants/erc20ABIs';\nimport { getSupportedTokenDetectionConfigs } from '@/constants/confidentialTokenABIs';\nimport { useInternalQuery } from '@/providers';\nimport { ETH_ADDRESS_LOWERCASE, type SupportedTokenConfidentialityType, type Token } from '@/types/token';\n\nimport { useCofheChainId, useCofhePublicClient } from './useCofheConnection';\n\nconst SUPPORTED_TOKEN_DETECTION_CONFIGS = getSupportedTokenDetectionConfigs();\n\nconst TOKEN_PAIR_GETTER_ABIS = {\n token: parseAbi(['function token() view returns (address)']),\n underlying: parseAbi(['function underlying() view returns (address)']),\n underlyingToken: parseAbi(['function underlyingToken() view returns (address)']),\n asset: parseAbi(['function asset() view returns (address)']),\n erc20: parseAbi(['function erc20() view returns (address)']),\n erc20Token: parseAbi(['function erc20Token() view returns (address)']),\n} as const;\n\nconst PAIR_GETTER_ENTRIES = [\n ['token', TOKEN_PAIR_GETTER_ABIS.token],\n ['underlying', TOKEN_PAIR_GETTER_ABIS.underlying],\n ['underlyingToken', TOKEN_PAIR_GETTER_ABIS.underlyingToken],\n ['asset', TOKEN_PAIR_GETTER_ABIS.asset],\n ['erc20', TOKEN_PAIR_GETTER_ABIS.erc20],\n ['erc20Token', TOKEN_PAIR_GETTER_ABIS.erc20Token],\n] as const;\n\nfunction pickUnderlyingPairAddress(results: readonly unknown[], tokenAddress: Address): Address | undefined {\n for (const result of results) {\n if (!result || typeof result !== 'object') continue;\n\n const typedResult = result as { status?: unknown; result?: unknown };\n if (typedResult.status !== 'success') continue;\n\n const candidate = typedResult.result;\n if (typeof candidate !== 'string' || !isAddress(candidate)) continue;\n if (candidate.toLowerCase() === zeroAddress) continue;\n if (candidate.toLowerCase() === tokenAddress.toLowerCase()) continue;\n return candidate;\n }\n\n return undefined;\n}\n\ntype UseResolvedCofheTokenInput = {\n chainId?: number;\n address?: Address;\n};\n\ntype UseResolvedCofheTokenOptions = Omit<UseQueryOptions<Token | undefined, Error>, 'queryKey' | 'queryFn'>;\n\nexport function useResolvedCofheToken(\n { chainId: _chainId, address }: UseResolvedCofheTokenInput,\n queryOptions?: UseResolvedCofheTokenOptions\n) {\n const publicClient = useCofhePublicClient();\n const cofheChainId = useCofheChainId();\n const chainId = _chainId ?? cofheChainId;\n\n return useInternalQuery({\n queryKey: ['resolvedCofheToken', chainId, address?.toLowerCase()],\n queryFn: async (): Promise<Token | undefined> => {\n if (!publicClient) {\n throw new Error('PublicClient is required to resolve a token');\n }\n if (!chainId || !address) {\n return undefined;\n }\n\n const metadataResults = await publicClient.multicall({\n contracts: [\n {\n address,\n abi: ERC20_DECIMALS_ABI,\n functionName: 'decimals',\n },\n {\n address,\n abi: ERC20_SYMBOL_ABI,\n functionName: 'symbol',\n },\n {\n address,\n abi: ERC20_NAME_ABI,\n functionName: 'name',\n },\n ],\n });\n\n const decimals = metadataResults[0].result;\n const symbol = metadataResults[1].result;\n const name = metadataResults[2].result;\n\n if (decimals == null || symbol == null || name == null) {\n throw new Error('Failed to fetch token metadata');\n }\n\n const [supportedType, pairGetterResults] = await Promise.all([\n Promise.all(\n SUPPORTED_TOKEN_DETECTION_CONFIGS.map(async (entry) => {\n const detected = await publicClient\n .readContract({\n address,\n abi: entry.probe.abi,\n functionName: entry.probe.functionName,\n args: entry.probe.args,\n })\n .then(() => true)\n .catch(() => false);\n\n return detected ? entry : null;\n })\n ).then((entries) => entries.find((entry) => entry != null) ?? null),\n publicClient.multicall({\n contracts: PAIR_GETTER_ENTRIES.map(([, abi]) => ({\n address,\n abi,\n functionName: abi[0].name,\n })),\n allowFailure: true,\n }),\n ]);\n\n if (!supportedType) {\n throw new Error('Address is not a supported CoFHE token');\n }\n\n const confidentialityType: SupportedTokenConfidentialityType = supportedType.confidentialityType;\n\n const extensions: Token['extensions'] = {\n fhenix: {\n confidentialityType,\n confidentialValueType: supportedType.confidentialValueType,\n },\n };\n\n if (confidentialityType === 'wrapped') {\n const pairAddress = pickUnderlyingPairAddress(pairGetterResults, address);\n if (pairAddress) {\n if (pairAddress.toLowerCase() === ETH_ADDRESS_LOWERCASE) {\n extensions.fhenix.erc20Pair = {\n address: ETH_ADDRESS_LOWERCASE,\n symbol: 'ETH',\n decimals: 18,\n };\n } else {\n const pairMetadata = await publicClient.multicall({\n contracts: [\n {\n address: pairAddress,\n abi: ERC20_DECIMALS_ABI,\n functionName: 'decimals',\n },\n {\n address: pairAddress,\n abi: ERC20_SYMBOL_ABI,\n functionName: 'symbol',\n },\n ],\n allowFailure: true,\n });\n\n const pairDecimals = pairMetadata[0]?.status === 'success' ? pairMetadata[0].result : undefined;\n const pairSymbol = pairMetadata[1]?.status === 'success' ? pairMetadata[1].result : undefined;\n\n if (pairDecimals != null && pairSymbol != null) {\n extensions.fhenix.erc20Pair = {\n address: pairAddress,\n symbol: pairSymbol,\n decimals: pairDecimals,\n };\n }\n }\n }\n }\n\n return {\n chainId,\n address,\n decimals,\n symbol,\n name,\n extensions,\n };\n },\n enabled: (queryOptions?.enabled ?? true) && !!publicClient && !!chainId && !!address,\n staleTime: Infinity,\n ...queryOptions,\n });\n}\n","import { parseAbi } from 'viem';\n\n// ============================================================================\n// Standard ERC20 ABIs\n// ============================================================================\n\n/**\n * Standard ERC20 balanceOf function ABI\n */\nexport const ERC20_BALANCE_OF_ABI = parseAbi(['function balanceOf(address owner) view returns (uint256)']);\n\n/**\n * Standard ERC20 decimals function ABI\n */\nexport const ERC20_DECIMALS_ABI = parseAbi(['function decimals() view returns (uint8)']);\n\n/**\n * Standard ERC20 symbol function ABI\n */\nexport const ERC20_SYMBOL_ABI = parseAbi(['function symbol() view returns (string)']);\n\n/**\n * Standard ERC20 name function ABI\n */\nexport const ERC20_NAME_ABI = parseAbi(['function name() view returns (string)']);\n","import { parseAbi, zeroAddress } from 'viem';\n\nimport type { TokenConfidentialityContracts } from './confidentialTokenABIs';\n\nconst wrappedErc20ApprovalContracts = {\n allowance: {\n abi: parseAbi(['function allowance(address owner, address spender) view returns (uint256)']),\n functionName: 'allowance' as const,\n },\n approve: {\n abi: parseAbi(['function approve(address spender, uint256 amount) returns (bool)']),\n functionName: 'approve' as const,\n },\n} as const;\n\nexport const WRAPPED_TOKEN_CONTRACTS = {\n detection: {\n abi: [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'encBalanceOf',\n outputs: [\n {\n internalType: 'euint128',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n ] as const,\n functionName: 'encBalanceOf' as const,\n args: [zeroAddress],\n },\n confidentialBalance: {\n abi: [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'account',\n type: 'address',\n },\n ],\n name: 'encBalanceOf',\n outputs: [\n {\n internalType: 'euint128',\n name: '',\n type: 'uint256',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n ] as const,\n functionName: 'encBalanceOf' as const,\n },\n confidentialTransfer: {\n abi: [\n {\n inputs: [\n {\n internalType: 'address',\n name: 'to',\n type: 'address',\n },\n {\n components: [\n {\n internalType: 'uint256',\n name: 'ctHash',\n type: 'uint256',\n },\n {\n internalType: 'uint8',\n name: 'securityZone',\n type: 'uint8',\n },\n {\n internalType: 'uint8',\n name: 'utype',\n type: 'uint8',\n },\n {\n internalType: 'bytes',\n name: 'signature',\n type: 'bytes',\n },\n ],\n internalType: 'struct InEuint128',\n name: 'inValue',\n type: 'tuple',\n },\n ],\n name: 'encTransfer',\n outputs: [\n {\n internalType: 'euint128',\n name: 'transferred',\n type: 'uint256',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n },\n ] as const,\n functionName: 'encTransfer' as const,\n },\n shield: {\n approval: wrappedErc20ApprovalContracts,\n erc20: {\n abi: parseAbi(['function encrypt(address to, uint128 value) public']),\n functionName: 'encrypt' as const,\n },\n native: {\n abi: parseAbi(['function encryptETH(address to) public payable']),\n functionName: 'encryptETH' as const,\n },\n wrappedPair: {\n abi: parseAbi(['function encryptWETH(address to, uint128 value) public']),\n functionName: 'encryptWETH' as const,\n },\n },\n unshield: {\n abi: parseAbi(['function decrypt(address to, uint128 value) public']),\n functionName: 'decrypt' as const,\n },\n claims: {\n single: {\n abi: parseAbi(['function claimDecrypted(uint256 ctHash) public']),\n functionName: 'claimDecrypted' as const,\n },\n all: {\n abi: parseAbi(['function claimAllDecrypted() public']),\n functionName: 'claimAllDecrypted' as const,\n },\n query: {\n abi: [\n {\n inputs: [{ name: 'user', type: 'address' }],\n name: 'getUserClaims',\n outputs: [\n {\n components: [\n { name: 'ctHash', type: 'uint256' },\n { name: 'requestedAmount', type: 'uint128' },\n { name: 'decryptedAmount', type: 'uint128' },\n { name: 'decrypted', type: 'bool' },\n { name: 'to', type: 'address' },\n { name: 'claimed', type: 'bool' },\n ],\n name: '',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n ] as const,\n functionName: 'getUserClaims' as const,\n },\n },\n} as const satisfies TokenConfidentialityContracts;\n","import {\n getTokenConfidentialValueType,\n isSupportedTokenConfidentialityType,\n type Token,\n type TokenConfidentialityType,\n TOKEN_CONFIDENTIALITY_TYPES,\n type SupportedTokenConfidentialityType,\n} from '@/types/token';\nimport type { Abi } from 'viem';\n\nimport { WRAPPED_TOKEN_CONTRACTS } from './confidentialTokenWrapped';\n\nexport type ContractConfig = {\n abi: Abi;\n functionName: string;\n};\n\nexport type ProbeContractConfig = ContractConfig & {\n args: readonly unknown[];\n};\n\nexport type Erc20ApprovalContracts = {\n allowance: ContractConfig;\n approve: ContractConfig;\n};\n\nexport type TokenShieldContracts = {\n approval: Erc20ApprovalContracts;\n erc20: ContractConfig;\n native: ContractConfig;\n wrappedPair: ContractConfig;\n};\n\nexport type TokenClaimContracts = {\n single: ContractConfig;\n all: ContractConfig;\n query: ContractConfig;\n};\n\nexport type TokenConfidentialityContracts = {\n detection: ProbeContractConfig;\n confidentialBalance: ContractConfig;\n confidentialTransfer: ContractConfig;\n shield?: TokenShieldContracts;\n unshield?: ContractConfig;\n claims?: TokenClaimContracts;\n};\n\nexport type TokenConfidentialityContractsByType = Partial<\n Record<TokenConfidentialityType, TokenConfidentialityContracts>\n>;\n\nfunction getRequiredContractConfig<TConfig>(\n configs: Partial<Record<TokenConfidentialityType, TConfig>>,\n confidentialityType: TokenConfidentialityType,\n operation: string\n): TConfig {\n const config = configs[confidentialityType];\n if (!config) {\n throw new Error(`${operation} config is not defined for confidentialityType: ${confidentialityType}`);\n }\n return config;\n}\n\nconst TOKEN_CONFIDENTIALITY_CONTRACTS = {\n wrapped: WRAPPED_TOKEN_CONTRACTS,\n} as const satisfies TokenConfidentialityContractsByType;\n\nfunction getDefaultShieldApprovalContracts(): Erc20ApprovalContracts {\n return WRAPPED_TOKEN_CONTRACTS.shield.approval;\n}\n\nfunction getContractsForType(confidentialityType: Token['extensions']['fhenix']['confidentialityType']) {\n return getRequiredContractConfig(TOKEN_CONFIDENTIALITY_CONTRACTS, confidentialityType, 'token contracts');\n}\n\nexport function getTokenContractConfig(confidentialityType: Token['extensions']['fhenix']['confidentialityType']) {\n return getContractsForType(confidentialityType).confidentialBalance;\n}\n\nexport function getSupportedTokenDetectionConfigs(): Array<{\n confidentialityType: SupportedTokenConfidentialityType;\n probe: ProbeContractConfig;\n confidentialValueType: ReturnType<typeof getTokenConfidentialValueType>;\n}> {\n return TOKEN_CONFIDENTIALITY_TYPES.filter(\n (confidentialityType): confidentialityType is SupportedTokenConfidentialityType =>\n isSupportedTokenConfidentialityType(confidentialityType)\n ).map((confidentialityType) => ({\n confidentialityType,\n probe: getContractsForType(confidentialityType).detection,\n confidentialValueType: getTokenConfidentialValueType(confidentialityType),\n }));\n}\n\nexport function getTransferContractConfig(confidentialityType: Token['extensions']['fhenix']['confidentialityType']) {\n return getContractsForType(confidentialityType).confidentialTransfer;\n}\n\nexport function getShieldContractConfig(confidentialityType: Token['extensions']['fhenix']['confidentialityType']) {\n const contracts = getContractsForType(confidentialityType).shield;\n if (!contracts) {\n throw new Error(`shield config is not defined for confidentialityType: ${confidentialityType}`);\n }\n return contracts.erc20;\n}\n\nexport function getShieldAllowanceContractConfig() {\n return getDefaultShieldApprovalContracts().allowance;\n}\n\nexport function getShieldApproveContractConfig() {\n return getDefaultShieldApprovalContracts().approve;\n}\n\nexport function getShieldEthContractConfig(confidentialityType: Token['extensions']['fhenix']['confidentialityType']) {\n const contracts = getContractsForType(confidentialityType).shield;\n if (!contracts) {\n throw new Error(`shield ETH config is not defined for confidentialityType: ${confidentialityType}`);\n }\n return contracts.native;\n}\n\nexport function getShieldWrappedPairContractConfig(\n confidentialityType: Token['extensions']['fhenix']['confidentialityType']\n) {\n const contracts = getContractsForType(confidentialityType).shield;\n if (!contracts) {\n throw new Error(`shield wrapped pair config is not defined for confidentialityType: ${confidentialityType}`);\n }\n return contracts.wrappedPair;\n}\n\nexport function getUnshieldContractConfig(confidentialityType: Token['extensions']['fhenix']['confidentialityType']) {\n const contracts = getContractsForType(confidentialityType).unshield;\n if (!contracts) {\n throw new Error(`unshield config is not defined for confidentialityType: ${confidentialityType}`);\n }\n return contracts;\n}\n\nexport function getClaimContractConfig(confidentialityType: Token['extensions']['fhenix']['confidentialityType']) {\n const contracts = getContractsForType(confidentialityType).claims;\n if (!contracts) {\n throw new Error(`claim config is not defined for confidentialityType: ${confidentialityType}`);\n }\n return contracts.all;\n}\n\nexport function getClaimableContractConfig(confidentialityType: Token['extensions']['fhenix']['confidentialityType']) {\n const contracts = getContractsForType(confidentialityType).claims;\n if (!contracts) {\n throw new Error(`claimable config is not defined for confidentialityType: ${confidentialityType}`);\n }\n return contracts.query;\n}\n","import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { type Address, type Abi, type ContractFunctionName, type ContractFunctionArgs } from 'viem';\nimport { FheTypes, type DecryptPollCallbackContext, type UnsealedItem } from '@cofhe/sdk';\nimport { useCofheDecrypt } from './useCofheDecrypt';\nimport {\n useCofheReadContract,\n type UseCofheReadContractQueryOptions,\n type UseCofheReadContractResult,\n} from './useCofheReadContract';\nimport type { CofheFirstReturnFheType, CofheReturnType, EncryptedReturnTypeByUtype } from '@cofhe/abi';\nimport { cofheLogger } from '@/utils/debug';\n\ntype SupportedFheTypeFromReturn<TAbi extends Abi, TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>> =\n CofheFirstReturnFheType<TAbi, TfunctionName> extends FheTypes\n ? CofheFirstReturnFheType<TAbi, TfunctionName>\n : FheTypes;\n\nfunction isEncryptedValue<TFheType extends FheTypes>(value: unknown): value is EncryptedReturnTypeByUtype<TFheType> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'ctHash' in value &&\n 'utype' in value &&\n Object.values<unknown>(FheTypes).includes(value.utype)\n );\n}\n\nfunction convertCofheReturnTypeToEncryptedReturnType<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n TFheType extends FheTypes,\n>(value: CofheReturnType<TAbi, TfunctionName>): EncryptedReturnTypeByUtype<TFheType> {\n if (isEncryptedValue<TFheType>(value)) return value;\n\n // TODO: convertCofheReturnTypeToEncryptedReturnType -- support for mixed return types (e.g., structs with both encrypted and plain values)\n throw new Error(\n 'Auto-decryption now only supports a case where the contract function returns a single encrypted value'\n );\n}\n\nconst onPoll = (context: DecryptPollCallbackContext) => {\n cofheLogger.debug(\n `Decryption poll attemptIndex ${context.attemptIndex}. Operation: ${context.operation}. ${context.elapsedMs}ms elapsed. Request ID: ${context.requestId}.`\n );\n};\n/**\n * Generic hook: read a confidential contract value and decrypt it.\n */\n// TODO: useCofheReadContractAndDecrypt only works for a scenario when the contract function returns a signle plain encrypted value (i.e. not struct etc)\nexport function useCofheReadContractAndDecrypt<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n TFheType extends FheTypes = SupportedFheTypeFromReturn<TAbi, TfunctionName>,\n TDecryptedSelectedData = UnsealedItem<TFheType>,\n>(\n params: {\n address?: Address;\n abi?: TAbi;\n functionName?: TfunctionName;\n args?: ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>;\n requiresPermit?: boolean;\n },\n\n {\n readQueryOptions,\n decryptingQueryOptions,\n }: {\n readQueryOptions?: UseCofheReadContractQueryOptions<TAbi, TfunctionName>;\n decryptingQueryOptions?: Omit<\n UseQueryOptions<UnsealedItem<TFheType>, Error, TDecryptedSelectedData>,\n 'queryKey' | 'queryFn'\n >;\n } = {}\n): {\n encrypted: UseCofheReadContractResult<TAbi, TfunctionName>;\n decrypted: UseQueryResult<TDecryptedSelectedData, Error>;\n disabledDueToMissingValidPermit: boolean;\n} {\n const { address, abi, functionName, args, requiresPermit = true } = params;\n\n const encrypted = useCofheReadContract({ address, abi, functionName, args, requiresPermit }, readQueryOptions);\n\n const encryptedData = encrypted.data;\n\n const asEncryptedReturnType = encryptedData\n ? convertCofheReturnTypeToEncryptedReturnType<TAbi, TfunctionName, TFheType>(encryptedData)\n : undefined;\n\n const decrypted = useCofheDecrypt(\n {\n input: asEncryptedReturnType,\n onPoll,\n },\n decryptingQueryOptions\n );\n\n return {\n encrypted,\n decrypted,\n disabledDueToMissingValidPermit: encrypted.disabledDueToMissingValidPermit,\n };\n}\n","import { useCofheContext, useInternalQuery } from '@/providers';\nimport { CofheError, FheTypes, type DecryptPollCallbackFunction, type UnsealedItem } from '@cofhe/sdk';\nimport type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport { assert } from 'ts-essentials';\nimport type { EncryptedReturnTypeByUtype } from '@cofhe/abi';\n\n/**\n * Hook to decrypt a ciphertext using the Cofhe client.\n * @param input - Ciphertext and FHE type\n * @param onPoll - Optional callback fired once per decryption poll attempt\n * @param queryOptions - Optional React Query options\n * @returns Decrypted balance as bigint\n */\nexport function useCofheDecrypt<U extends FheTypes, TSeletedData = UnsealedItem<U>>(\n {\n input,\n onPoll,\n }: {\n input?: EncryptedReturnTypeByUtype<U>;\n onPoll?: DecryptPollCallbackFunction;\n },\n queryOptions?: Omit<UseQueryOptions<UnsealedItem<U>, Error, TSeletedData>, 'queryKey' | 'queryFn'>\n): UseQueryResult<TSeletedData, Error> {\n const { client } = useCofheContext();\n\n const { enabled: userEnabled, ...restQueryOptions } = queryOptions || {};\n const enabled = !!input && BigInt(input.ctHash) > 0n && !!client && (userEnabled ?? true);\n\n return useInternalQuery({\n enabled,\n queryKey: ['decryptCiphertext', input?.ctHash.toString(), input?.utype],\n queryFn: async () => {\n assert(input, 'input is guaranteed to be defined by enabled condition');\n const builder = client.decryptForView(input.ctHash, input.utype);\n if (onPoll) builder.onPoll(onPoll);\n return builder.execute();\n },\n meta: {\n persist: true,\n },\n ...restQueryOptions,\n retry: (failureCount, error) => {\n if (error instanceof CofheError) return false; // don't retry decryption errors\n\n // default retry behavior - 3 retries\n return failureCount < 3;\n },\n });\n}\n","import { type UseQueryOptions } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { FheTypes } from '@cofhe/sdk';\nimport { type Token } from './useCofheTokenLists';\nimport { getTokenContractConfig } from '../constants/confidentialTokenABIs';\nimport { assert } from 'ts-essentials';\nimport { formatTokenAmount, type TokenFormatOutput } from '@/utils/format';\nimport { useCofheReadContractAndDecrypt } from './useCofheReadContractAndDecrypt';\n\n// ============================================================================\n// Unified Confidential Balance Hook\n// ============================================================================\n\ntype UseConfidentialTokenBalanceInput = {\n /** Token from token list */\n token?: Token;\n /** Account address (optional, defaults to connected account) */\n accountAddress?: Address;\n /** Display decimals for formatting (default: 5) */\n displayDecimals?: number;\n};\n\ntype UseConfidentialTokenBalanceOptions = Omit<UseQueryOptions<bigint, Error>, 'queryKey' | 'queryFn' | 'select'> & {\n enabled?: boolean;\n};\n\ntype UseConfidentialTokenBalanceResult = {\n /** Raw balance in smallest unit (bigint) */\n data?: TokenFormatOutput;\n /** Whether balance is loading */\n isFetching: boolean;\n /** Refetch function */\n refetch: () => Promise<unknown>;\n disabledDueToMissingValidPermit: boolean;\n};\n\n/**\n * Hook to get confidential (encrypted) balance for a token with convenient formatting.\n *\n * @param input - Token and optional account address\n * @param options - Query options\n * @returns Balance data with raw bigint, formatted string, numeric value, loading state, and refetch function\n */\nexport function useCofheTokenDecryptedBalance(\n { token, accountAddress, displayDecimals = 5 }: UseConfidentialTokenBalanceInput,\n options?: UseConfidentialTokenBalanceOptions\n): UseConfidentialTokenBalanceResult {\n const { enabled: userEnabled = true, ...restOptions } = options ?? {};\n\n const contractConfig = token && getTokenContractConfig(token.extensions.fhenix.confidentialityType);\n\n const {\n decrypted: { data: decryptedData, isFetching: isDecryptionFetching },\n encrypted: { isFetching: isEncryptedFetching, refetch: refetchCiphertext },\n disabledDueToMissingValidPermit,\n } = useCofheReadContractAndDecrypt(\n {\n address: token?.address,\n abi: contractConfig?.abi,\n functionName: contractConfig?.functionName,\n args: accountAddress ? [accountAddress] : undefined,\n requiresPermit: true,\n },\n {\n readQueryOptions: {\n refetchOnMount: false,\n enabled: userEnabled && !!token,\n },\n decryptingQueryOptions: {\n refetchOnMount: false,\n select: (amountWei) => {\n assert(token, 'Token must be defined to format confidential balance');\n if (typeof amountWei !== 'bigint') {\n throw new Error('Expected bigint from confidential decryption');\n }\n return formatTokenAmount(amountWei, token.decimals, displayDecimals);\n },\n },\n ...restOptions,\n }\n );\n\n return {\n disabledDueToMissingValidPermit,\n\n data: decryptedData,\n\n isFetching: isDecryptionFetching || isEncryptedFetching,\n refetch: refetchCiphertext,\n };\n}\n","import BigNumber from 'bignumber.js';\n\nexport type TokenFormatOutput = {\n /** Raw balance in smallest unit (bigint) */\n wei: bigint;\n /** Numeric balance value */\n unit: BigNumber;\n /** Formatted balance string */\n formatted: string;\n};\n\nexport function formatTokenAmount(amount: bigint, decimals: number, displayDecimals?: number): TokenFormatOutput {\n const amountBN = new BigNumber(amount).dividedBy(10 ** decimals);\n return {\n wei: amount,\n unit: amountBN,\n formatted: displayDecimals\n ? amountBN\n .toFixed(displayDecimals)\n // remove trailing zeros\n .replace(/\\.?0+$/, '')\n : amountBN.toFixed(), // the only precise way, without parseFloat\n };\n}\n\nexport function unitToWei(amount: string, decimals: number): bigint {\n return BigInt(new BigNumber(amount).multipliedBy(10 ** decimals).toFixed(0));\n}\n\nexport function formatUsdAmount(amount: number | BigNumber, displayDecimals: number = 2): string {\n const amountBN = BigNumber.isBigNumber(amount) ? amount : new BigNumber(amount);\n return `$${amountBN.toFormat(displayDecimals)}`;\n}\n","export const BIGINT_JSON_MARKER_KEY = '__bigint__' as const;\n\ntype BigintMarker = { [BIGINT_JSON_MARKER_KEY]: string };\n\ntype JSONReviver = (key: string, value: unknown) => unknown;\ntype JSONReplacer = (key: string, value: unknown) => unknown;\n\nexport const bigintJSONReviver: JSONReviver = (_key, value) => {\n if (typeof value === 'object' && value !== null && BIGINT_JSON_MARKER_KEY in value) {\n return BigInt((value as BigintMarker)[BIGINT_JSON_MARKER_KEY]);\n }\n return value;\n};\n\nexport const bigintJSONReplacer: JSONReplacer = (_key, value) => {\n if (typeof value === 'bigint') {\n return { [BIGINT_JSON_MARKER_KEY]: value.toString() } satisfies BigintMarker;\n }\n return value;\n};\n\nexport const bigintJSONStorageOptions = {\n reviver: bigintJSONReviver,\n replacer: bigintJSONReplacer,\n} as const;\n","import type { Token } from '@/types/token';\nimport { bigintJSONStorageOptions } from '@/utils/bigintJson';\nimport type { Address } from 'viem';\nimport { create } from 'zustand';\nimport { persist, createJSONStorage } from 'zustand/middleware';\n\ntype ChainRecord<T> = Record<number, T>;\ntype HashRecord<T> = Record<string, T>;\n\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\n\nexport enum TransactionStatus {\n Pending = 'pending',\n Failed = 'failed',\n Confirmed = 'confirmed',\n}\nexport type TransactionStatusString = 'Pending' | 'Failed' | 'Confirmed';\n\nexport enum TransactionActionType {\n ShieldSend = 'shieldSend',\n Shield = 'shield',\n Unshield = 'unshield',\n Claim = 'claim',\n Approve = 'approve',\n}\nexport type TransactionActionString = 'Shielded Transfer' | 'Shield' | 'Unshield' | 'Claim' | 'Approve';\n\ntype BaseTransaction = {\n hash: `0x${string}`;\n status: TransactionStatus;\n timestamp: number;\n chainId: number;\n // actionType: Exclude<TransactionActionType, TransactionActionType.Unshield>;\n account: Address;\n\n token: Token;\n //\n\n tokenAmount: bigint;\n isPendingDecryption: boolean;\n};\n\ntype ShieldingTransaction = BaseTransaction & {\n actionType: TransactionActionType.Shield;\n};\ntype SendingTransaction = BaseTransaction & {\n actionType: TransactionActionType.ShieldSend;\n};\ntype ClaimingTransaction = BaseTransaction & {\n actionType: TransactionActionType.Claim;\n};\n\ntype ApprovingTransaction = BaseTransaction & {\n actionType: TransactionActionType.Approve;\n};\n\ntype UnshieldingTransaction = BaseTransaction & {\n actionType: TransactionActionType.Unshield;\n};\n\nexport type Transaction =\n | UnshieldingTransaction\n | ShieldingTransaction\n | SendingTransaction\n | ClaimingTransaction\n | ApprovingTransaction;\n\ntype NewTransaction = DistributiveOmit<Transaction, 'status' | 'timestamp'>;\n\nexport interface TransactionStore {\n // TODO: should be chainId -> account -> txHash -> Transaction\n transactions: ChainRecord<HashRecord<Transaction>>;\n addTransaction: (transaction: NewTransaction) => void;\n getTransaction: (chainId: number, hash: string) => Transaction | undefined;\n getAllTransactions: (chainId: number, account?: string) => Transaction[];\n getAllTransactionsByToken: (chainId: number, tokenAddress: string, account?: string) => Transaction[];\n updateTransactionStatus: (chainId: number, hash: string, status: TransactionStatus) => void;\n setTransactionDecryptionStatus: (chainId: number, hash: string, isPendingDecryption: boolean) => void;\n clearTransactions: (chainId?: number) => void;\n}\n\nconst actionToStringMap: Record<TransactionActionType, TransactionActionString> = {\n [TransactionActionType.ShieldSend]: 'Shielded Transfer',\n [TransactionActionType.Shield]: 'Shield',\n [TransactionActionType.Unshield]: 'Unshield',\n [TransactionActionType.Claim]: 'Claim',\n [TransactionActionType.Approve]: 'Approve',\n};\n\nexport const actionToString = (a: TransactionActionType): TransactionActionString => actionToStringMap[a];\n\nconst statusToStringMap: Record<TransactionStatus, TransactionStatusString> = {\n [TransactionStatus.Pending]: 'Pending',\n [TransactionStatus.Failed]: 'Failed',\n [TransactionStatus.Confirmed]: 'Confirmed',\n};\n\nexport const statusToString = (a: TransactionStatus): TransactionStatusString => statusToStringMap[a];\n\n// Custom storage to handle bigint serialization\nconst bigintStorage = createJSONStorage<TransactionStore>(() => localStorage, bigintJSONStorageOptions);\n\nfunction constructNewTx(transaction: NewTransaction): Transaction {\n return {\n ...transaction,\n status: TransactionStatus.Pending,\n timestamp: Date.now(),\n };\n}\n\nexport const useTransactionStore = create<TransactionStore>()(\n persist(\n (set, get) => ({\n transactions: {},\n\n addTransaction: (transaction: NewTransaction) => {\n set((state) => {\n const chainTxs = state.transactions[transaction.chainId] || {};\n const pendingTx = constructNewTx(transaction);\n return {\n transactions: {\n ...state.transactions,\n [transaction.chainId]: {\n ...chainTxs,\n [transaction.hash]: pendingTx,\n },\n },\n };\n });\n },\n\n setTransactionDecryptionStatus: (chainId: number, hash: string, isPendingDecryption: boolean) => {\n set((state) => {\n const chainTxs = state.transactions[chainId];\n if (!chainTxs || !chainTxs[hash]) return state;\n\n return {\n transactions: {\n ...state.transactions,\n [chainId]: {\n ...chainTxs,\n [hash]: {\n ...chainTxs[hash],\n isPendingDecryption,\n },\n },\n },\n };\n });\n },\n\n updateTransactionStatus: (chainId: number, hash: string, status: TransactionStatus) => {\n set((state) => {\n const chainTxs = state.transactions[chainId];\n if (!chainTxs || !chainTxs[hash]) return state;\n\n return {\n transactions: {\n ...state.transactions,\n [chainId]: {\n ...chainTxs,\n [hash]: {\n ...chainTxs[hash],\n status,\n // if tx failed, it's no longer pending decryption\n isPendingDecryption: status === TransactionStatus.Failed ? false : chainTxs[hash].isPendingDecryption,\n },\n },\n },\n };\n });\n },\n\n getTransaction: (chainId: number, hash: string): Transaction | undefined => {\n return get().transactions[chainId]?.[hash];\n },\n\n getAllTransactions: (chainId: number, account?: string): Transaction[] => {\n const chainTxs = get().transactions[chainId];\n return chainTxs\n ? Object.values(chainTxs)\n .filter((tx) => !account || !tx.account || tx.account.toLowerCase() === account.toLowerCase())\n .sort((a, b) => b.timestamp - a.timestamp) // newest first\n : [];\n },\n\n getAllTransactionsByToken: (chainId: number, tokenAddress: string, account?: string): Transaction[] => {\n const chainTxs = get().transactions[chainId];\n return chainTxs\n ? Object.values(chainTxs)\n .filter((tx) => {\n return tx.account.toLowerCase() === account?.toLowerCase();\n })\n .sort((a, b) => b.timestamp - a.timestamp) // newest first\n : [];\n },\n\n clearTransactions: (chainId?: number) => {\n set((state) => {\n if (chainId !== undefined) {\n return {\n transactions: {\n ...state.transactions,\n [chainId]: {},\n },\n };\n }\n return { transactions: {} };\n });\n },\n }),\n {\n name: 'cofhe-transaction-store',\n storage: bigintStorage,\n }\n )\n);\n","import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';\nimport {\n assertCorrectEncryptedItemInput,\n EncryptStep,\n type EncryptableItem,\n type EncryptedItemInput,\n type EncryptStepCallbackContext,\n type EncryptedItemInputs,\n isLastEncryptionStep,\n} from '@cofhe/sdk';\nimport { assert } from 'ts-essentials';\nimport { useStepsState, type EncryptionStep, type StepsState } from './internal/useStepsState';\nimport { useInternalMutation } from '../providers/index.js';\nimport { useCofheContext } from '../providers/index.js';\nexport type EncryptableArray = readonly EncryptableItem[];\nexport type EncryptionOptions<T extends EncryptableItem | EncryptableArray> = {\n input?: T;\n account?: string;\n chainId?: number;\n securityZone?: number; // TODO: potential conflifct/ambiguity with createEncryptable arg - figure it out\n onStepChange?: (step: EncryptStep, context?: EncryptStepCallbackContext) => void;\n};\n\ntype StepConfig = { label: string; progress: number };\nconst STEP_CONFIG: Record<EncryptStep, StepConfig> = {\n initTfhe: {\n label: 'Initializing TFHE...',\n progress: 5,\n },\n fetchKeys: {\n label: 'Fetching FHE keys...',\n progress: 20,\n },\n pack: {\n label: 'Packing data...',\n progress: 40,\n },\n prove: {\n label: 'Generating proof...',\n progress: 70,\n },\n verify: {\n label: 'Verifying...',\n progress: 90,\n },\n};\n\nconst DONE_STEP_CONFIG: StepConfig = {\n label: 'Encryption complete!',\n progress: 100,\n};\n\nexport function getStepConfig(step: EncryptionStep) {\n if (isLastEncryptionStep(step.step) && step.context?.isEnd) return DONE_STEP_CONFIG;\n\n return STEP_CONFIG[step.step];\n}\ntype EncryptInputsResult<T extends readonly EncryptableItem[]> = EncryptedItemInputs<[...T]>;\n\nexport type EncryptInputsOptions = {\n account?: string;\n chainId?: number;\n securityZone?: number;\n onStepChange?: (step: EncryptStep, context?: EncryptStepCallbackContext) => void;\n};\n\nexport type EncryptInputsVariables<T extends readonly EncryptableItem[] = readonly EncryptableItem[]> =\n | T\n | ({\n items: T;\n } & EncryptInputsOptions);\n\nfunction hasEncryptInputsOptions<T extends readonly EncryptableItem[]>(\n variables: EncryptInputsVariables<T>\n): variables is { items: T } & EncryptInputsOptions {\n return typeof variables === 'object' && variables !== null && 'items' in variables;\n}\n\nfunction assertEncryptInputsResult<T extends readonly EncryptableItem[]>(\n inputs: T,\n encrypted: readonly EncryptedItemInput[]\n): asserts encrypted is EncryptInputsResult<T> {\n if (encrypted.length !== inputs.length) {\n throw new Error(`Encryption result length mismatch (expected ${inputs.length}, got ${encrypted.length})`);\n }\n\n for (let i = 0; i < encrypted.length; i++) {\n const encryptedItem = encrypted[i];\n const inputItem = inputs[i];\n\n assertCorrectEncryptedItemInput(encryptedItem);\n\n if (encryptedItem.utype !== inputItem.utype) {\n throw new Error(`Encryption result type mismatch at index ${i}`);\n }\n }\n}\n\nexport type UseCofheEncryptOptions = Omit<\n UseMutationOptions<readonly EncryptedItemInput[], Error, EncryptInputsVariables, void>,\n 'mutationFn'\n>;\n\n/**\n * Low-level mutation hook: encrypt a list of EncryptableItems into encrypted input structs.\n *\n */\nexport function useCofheEncrypt(options?: UseCofheEncryptOptions): UseMutationResult<\n readonly EncryptedItemInput[],\n Error,\n EncryptInputsVariables,\n void\n> & {\n encryptInputsAsync: <const T extends readonly EncryptableItem[]>(\n variables: EncryptInputsVariables<T>\n ) => Promise<EncryptInputsResult<T>>;\n encryptInputs: (variables: EncryptInputsVariables) => void;\n isEncrypting: boolean;\n stepsState: StepsState;\n} {\n const client = useCofheContext().client;\n const stepsState = useStepsState();\n const { onStep: handleStepStateChange, onSetKey: handleStepSetKey } = stepsState;\n\n const mutation = useInternalMutation<readonly EncryptedItemInput[], Error, EncryptInputsVariables, void>({\n ...options,\n mutationKey: options?.mutationKey ?? ['cofhe', 'encryptInputs'],\n mutationFn: async (variables) => {\n assert(client, 'CoFHE client not initialized');\n\n const key = crypto.randomUUID();\n handleStepSetKey(key);\n\n const items = hasEncryptInputsOptions(variables) ? variables.items : variables;\n // SDK expects a mutable array type; copy preserves runtime value while satisfying typing.\n const mutableItems = Array.from(items);\n\n const builder = client.encryptInputs(mutableItems);\n\n const externalOnStepChange = hasEncryptInputsOptions(variables) ? variables.onStepChange : undefined;\n\n const combinedOnStepChange = (step: EncryptStep, context?: EncryptStepCallbackContext) => {\n handleStepStateChange(key, step, context);\n externalOnStepChange?.(step, context);\n };\n\n // Always set callback so we can track steps consistently.\n builder.onStep(combinedOnStepChange);\n\n if (hasEncryptInputsOptions(variables)) {\n if (variables.account) builder.setAccount(variables.account);\n if (variables.chainId) builder.setChainId(variables.chainId);\n if (variables.securityZone) builder.setSecurityZone(variables.securityZone);\n }\n\n return builder.execute();\n },\n });\n\n return {\n ...mutation,\n encryptInputsAsync: async <const T extends readonly EncryptableItem[]>(variables: EncryptInputsVariables<T>) => {\n const items = hasEncryptInputsOptions(variables) ? variables.items : variables;\n const result = await mutation.mutateAsync(variables);\n assertEncryptInputsResult(items, result);\n return result;\n },\n encryptInputs: (variables) => mutation.mutate(variables),\n isEncrypting: mutation.isPending,\n stepsState,\n };\n}\n","import { EncryptStep, type EncryptStepCallbackContext } from '@cofhe/sdk';\nimport { useCallback, useMemo, useState } from 'react';\n\nexport type EncryptionStep = { step: EncryptStep; context?: EncryptStepCallbackContext };\n\ntype StepWithOrder = `${number}_${EncryptStep}_${'start' | 'stop'}`;\ntype CompactSteps = Partial<Record<StepWithOrder, number | undefined>>;\n\nfunction validateAndCompactizeSteps(encSteps: EncryptionStep[]): CompactSteps {\n const result: CompactSteps = {};\n encSteps.forEach((encStep, index) => {\n const postfix = encStep.context?.isStart ? 'start' : encStep.context?.isEnd ? 'stop' : null;\n if (!postfix) throw new Error('Invalid step context: must be start or end');\n\n const idx: StepWithOrder = `${index}_${encStep.step}_${postfix}`;\n\n result[idx] = encStep.context?.duration;\n });\n\n return result;\n}\n\n// Key is identifier for each encryption mutation call\nexport type StepsState = {\n onStep: (key: string, step: EncryptStep, context?: EncryptStepCallbackContext) => void;\n onSetKey: (key: string | null) => void;\n compactSteps: CompactSteps;\n lastStep: EncryptionStep | null;\n};\n\nexport function useStepsState(): StepsState {\n const [steps, setSteps] = useState<Record<string, EncryptionStep[]>>({});\n const [currentKey, setCurrentKey] = useState<string | null>(null);\n\n const onStep = useCallback((key: string, step: EncryptStep, context?: EncryptStepCallbackContext) => {\n if (step === EncryptStep.InitTfhe && context?.isStart) {\n // init with a single-element array\n setSteps((prev) => ({ ...prev, [key]: [{ step, context }] }));\n } else {\n setSteps((prev) => ({ ...prev, [key]: [...prev[key], { step, context }] }));\n }\n }, []);\n\n const onSetKey = useCallback((key: string | null) => {\n setCurrentKey(key);\n }, []);\n\n const compactSteps = useMemo(\n () => validateAndCompactizeSteps(currentKey ? steps[currentKey] : []),\n [steps, currentKey]\n );\n\n const lastStep = currentKey ? steps[currentKey][steps[currentKey].length - 1] : null;\n\n return {\n onStep,\n onSetKey,\n compactSteps,\n lastStep,\n };\n}\n","import type { UseMutationOptions, UseMutationResult } from '@tanstack/react-query';\nimport type {\n Abi,\n Account,\n Chain,\n ContractFunctionArgs,\n ContractFunctionName,\n Hash,\n WalletClient,\n WriteContractParameters,\n} from 'viem';\nimport { assert } from 'ts-essentials';\nimport { useInternalMutation } from '../providers/index.js';\nimport { useCofhePublicClient, useCofheWalletClient } from './useCofheConnection.js';\n\ntype WalletWriteContractParamsAny = Parameters<WalletClient['writeContract']>[0];\n\nexport type WalletWriteContractInputWithExtras<TExtras> = {\n writeContractInput: WalletWriteContractParamsAny;\n extras: TExtras;\n};\n\ntype WalletWriteContractMutationVariables<TExtras> =\n | WalletWriteContractParamsAny\n | WalletWriteContractInputWithExtras<TExtras>;\n\nexport function hasExtras<TExtras>(\n variables: WalletWriteContractMutationVariables<TExtras>\n): variables is WalletWriteContractInputWithExtras<TExtras> {\n return (\n typeof variables === 'object' && variables !== null && 'writeContractInput' in variables && 'extras' in variables\n );\n}\n\nexport type WalletWriteContractParams<\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n> = WriteContractParameters<TAbi, TFunctionName, TArgs, Chain | undefined, Account | undefined, TChainOverride>;\n\nexport type useCofheWriteContractOptions<TExtras = unknown> = Omit<\n UseMutationOptions<Hash, Error, WalletWriteContractMutationVariables<TExtras>, unknown>,\n 'mutationFn'\n>;\n\n/**\n * Low-level mutation hook: call `walletClient.writeContract`.\n *\n * Unlike `useCofheWriteContract`, this accepts viem's full `writeContract` parameter type.\n */\nexport function useCofheWriteContract<TExtras = unknown>(\n options?: useCofheWriteContractOptions<TExtras>\n): UseMutationResult<Hash, Error, WalletWriteContractMutationVariables<TExtras>, unknown> & {\n writeContractAsync: <\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n >(\n params:\n | WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>\n | {\n writeContractInput: WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>;\n extras: TExtras;\n }\n ) => Promise<Hash>;\n writeContract: <\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n >(\n params:\n | WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>\n | {\n writeContractInput: WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>;\n extras: TExtras;\n }\n ) => void;\n} {\n const walletClient = useCofheWalletClient();\n const publicClient = useCofhePublicClient();\n\n const mutation = useInternalMutation<Hash, Error, WalletWriteContractMutationVariables<TExtras>, unknown>({\n ...options,\n mutationKey: options?.mutationKey ?? ['cofhe', 'walletWriteContract'],\n mutationFn: async (variables) => {\n assert(walletClient, 'WalletClient is required to write to a contract');\n assert(publicClient, 'PublicClient is required to simulate contract before writing');\n\n const writeContractInput = hasExtras(variables) ? variables.writeContractInput : variables;\n\n const accountForSimulation = writeContractInput.account ?? walletClient.account;\n assert(accountForSimulation, 'Wallet account is required to simulate contract before writing');\n\n const { chain, ...rest } = writeContractInput;\n const { request } = await publicClient.simulateContract({\n ...(chain ? { ...rest, chain } : rest),\n account: accountForSimulation,\n });\n return walletClient.writeContract({ ...request, chain: undefined });\n },\n });\n\n const writeContractAsync = async <\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n >(\n params:\n | WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>\n | {\n writeContractInput: WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>;\n extras: TExtras;\n }\n ) => mutation.mutateAsync(params as unknown as WalletWriteContractMutationVariables<TExtras>);\n\n const writeContract = <\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride extends Chain | undefined = undefined,\n >(\n params:\n | WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>\n | {\n writeContractInput: WalletWriteContractParams<TAbi, TFunctionName, TArgs, TChainOverride>;\n extras: TExtras;\n }\n ) => mutation.mutate(params as unknown as WalletWriteContractMutationVariables<TExtras>);\n\n return {\n ...mutation,\n writeContractAsync,\n writeContract,\n };\n}\n","import type {\n Abi,\n Account,\n Chain,\n ContractFunctionArgs,\n ContractFunctionName,\n WriteContractParameters,\n WriteContractReturnType,\n} from 'viem';\nimport { type CofheInputArgsPreTransform, extractEncryptableValues, insertEncryptedValues } from '@cofhe/abi';\nimport type { EncryptableItem, EncryptedItemInput } from '@cofhe/sdk';\nimport { useCofheEncrypt, type EncryptInputsOptions, type UseCofheEncryptOptions } from './useCofheEncrypt';\nimport { useCofheWriteContract, type useCofheWriteContractOptions } from './useCofheWriteContract';\n\ntype NoInferLocal<T> = [T][T extends any ? 0 : never];\n\ntype ConfidentialityAwareAbiArgs<TAbi extends Abi | readonly unknown[], TFunctionName extends string> = NoInferLocal<\n Exclude<CofheInputArgsPreTransform<TAbi, TFunctionName>, undefined>\n>;\n\nexport async function _encryptAndWriteContract<\n const TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TChainOverride extends Chain | undefined = undefined,\n>({\n params,\n args,\n encrypt,\n write,\n}: {\n params: Omit<\n WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >,\n 'args' | 'functionName'\n > & { functionName: TFunctionName };\n // Don't let args participate in inferring `TAbi`/`TFunctionName`.\n // Otherwise, an incorrect args shape can cause TS to widen TAbi to `readonly unknown[]`\n // (and then args become `unknown[]`, silently accepting anything).\n args: ConfidentialityAwareAbiArgs<TAbi, TFunctionName>;\n encrypt: (encryptableItems: EncryptableItem[]) => Promise<readonly EncryptedItemInput[]>;\n write: (\n writeParams: WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >\n ) => Promise<WriteContractReturnType>;\n}): Promise<WriteContractReturnType> {\n const transformer = constructEncryptAndTransform<TAbi, TFunctionName, TChainOverride>(\n params.abi,\n params.functionName,\n encrypt\n );\n const transformedArgs: WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >['args'] = await transformer(args);\n\n // You can’t fix that spot “purely” (no as … and no any) while keeping this wrapper fully-generic over TAbi/TFunctionName.\n // Reason: viem’s WriteContractParameters ultimately includes a conditional type that depends on:\n // readonly [] extends ContractFunctionArgs<TAbi, ..., TFunctionName>\n // Inside a generic function body, TypeScript must typecheck for all possible TAbi/TFunctionName, so it cannot prove which branch you’re in. That’s why it rejects constructing/passing newParams as WriteContractParameters<...> even when your runtime object is correct.\n const newParams = {\n ...params,\n args: transformedArgs,\n } as WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >;\n\n return write(newParams);\n}\n\nfunction constructEncryptAndTransform<\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TChainOverride extends Chain | undefined = undefined,\n>(\n abi: TAbi,\n functionName: TFunctionName,\n encrypt: (encryptableItems: EncryptableItem[]) => Promise<readonly EncryptedItemInput[]>\n): (\n mixedArgs: Exclude<CofheInputArgsPreTransform<TAbi, TFunctionName>, undefined>\n) => Promise<\n WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >['args']\n> {\n // encrypts inputs that need to be encrypted and transform them\n return async (mixedArgs) => {\n const extracted = extractEncryptableValues(abi, functionName, mixedArgs);\n const encrypted = await encrypt(extracted);\n const merged = insertEncryptedValues(abi, functionName, mixedArgs, encrypted);\n\n // TODO: mismatch between CofheInputArgs<TAbi, TFunctionName> and WriteContractParameters<...>['args'] types\n return merged as WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >['args'];\n };\n}\n\nexport function useCofheEncryptAndWriteContract<TExtraVars = unknown>({\n encrypingMutationOptions,\n writingMutationOptions,\n}: {\n encrypingMutationOptions?: UseCofheEncryptOptions;\n writingMutationOptions?: useCofheWriteContractOptions<TExtraVars>;\n} = {}) {\n const encryption = useCofheEncrypt(encrypingMutationOptions);\n const write = useCofheWriteContract<TExtraVars>(writingMutationOptions);\n\n const encryptAndWrite = async <\n const TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, 'payable' | 'nonpayable'>,\n TChainOverride extends Chain | undefined = undefined,\n >(args: {\n params: Omit<\n WriteContractParameters<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n Chain | undefined,\n Account | undefined,\n TChainOverride\n >,\n 'args' | 'functionName'\n > & { functionName: TFunctionName };\n args: ConfidentialityAwareAbiArgs<TAbi, TFunctionName>;\n extras?: TExtraVars;\n encryptionOptions?: EncryptInputsOptions;\n }) =>\n _encryptAndWriteContract<TAbi, TFunctionName, TChainOverride>({\n ...args,\n encrypt: (encryptableItems) =>\n encryption.encryptInputsAsync({\n items: encryptableItems,\n ...(args.encryptionOptions ?? {}),\n }),\n write: (writeParams) => {\n const vars =\n 'extras' in args ? { writeContractInput: writeParams, extras: args.extras as TExtraVars } : writeParams;\n\n return write.writeContractAsync<\n TAbi,\n TFunctionName,\n ContractFunctionArgs<TAbi, 'payable' | 'nonpayable', TFunctionName>,\n TChainOverride\n >(vars);\n },\n });\n\n return {\n encryptAndWrite,\n encryption,\n write,\n };\n}\n","import { type Address } from 'viem';\nimport type { Token } from './useCofheTokenLists.js';\nimport { assertTokenOperationSupported } from '@/types/token';\nimport { getTransferContractConfig } from '../constants/confidentialTokenABIs.js';\nimport { TransactionActionType, useTransactionStore } from '../stores/transactionStore.js';\nimport { type EncryptableItem } from '@cofhe/sdk';\nimport { useCofheEncryptAndWriteContract } from './useCofheEncryptAndWriteContract.js';\nimport type { useCofheWriteContractOptions } from './useCofheWriteContract.js';\nimport type { EncryptionOptions } from './useCofheEncrypt.js';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\n\ntype TokenTransferExtras = { token: Token; amount: bigint; userAddress: Address };\ntype UseCofheTokenTransferOptions = Pick<\n useCofheWriteContractOptions<TokenTransferExtras>,\n 'onSuccess' | 'onError' | 'onMutate'\n>;\n\ntype EncryptAndSendInput = {\n input: {\n token: Token;\n to: Address;\n amount: bigint;\n userAddress: Address;\n };\n encryptionOptions?: EncryptionOptions<EncryptableItem>;\n};\n\nexport function useCofheTokenTransfer(writeMutationOptions?: UseCofheTokenTransferOptions) {\n const { onSuccess: passedOnSuccess, onError: passedOnError, ...restOfOptions } = writeMutationOptions || {};\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n const { encryption, write, encryptAndWrite } = useCofheEncryptAndWriteContract<TokenTransferExtras>({\n writingMutationOptions: {\n onError: (error, variables, onMutateResult, context) => {\n if (passedOnError) passedOnError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.ShieldSend);\n },\n onSuccess: (hash, variables, onMutateResult, context) => {\n if (passedOnSuccess) passedOnSuccess(hash, variables, onMutateResult, context);\n\n const extras =\n typeof variables === 'object' && variables !== null && 'extras' in variables ? variables.extras : null;\n\n if (!extras) return;\n\n // Record transaction and watch for confirmation\n useTransactionStore.getState().addTransaction({\n hash,\n token: extras.token,\n tokenAmount: extras.amount,\n chainId: extras.token.chainId,\n actionType: TransactionActionType.ShieldSend,\n isPendingDecryption: false, // doesn't need decryption afterwards\n account: extras.userAddress,\n });\n },\n ...restOfOptions,\n },\n });\n\n return {\n encryption,\n write,\n isPending: encryption.isPending || write.isPending,\n data: write.data,\n encryptAmountAndSendToken: ({ input, encryptionOptions }: EncryptAndSendInput) => {\n const { token, to, amount, userAddress } = input;\n\n const { input: _ignoredInput, ...encryptionOpts } = encryptionOptions ?? {};\n assertTokenOperationSupported(token.extensions.fhenix.confidentialityType, 'transfer');\n const contractConfig = getTransferContractConfig(token.extensions.fhenix.confidentialityType);\n\n return encryptAndWrite({\n params: {\n address: token.address,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n account: userAddress,\n chain: undefined,\n },\n args: [to, amount] as const,\n extras: {\n token,\n amount,\n userAddress,\n },\n encryptionOptions: encryptionOpts,\n });\n },\n };\n}\n","import type {\n OpenPortalModalFn,\n PortalModal,\n PortalModalPropsMap,\n PortalModalState,\n} from '@/components/CofheFloatingButton/modals/types';\nimport { create } from 'zustand';\n\ntype PortalModalStore = {\n modalStack: PortalModalState[];\n};\n\ntype PortalModalActions = {\n openModal: OpenPortalModalFn;\n closeModal: (modal: PortalModal) => void;\n clearAllModals: () => void;\n};\n\nexport const usePortalModals = create<PortalModalStore & PortalModalActions>()((set, get) => ({\n modalStack: [],\n\n openModal: <M extends PortalModal>(\n ...args: PortalModalPropsMap[M] extends void ? [modal: M] : [modal: M, props: PortalModalPropsMap[M]]\n ) => {\n const [modal, props] = args;\n const onClose = () => get().closeModal(modal);\n const modalState = { modal, onClose, ...(props ?? {}) } as PortalModalState;\n set({ modalStack: [...get().modalStack, modalState] });\n },\n closeModal: (modal) => {\n set({ modalStack: get().modalStack.filter((m) => m.modal !== modal) });\n },\n clearAllModals: () => {\n set({ modalStack: [] });\n },\n}));\n","import { useMemo } from 'react';\nimport { create } from 'zustand';\nimport { usePortalStatuses } from './portalStatuses';\n\nconst ANIM_DURATION = 300;\n\ntype PortalUIStore = {\n portalOpen: boolean;\n statusPanelOpen: boolean;\n contentPanelOpen: boolean;\n contentHeights: Array<{ id: string; height: number }>;\n\n openTimeoutId: ReturnType<typeof setTimeout> | null;\n closeTimeoutId: ReturnType<typeof setTimeout> | null;\n};\n\ntype OpenPortalArgs = {\n onOpenBegin?: () => void;\n onOpenEnd?: () => void;\n};\ntype ClosePortalArgs = {\n onCloseBegin?: () => void;\n onCloseEnd?: () => void;\n};\ntype TogglePortalArgs = OpenPortalArgs & ClosePortalArgs;\n\ntype PortalUIActions = {\n clearTimeouts: () => void;\n openPortal: (args?: OpenPortalArgs) => void;\n closePortal: (args?: ClosePortalArgs) => void;\n togglePortal: (args?: TogglePortalArgs) => void;\n\n setContentHeight: (id: string, height: number) => void;\n removeContentHeight: (id: string) => void;\n};\n\nexport const usePortalUI = create<PortalUIStore & PortalUIActions>()((set, get) => ({\n portalOpen: false,\n statusPanelOpen: false,\n contentPanelOpen: false,\n contentHeights: [],\n\n openTimeoutId: null,\n closeTimeoutId: null,\n clearTimeouts: () => {\n const { openTimeoutId, closeTimeoutId } = get();\n if (openTimeoutId) clearTimeout(openTimeoutId);\n if (closeTimeoutId) clearTimeout(closeTimeoutId);\n set({ openTimeoutId: null, closeTimeoutId: null });\n },\n openPortal: (args = {}) => {\n const { onOpenBegin, onOpenEnd } = args;\n const { closeTimeoutId, statusPanelOpen } = get();\n\n // Open portal\n onOpenBegin?.();\n set({ portalOpen: true });\n\n // Cancel closing timeout\n if (closeTimeoutId) {\n clearTimeout(closeTimeoutId);\n set({ closeTimeoutId: null });\n }\n\n // Open status panel immediately\n set({ statusPanelOpen: true });\n\n const hasOpenStatus = usePortalStatuses.getState().statuses.length > 0;\n if (statusPanelOpen || hasOpenStatus) {\n // Open content immediately if status panel visible or statuses exist\n set({ contentPanelOpen: true });\n onOpenEnd?.();\n } else {\n // Open content after delay\n const id = setTimeout(() => {\n set({ contentPanelOpen: true, openTimeoutId: null });\n onOpenEnd?.();\n }, ANIM_DURATION);\n\n set({ openTimeoutId: id });\n }\n },\n closePortal: (args = {}) => {\n const { onCloseBegin, onCloseEnd } = args;\n const { openTimeoutId } = get();\n\n // Close portal\n onCloseBegin?.();\n set({ portalOpen: false });\n\n // Cancel opening timeout\n if (openTimeoutId) {\n clearTimeout(openTimeoutId);\n set({ openTimeoutId: null });\n }\n\n // Close content immediately\n set({ contentPanelOpen: false });\n\n // Close status panel after delay\n const id = setTimeout(() => {\n set({ statusPanelOpen: false, closeTimeoutId: null });\n onCloseEnd?.();\n }, ANIM_DURATION);\n\n set({ closeTimeoutId: id });\n },\n togglePortal: (args) => {\n get().portalOpen ? get().closePortal(args) : get().openPortal(args);\n },\n\n setContentHeight: (id, height) => {\n const existing = get().contentHeights;\n const updated = [...existing.filter((h) => h.id !== id), { id, height }];\n set({ contentHeights: updated });\n },\n removeContentHeight: (id) => {\n set({ contentHeights: get().contentHeights.filter((height) => height.id !== id) });\n },\n}));\n\nexport const usePortalUIMaxContentHeight = () => {\n const { contentHeights } = usePortalUI();\n return useMemo(() => {\n return contentHeights.reduce((max, height) => Math.max(max, height.height), 0);\n }, [contentHeights]);\n};\n","import type { CofheStatus } from '@/components/CofheFloatingButton/types';\nimport { create } from 'zustand';\n\ntype PortalStatusesStore = {\n statuses: CofheStatus[];\n};\n\ntype PortalStatusesActions = {\n addStatus: (status: CofheStatus) => void;\n removeStatus: (id: string) => void;\n hasStatus: (id: string) => boolean;\n};\n\nexport const usePortalStatuses = create<PortalStatusesStore & PortalStatusesActions>()((set, get) => ({\n statuses: [],\n addStatus: (status) => {\n // avoid duplicates\n if (get().hasStatus(status.id)) return;\n\n const existing = get().statuses;\n set({ statuses: [...existing, status] });\n },\n removeStatus: (id) => {\n const existing = get().statuses;\n set({ statuses: existing.filter((s) => s.id !== id) });\n },\n hasStatus: (id) => {\n return get().statuses.some((s) => s.id === id);\n },\n}));\n","/* eslint-disable no-redeclare */\nimport {\n FloatingButtonPage,\n type FloatingButtonPagePropsMap,\n type PageState,\n type PagesWithProps,\n} from '@/components/CofheFloatingButton/pagesConfig/types';\nimport { create } from 'zustand';\nimport { cofheLogger } from '@/utils/debug';\n\nexport type NavigateParams = {\n // When true, do not append to history; override current page instead\n skipPagesHistory?: boolean;\n};\n\nexport type NavigateArgs<K extends FloatingButtonPage> = {\n pageProps?: FloatingButtonPagePropsMap[K];\n navigateParams?: NavigateParams;\n};\n\ntype NavigateToFn = <K extends FloatingButtonPage>(\n page: K,\n ...rest: K extends PagesWithProps ? [args: NavigateArgs<K>] : [args?: NavigateArgs<K>]\n) => void;\n\ntype PortalNavigationStore = {\n pageHistory: PageState[];\n overridingPage: PageState | null;\n};\n\ntype PortalNavigationActions = {\n navigateTo: NavigateToFn;\n navigateBack: () => void;\n replace: NavigateToFn;\n clearNavigationHistory: () => void;\n};\n\nexport const usePortalNavigation = create<PortalNavigationStore & PortalNavigationActions>()((set, get) => {\n function clearNavigationHistory(): void {\n set({ pageHistory: [{ page: FloatingButtonPage.Main }], overridingPage: null });\n }\n\n function warnIfAlreadyOnPage<K extends FloatingButtonPage>(page: K): boolean {\n const currentPage = get().overridingPage ?? get().pageHistory[get().pageHistory.length - 1];\n const onPage = currentPage?.page === page;\n if (onPage) {\n cofheLogger.warn(`Attempted to navigate to page ${page} but already on that page`);\n }\n return onPage;\n }\n\n const navigateTo: NavigateToFn = (page, ...rest) => {\n if (warnIfAlreadyOnPage(page)) return;\n\n const args = rest[0];\n const props = args?.pageProps;\n const skipPagesHistory = args?.navigateParams?.skipPagesHistory === true;\n if (skipPagesHistory) {\n set({ overridingPage: { page, props } });\n } else {\n const existing = get().pageHistory;\n const updated = [...existing, { page, props }];\n set({ pageHistory: updated });\n }\n };\n\n const replace: NavigateToFn = (page, ...rest) => {\n if (warnIfAlreadyOnPage(page)) return;\n\n clearNavigationHistory();\n\n navigateTo(page, ...rest);\n };\n\n return {\n pageHistory: [{ page: FloatingButtonPage.Main }],\n overridingPage: null,\n\n clearNavigationHistory,\n navigateTo,\n navigateBack: () => {\n if (get().overridingPage !== null) {\n // if currently there is an overriding page, just remove it\n set({ overridingPage: null });\n } else {\n // otherwise pop last page from history\n set({ pageHistory: get().pageHistory.slice(0, -1) });\n }\n },\n replace,\n };\n});\n\nexport const usePortalCurrentPage = () => {\n const { overridingPage, pageHistory } = usePortalNavigation();\n return overridingPage ?? pageHistory[pageHistory.length - 1];\n};\n","import { TbAlertTriangle, TbInfoCircle, TbCircleCheck, TbX } from 'react-icons/tb';\nimport { motion } from 'motion/react';\nimport { HashLink } from './HashLink';\nimport { cn } from '@/utils';\nimport type { CofheToastVariant, CofheToastImperativeParams, CofheToastInjectedProps } from '../types';\n\nexport type ToastPrimitiveProps = CofheToastImperativeParams & CofheToastInjectedProps;\n\nconst variantIconMap: Record<CofheToastVariant, React.ReactNode> = {\n info: <TbInfoCircle className=\"text-blue-500 size-5\" />,\n success: <TbCircleCheck className=\"text-green-500 size-5\" />,\n error: <TbAlertTriangle className=\"text-red-500 size-5\" />,\n warning: <TbAlertTriangle className=\"text-yellow-500 size-5\" />,\n};\n\nconst variantClassNameMap: Record<CofheToastVariant, string> = {\n info: 'bg-blue-50 border-blue-200 text-blue-800',\n success: 'bg-green-50 border-green-200 text-green-800',\n error: 'bg-red-50 border-red-200 text-red-800',\n warning: 'bg-yellow-50 border-yellow-200 text-yellow-800',\n};\n\nconst variantProgressBarColorMap: Record<CofheToastVariant | 'base', string> = {\n base: 'bg-gray-500',\n info: 'bg-blue-500',\n success: 'bg-green-500',\n error: 'bg-red-500',\n warning: 'bg-yellow-500',\n};\n\nconst ToastCloseButton: React.FC<Pick<ToastPrimitiveProps, 'onDismiss'>> = ({ onDismiss }) => {\n return (\n <button className=\"self-start\" onClick={() => onDismiss?.()}>\n <TbX className=\"text-gray-500 size-5\" />\n </button>\n );\n};\n\nconst ToastActionButton: React.FC<Pick<ToastPrimitiveProps, 'action' | 'onDismiss'>> = ({ action, onDismiss }) => {\n if (action == null) return null;\n\n return (\n <button\n onClick={() => {\n onDismiss?.();\n action.onClick();\n }}\n >\n {action.label}\n </button>\n );\n};\n\nconst ToastDurationIndicator: React.FC<\n Pick<ToastPrimitiveProps, 'duration' | 'remainingMs' | 'paused' | 'variant'>\n> = ({ duration, remainingMs, paused, variant }) => {\n if (remainingMs == null || remainingMs <= 0 || duration == null || duration === 'infinite') return null;\n\n const progress = remainingMs / duration;\n const progressColor = variantProgressBarColorMap[variant ?? 'base'];\n\n return (\n <div className=\"absolute bottom-0 left-0 w-full h-1 overflow-hidden\">\n {paused ? (\n <div className={cn(progressColor, 'h-full origin-right')} style={{ transform: `scaleX(${progress})` }} />\n ) : (\n <motion.div\n className={cn('h-full origin-right', progressColor)}\n initial={{ scaleX: progress }}\n animate={{ scaleX: 0 }}\n transition={{\n duration: remainingMs / 1000,\n ease: 'linear',\n }}\n />\n )}\n </div>\n );\n};\n\nexport const ToastPrimitiveBase: React.FC<\n CofheToastInjectedProps & { variant?: CofheToastVariant; children: React.ReactNode }\n> = ({ id, duration, remainingMs, variant, paused, children, onPause, onDismiss }) => {\n return (\n <div\n className={cn(\n 'flex flex-row gap-3 p-2 relative items-center justify-start pb-3',\n variant != null && variantClassNameMap[variant]\n )}\n onMouseEnter={() => {\n if (id == null) return;\n onPause?.(true);\n }}\n onMouseLeave={() => {\n if (id == null) return;\n onPause?.(false);\n }}\n >\n {variant != null && variantIconMap[variant]}\n <div className=\"flex-1\">{children}</div>\n <ToastCloseButton onDismiss={onDismiss} />\n {duration !== 'infinite' && (\n <ToastDurationIndicator duration={duration} remainingMs={remainingMs} paused={paused} variant={variant} />\n )}\n </div>\n );\n};\n\nconst ToastContent: React.FC<\n Pick<ToastPrimitiveProps, 'title' | 'description' | 'transaction' | 'action' | 'onDismiss'>\n> = ({ title, description, transaction, action, onDismiss }) => {\n return (\n <>\n <div className=\"flex flex-col gap-1\">\n <h3 className=\"text-sm font-medium\">{title}</h3>\n {description != null && <p className=\"text-xs\">{description}</p>}\n {transaction != null && <HashLink type=\"tx\" hash={transaction.hash} chainId={transaction.chainId} />}\n </div>\n <div className=\"flex-1\" />\n <ToastActionButton action={action} onDismiss={onDismiss} />\n </>\n );\n};\n\nexport const ToastPrimitive: React.FC<ToastPrimitiveProps> = (props) => {\n return (\n <ToastPrimitiveBase {...props}>\n <ToastContent {...props} />\n </ToastPrimitiveBase>\n );\n};\n","import { useState } from 'react';\nimport { LuCopy, LuCheck, LuExternalLink } from 'react-icons/lu';\nimport { cn } from '../../../utils/cn';\nimport {\n truncateHash,\n getBlockExplorerTxUrl,\n getBlockExplorerAddressUrl,\n getBlockExplorerTokenUrl,\n} from '../../../utils/utils';\nimport { cofheLogger } from '@/utils/debug';\n\nexport type HashLinkType = 'tx' | 'address' | 'token';\n\ninterface HashLinkProps {\n type: HashLinkType;\n hash: string;\n chainId?: number;\n className?: string;\n copyable?: boolean;\n iconSize?: number;\n /** Use extra short truncation (5...3 instead of 6...4) */\n extraShort?: boolean;\n}\n\nexport const HashLink: React.FC<HashLinkProps> = ({\n type,\n hash,\n chainId,\n className,\n copyable = true,\n iconSize = 14,\n extraShort = false,\n}) => {\n const start = extraShort ? 5 : 6;\n const end = extraShort ? 3 : 4;\n const ellipsed = truncateHash(hash, start, end);\n\n const getHref = (): string | undefined => {\n if (!chainId) return undefined;\n switch (type) {\n case 'tx':\n return getBlockExplorerTxUrl(chainId, hash);\n case 'address':\n return getBlockExplorerAddressUrl(chainId, hash);\n case 'token':\n return getBlockExplorerTokenUrl(chainId, hash);\n }\n };\n\n const href = getHref();\n\n const handleClick = () => {\n if (href) {\n window.open(href, '_blank', 'noopener,noreferrer');\n }\n };\n\n return (\n <div className=\"flex items-center gap-1.5\">\n {copyable && <CopyButton text={hash} size={iconSize} />}\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={!href}\n className={cn(\n 'flex items-center gap-1 font-mono text-xs hover:underline',\n 'cofhe-text-primary opacity-60 hover:opacity-100 transition-opacity',\n !href && 'cursor-default hover:no-underline',\n className\n )}\n >\n <span>{ellipsed}</span>\n {href && <LuExternalLink style={{ width: iconSize, height: iconSize }} />}\n </button>\n </div>\n );\n};\n\ninterface CopyButtonProps {\n text: string;\n size?: number;\n className?: string;\n}\n// TODO: This will be replaced with the new copy system from another PR\nexport const CopyButton: React.FC<CopyButtonProps> = ({ text, size = 14, className }) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = async (e: React.MouseEvent) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 800);\n } catch (err) {\n cofheLogger.error('Failed to copy address:', err);\n }\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleCopy}\n className={cn('cofhe-text-primary opacity-50 hover:opacity-100 transition-opacity cursor-pointer', className)}\n title=\"Copy to clipboard\"\n >\n {copied ? (\n <LuCheck style={{ width: size, height: size }} className=\"text-green-500\" />\n ) : (\n <LuCopy style={{ width: size, height: size }} />\n )}\n </button>\n );\n};\n","import { ToastPrimitive } from '@/components/CofheFloatingButton/components/ToastPrimitives';\nimport type { CofheFloatingButtonToast, CofheToastImperativeParams } from '@/components/CofheFloatingButton/types';\nimport { isReactNode } from '@/utils';\nimport { create } from 'zustand';\n\ntype PortalToastsStore = {\n toasts: CofheFloatingButtonToast[];\n};\n\ntype PortalToastsActions = {\n addToast: (toast: React.ReactNode | CofheToastImperativeParams, duration?: number | 'infinite') => void;\n pauseToast: (id: string, paused: boolean) => void;\n removeToast: (id: string) => void;\n};\n\nexport const usePortalToasts = create<PortalToastsStore & PortalToastsActions>()((set, get) => ({\n toasts: [],\n\n addToast: (toast, duration = 5000) => {\n const content = isReactNode(toast) ? toast : <ToastPrimitive {...toast} />;\n const existing = get().toasts;\n const updated = [\n ...existing,\n {\n id: crypto.randomUUID(),\n duration,\n startMs: Date.now(),\n remainingMs: duration === 'infinite' ? Infinity : duration,\n paused: false,\n content,\n },\n ];\n set({ toasts: updated });\n },\n pauseToast: (id, paused) => {\n const existing = get().toasts;\n const updated = existing.map((t) => {\n if (t.id !== id) return t;\n if (t.paused === paused) return t;\n\n let remainingMs = t.remainingMs;\n let startMs = Date.now();\n if (paused) {\n const elapsedMs = Date.now() - t.startMs;\n remainingMs = Math.max(0, t.remainingMs - elapsedMs);\n }\n\n return { ...t, paused, startMs, remainingMs };\n });\n set({ toasts: updated });\n },\n removeToast: (id) => {\n const existing = get().toasts;\n set({ toasts: existing.filter((t) => t.id !== id) });\n },\n}));\n","import { usePortalToasts } from '@/stores';\nimport type { DecryptionWatcher } from '@/stores/decryptionWatchingStore';\nimport type { Transaction } from '@/stores/transactionStore';\nimport { ContractFunctionExecutionError, ContractFunctionRevertedError, type TransactionReceipt } from 'viem';\nimport { cofheHumanizeRevertReason } from '@/utils/cofheErrors';\nimport { cofheLogger } from '@/utils/debug';\n\nconst TOAST_DELAY_MS = 10_000;\nfunction useTransactionGlobalToastsLifecycle() {\n const { addToast } = usePortalToasts();\n return {\n // 1.tx is submitted\n onTransactionSubmitted: (transaction: Transaction) => {\n cofheLogger.log('____ Transaction submitted:', transaction);\n addToast(\n {\n variant: 'info',\n title: `${transaction.actionType} Transaction Submitted`,\n description: `${transaction.actionType} transaction has been submitted.`,\n transaction: {\n hash: transaction.hash,\n chainId: transaction.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n },\n onTransactionSubmitError: (error: unknown, transactionType: Transaction['actionType']) => {\n let humanReadableError: string | undefined;\n if (error instanceof ContractFunctionExecutionError) {\n if (error.cause instanceof ContractFunctionRevertedError) {\n const reasonOfRevert = error.cause.raw;\n if (typeof reasonOfRevert === 'string') {\n humanReadableError = cofheHumanizeRevertReason(reasonOfRevert);\n }\n }\n }\n cofheLogger.error('____ Transaction submission failed for type:', transactionType, 'with error:', error);\n addToast(\n {\n variant: 'error',\n title: `${transactionType} Transaction Submission Failed`,\n description:\n humanReadableError ??\n (error instanceof Error ? error.message : 'An unknown error occurred during transaction submission.'),\n },\n TOAST_DELAY_MS\n );\n },\n\n // 2.a. tx is mined (could be success or fail)\n onTransactionMined: (transaction: Transaction, receipt: TransactionReceipt /* could be fail or success */) => {\n cofheLogger.log('____ Transaction mined:', transaction, 'with receipt:', receipt);\n if (receipt.status === 'success') {\n const descriptionPostfix = transaction.isPendingDecryption ? ' It is pending decryption now.' : '';\n addToast(\n {\n variant: transaction.isPendingDecryption ? 'info' : 'success', // if pending decryption, show as info\n title: `${transaction.actionType} Transaction Mined`,\n description: `${transaction.actionType} transaction has been mined.${descriptionPostfix}`,\n transaction: {\n hash: transaction.hash,\n chainId: transaction.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n } else {\n addToast(\n {\n variant: 'error',\n title: `${transaction.actionType} Transaction Failed`,\n description: `${transaction.actionType} transaction has failed.`,\n transaction: {\n hash: transaction.hash,\n chainId: transaction.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n }\n },\n // 2.b. tx receipt fetch failed\n onWatchReceiptFailure: (error: unknown, transaction: Transaction) => {\n cofheLogger.error('____ Transaction receipt fetch failed for tx:', transaction, 'with error:', error);\n addToast(\n {\n variant: 'error',\n title: `${transaction.actionType} Transaction Fetch Failed`,\n description: `Fetching ${transaction.actionType} transaction has failed.`,\n transaction: {\n hash: transaction.hash,\n chainId: transaction.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n },\n\n // 3. tx is decrypted (if applicable)\n onTransactionDecrypted: (decryptionCausingTx: Transaction, decryptionWatcher: DecryptionWatcher) => {\n cofheLogger.log('____ Transaction decrypted:', decryptionCausingTx, 'with watcher:', decryptionWatcher);\n addToast(\n {\n variant: 'success',\n title: `${decryptionCausingTx.actionType} Decryption Succeeded`,\n description: `${decryptionCausingTx.actionType} transaction has been decrypted.`,\n transaction: {\n hash: decryptionCausingTx.hash,\n chainId: decryptionCausingTx.chainId,\n },\n },\n TOAST_DELAY_MS\n );\n },\n };\n}\n\nexport function useTransactionGlobalLifecycle() {\n const {\n onTransactionSubmitted: handleToastsOnTransactionSubmitted,\n onTransactionMined: handleToastsOnTransactionMined,\n onWatchReceiptFailure: handleToastsOnWatchReceiptFailure,\n onTransactionDecrypted: handleToastsOnTransactionDecrypted,\n onTransactionSubmitError: handleToastsOnTransactionSubmitError,\n } = useTransactionGlobalToastsLifecycle();\n\n // You can add more lifecycle handlers here in the future if needed. For now only toasts. Cache invalidations are built-in in other, lower-level hooks.\n return {\n onTransactionSubmitted: handleToastsOnTransactionSubmitted,\n onTransactionMined: handleToastsOnTransactionMined,\n onWatchReceiptFailure: handleToastsOnWatchReceiptFailure,\n onTransactionDecrypted: handleToastsOnTransactionDecrypted,\n onTransactionSubmitError: handleToastsOnTransactionSubmitError,\n };\n}\n","import {\n type UseMutationOptions,\n type UseMutationResult,\n type UseQueryOptions,\n type UseQueryResult,\n} from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofheWalletClient, useCofheChainId, useCofheAccount, useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token, ETH_ADDRESS_LOWERCASE } from './useCofheTokenLists.js';\nimport { assertTokenOperationSupported } from '@/types/token';\nimport {\n getShieldContractConfig,\n getShieldApproveContractConfig,\n getShieldEthContractConfig,\n} from '../constants/confidentialTokenABIs.js';\nimport { TransactionActionType, useTransactionStore } from '../stores/transactionStore.js';\nimport { useInternalMutation, useInternalQuery } from '../providers/index.js';\nimport { assert } from 'ts-essentials';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\nimport type { CofheSimulateWriteContractCallArgs } from './useCofheSimulateWriteContract.js';\n\nexport function getCofheTokenShieldCallArgs(params: { token: Token; amount: bigint; account: Address }): {\n main: CofheSimulateWriteContractCallArgs;\n approval?: CofheSimulateWriteContractCallArgs;\n} {\n const { token, amount, account } = params;\n const tokenAddress: Address = token.address;\n const confidentialityType = token.extensions.fhenix.confidentialityType;\n\n if (!confidentialityType) {\n throw new Error('confidentialityType is required in token extensions');\n }\n\n assertTokenOperationSupported(confidentialityType, 'shield');\n\n const erc20PairAddress = token.extensions.fhenix.erc20Pair?.address;\n const isEth = erc20PairAddress?.toLowerCase() === ETH_ADDRESS_LOWERCASE;\n\n if (isEth) {\n const contractConfig = getShieldEthContractConfig(confidentialityType);\n return {\n main: {\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [account],\n value: amount,\n account,\n chain: undefined,\n },\n };\n }\n\n if (!erc20PairAddress) {\n throw new Error('erc20Pair address is required for wrapped ERC20 tokens');\n }\n\n return {\n approval: {\n address: erc20PairAddress,\n ...getShieldApproveContractConfig(),\n args: [tokenAddress, amount],\n account,\n chain: undefined,\n },\n main: {\n ...getShieldContractConfig(confidentialityType),\n address: tokenAddress,\n args: [account, amount],\n account,\n chain: undefined,\n },\n };\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type UnshieldClaim = {\n ctHash: bigint;\n requestedAmount: bigint;\n decryptedAmount: bigint;\n decrypted: boolean;\n claimed: boolean;\n};\n\ntype UseTokenShieldInput = {\n /** Token object with confidentialityType */\n token: Token;\n /** Amount to shield (in token's smallest unit) */\n amount: bigint;\n /** Optional callback for status updates during the operation */\n onStatusChange?: (message: string) => void;\n};\n\ntype UseTokenShieldOptions = Omit<UseMutationOptions<`0x${string}`, Error, UseTokenShieldInput>, 'mutationFn'>;\n\n// ============================================================================\n// Shield Hook\n// ============================================================================\n\n/**\n * Hook to shield tokens (convert regular balance to confidential)\n * Wrapped tokens call `encrypt` or `encryptETH`, depending on the paired asset.\n * @param options - Optional React Query mutation options\n * @returns Mutation result with transaction hash\n */\nexport function useCofheTokenShield(\n options?: UseTokenShieldOptions\n): UseMutationResult<`0x${string}`, Error, UseTokenShieldInput> {\n const walletClient = useCofheWalletClient();\n const publicClient = useCofhePublicClient();\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n const { onSuccess, onError, ...restOfOptions } = options || {};\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n return useInternalMutation({\n mutationFn: async (input: UseTokenShieldInput) => {\n if (!walletClient) {\n throw new Error('WalletClient is required for token shield');\n }\n\n if (!publicClient) {\n throw new Error('PublicClient is required to simulate shield before writing');\n }\n\n const tokenAddress: Address = input.token.address;\n const confidentialityType = input.token.extensions.fhenix.confidentialityType;\n\n if (!confidentialityType) {\n throw new Error('confidentialityType is required in token extensions');\n }\n\n if (!walletClient.account) {\n throw new Error('Wallet account is required for token shield');\n }\n\n assertTokenOperationSupported(confidentialityType, 'shield');\n\n let hash: `0x${string}`;\n\n const erc20PairAddress = input.token.extensions.fhenix.erc20Pair?.address;\n const isEth = erc20PairAddress?.toLowerCase() === ETH_ADDRESS_LOWERCASE;\n\n if (isEth) {\n const contractConfig = getShieldEthContractConfig(confidentialityType);\n const { request } = await publicClient.simulateContract({\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [walletClient.account.address],\n value: input.amount,\n account: walletClient.account,\n });\n hash = await walletClient.writeContract({ ...request, chain: undefined });\n } else {\n if (!erc20PairAddress) {\n throw new Error('erc20Pair address is required for wrapped ERC20 tokens');\n }\n\n input.onStatusChange?.('Please confirm shield in wallet...');\n const contractConfig = getShieldContractConfig(confidentialityType);\n const { request: encryptRequest } = await publicClient.simulateContract({\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [walletClient.account.address, input.amount],\n account: walletClient.account,\n });\n hash = await walletClient.writeContract({ ...encryptRequest, chain: undefined });\n }\n\n return hash;\n },\n onError: (error, variables, onMutateResult, context) => {\n if (onError) onError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.Shield);\n },\n onSuccess: async (hash, input, onMutateResult, context) => {\n assert(chainId, 'Chain ID is required for token shield');\n assert(account, 'Wallet account is required for token shield');\n if (onSuccess) await onSuccess(hash, input, onMutateResult, context);\n\n // Record transaction and watch for confirmation\n useTransactionStore.getState().addTransaction({\n hash,\n token: input.token,\n tokenAmount: input.amount,\n chainId,\n actionType: TransactionActionType.Shield,\n isPendingDecryption: false, // doesn't need decryption afterwards\n account,\n });\n },\n ...restOfOptions,\n });\n}\n","import { type MutationFunctionContext, type UseMutationOptions, type UseMutationResult } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofheWalletClient, useCofheChainId, useCofheAccount, useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token } from './useCofheTokenLists.js';\nimport { assertTokenOperationSupported } from '@/types/token';\nimport { getUnshieldContractConfig } from '../constants/confidentialTokenABIs.js';\nimport { TransactionActionType, TransactionStatus, useTransactionStore } from '../stores/transactionStore.js';\nimport { useInternalMutation } from '../providers/index.js';\nimport { assert } from 'ts-essentials';\nimport { useOnceTransactionMined } from './useOnceTransactionMined.js';\nimport { useOnceDecrypted } from './useOnceDecrypted.js';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\nimport type { CofheSimulateWriteContractCallArgs } from './useCofheSimulateWriteContract.js';\n\nexport function getCofheTokenUnshieldCallArgs(params: {\n token: Token;\n amount: bigint;\n account: Address;\n}): CofheSimulateWriteContractCallArgs {\n const { token, amount: rawAmount, account } = params;\n const tokenAddress: Address = token.address;\n const confidentialityType = token.extensions.fhenix.confidentialityType;\n\n if (!confidentialityType) {\n throw new Error('confidentialityType is required in token extensions');\n }\n\n assertTokenOperationSupported(confidentialityType, 'unshield');\n\n const contractConfig = getUnshieldContractConfig(confidentialityType);\n\n return {\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [account, rawAmount],\n account,\n chain: undefined,\n };\n}\n\n// ============================================================================\n// Unshield Hook\n// ============================================================================\ntype UseTokenUnshieldMutationInput = {\n /** Token object with confidentialityType */\n token: Token;\n /** Amount to unshield (in token's smallest unit) */\n amount: bigint;\n /** Optional callback for status updates during the operation */\n onStatusChange?: (message: string) => void;\n};\n\ntype UseTokenUnshieldMutationOptions = Omit<\n UseMutationOptions<`0x${string}`, Error, UseTokenUnshieldMutationInput>,\n 'mutationFn'\n>;\n/**\n * Hook to unshield tokens (initiate conversion from confidential to regular)\n * Wrapped tokens call `decrypt(address to, uint128 value)` and then need to be claimed.\n * @param options - Optional React Query mutation options\n * @returns Mutation result with transaction hash\n */\nfunction useCofheTokenUnshieldMutation(\n options?: UseTokenUnshieldMutationOptions\n): UseMutationResult<`0x${string}`, Error, UseTokenUnshieldMutationInput> {\n const walletClient = useCofheWalletClient();\n const publicClient = useCofhePublicClient();\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n\n const { onSuccess, onError, ...restOfOptions } = options || {};\n\n return useInternalMutation({\n mutationFn: async (input: UseTokenUnshieldMutationInput) => {\n if (!walletClient) {\n throw new Error('WalletClient is required for token unshield');\n }\n\n if (!publicClient) {\n throw new Error('PublicClient is required to simulate unshield before writing');\n }\n\n const tokenAddress: Address = input.token.address;\n const confidentialityType = input.token.extensions.fhenix.confidentialityType;\n\n if (!confidentialityType) {\n throw new Error('confidentialityType is required in token extensions');\n }\n\n if (!walletClient.account) {\n throw new Error('Wallet account is required for token unshield');\n }\n\n assertTokenOperationSupported(confidentialityType, 'unshield');\n\n const contractConfig = getUnshieldContractConfig(confidentialityType);\n\n let hash: `0x${string}`;\n\n input.onStatusChange?.('Please confirm in wallet...');\n\n const { request } = await publicClient.simulateContract({\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [walletClient.account.address, input.amount],\n account: walletClient.account,\n });\n hash = await walletClient.writeContract({ ...request, chain: undefined });\n\n return hash;\n },\n onError: (error, variables, onMutateResult, context) => {\n if (onError) onError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.Unshield);\n },\n onSuccess: async (hash, input, onMutateResult, context) => {\n assert(chainId, 'Chain ID is required for token unshield');\n assert(account, 'Wallet account is required for token unshield');\n if (onSuccess) await onSuccess(hash, input, onMutateResult, context);\n\n useTransactionStore.getState().addTransaction({\n hash,\n token: input.token,\n tokenAmount: input.amount,\n chainId,\n actionType: TransactionActionType.Unshield,\n isPendingDecryption: true, // is tx that requires decryption afterwards\n account,\n });\n },\n ...restOfOptions,\n });\n}\n\ntype UseCofheTokenUnshieldInput = {\n onUserSignatureRequest?: (variables: UseTokenUnshieldMutationInput, context: MutationFunctionContext) => void;\n onTransactionSubmitSuccess?: (hash: `0x${string}`) => void;\n onTransactionSubmitError?: (error: Error) => void;\n onceMined?: (transaction: { hash: `0x${string}`; status: TransactionStatus }) => void;\n onceDecrypted?: () => void;\n};\nexport function useCofheTokenUnshield(input: UseCofheTokenUnshieldInput) {\n const unshieldMutation = useCofheTokenUnshieldMutation({\n onMutate: input.onUserSignatureRequest,\n onSuccess: input.onTransactionSubmitSuccess,\n onError: input.onTransactionSubmitError,\n });\n\n const { isMining: isTokenUnshieldMining } = useOnceTransactionMined({\n txHash: unshieldMutation.data,\n onceMined: input.onceMined,\n });\n\n const { isPendingDecryption } = useOnceDecrypted({\n txHash: unshieldMutation.data,\n onceDecrypted: input.onceDecrypted,\n });\n\n return {\n ...unshieldMutation,\n isTokenUnshieldMining,\n isPendingDecryption,\n };\n}\n","import { type Transaction } from '@/stores/transactionStore';\nimport { useMemo } from 'react';\nimport { useStoredTransactions } from './useStoredTransactions';\nimport { assert } from 'ts-essentials';\n\nexport function useStoredTransaction(txHash: `0x${string}` | undefined) {\n const filter = useMemo(() => {\n return (tx: Transaction) => tx.hash === txHash;\n }, [txHash]);\n const { filteredTxs } = useStoredTransactions({ filter });\n assert(filteredTxs.length <= 1, 'There should be at most one transaction with a given hash');\n\n return filteredTxs[0];\n}\n","import { useTransactionStore, type Transaction } from '@/stores/transactionStore';\nimport { useMemo } from 'react';\nimport { assert } from 'ts-essentials';\n\nexport function useStoredTransactions<T>({\n chainId,\n account,\n filter,\n reducer,\n}: {\n chainId?: number;\n account?: string;\n filter?: (tx: Transaction) => boolean;\n reducer?: (txs: Transaction[]) => T;\n}) {\n const transactions = useTransactionStore((state) => state.transactions);\n\n const transactionsAsArray = useMemo(\n () =>\n Object.values(\n chainId\n ? // if chainId provided -- will filter on chain's txs first\n transactions[chainId] ?? {}\n : // if chainId not provided -- will filter on all txs\n Object.values(transactions).flatMap((chainTxs) => Object.values(chainTxs))\n ),\n [transactions, chainId]\n );\n\n const filtered = useMemo(\n () =>\n transactionsAsArray.filter((tx) => {\n if (account && tx.account.toLowerCase() !== account.toLowerCase()) return false;\n\n if (filter && !filter(tx)) return false;\n\n return true;\n }),\n [transactionsAsArray, filter, account]\n );\n\n const reduced = useMemo(() => {\n return reducer?.(filtered);\n }, [filtered, reducer]);\n\n const uniqueHashes = new Set(filtered.map((tx) => tx.hash));\n\n assert(\n uniqueHashes.size === filtered.length,\n 'There should be no duplicate transactions with the same hash in the result'\n );\n\n const filteredTxsByHash = useMemo(\n () =>\n filtered.reduce<Record<`0x${string}`, Transaction>>((acc, tx) => {\n return {\n ...acc,\n [tx.hash]: tx,\n };\n }, {}),\n [filtered]\n );\n return {\n filteredTxs: filtered,\n hashes: uniqueHashes,\n filteredTxsByHash,\n reduced,\n };\n}\n","import type { Transaction, TransactionStatus } from '@/stores/transactionStore';\nimport { useStoredTransaction } from './useStoredTransaction';\nimport { useEffect, useRef } from 'react';\n\n// doesn't perform any RPC calls, uses store as the data source\n// executes callback _only once_ when transaction is mined (i.e. goes from pending to final status - confirmed/failed)\n// i.e. it wont fire again if component re-renders or transaction status changes again (which shouldn't ever happen unless exception, as it's final data from the chain)\n\n// use this hook for ad-hock UI effects that should happen once tx is mined (e.g. show a toast, navigate, etc)\n// DO NOT use this hook for balance invalidation as it's handled in useTrackPendingTransactions\nexport function useOnceTransactionMined({\n txHash,\n onceMined,\n}: {\n txHash: `0x${string}` | undefined;\n onceMined?: (transaction: Transaction) => void;\n}) {\n const { transaction } = useStoredTransactionStatusEffect({\n txHash,\n onTransactionStatusChange: onceMined\n ? (prevStatus, newStatus, transaction) => {\n if (prevStatus === 'pending' && (newStatus === 'confirmed' || newStatus === 'failed')) {\n onceMined(transaction);\n }\n }\n : undefined,\n });\n\n return {\n transaction,\n isMining: transaction?.status === 'pending',\n };\n}\n\nfunction useStoredTransactionStatusEffect({\n txHash,\n onTransactionStatusChange,\n}: {\n txHash: `0x${string}` | undefined;\n onTransactionStatusChange?: (\n prevStatus: TransactionStatus | undefined,\n newStatus: TransactionStatus,\n transaction: Transaction\n ) => void;\n}) {\n const transaction = useStoredTransaction(txHash);\n const previousTransactionRef = useRef<Transaction | undefined>(undefined);\n\n useEffect(() => {\n if (!onTransactionStatusChange) return;\n\n // if status changed and there's a transaction in the store -- trigger the callback\n if (previousTransactionRef.current?.status !== transaction?.status && !!transaction) {\n onTransactionStatusChange(previousTransactionRef.current?.status, transaction.status, transaction);\n\n // update the ref to the latest transaction\n previousTransactionRef.current = transaction;\n }\n }, [onTransactionStatusChange, transaction]);\n\n return {\n transaction,\n };\n}\n","import type { Transaction } from '@/stores/transactionStore';\nimport { useStoredTransaction } from './useStoredTransaction';\nimport { useEffect, useRef } from 'react';\n\n// doesn't perform any RPC calls, uses store as the data source\n// executes callback _only once_ when a transaction enters \"pending decryption\" state\n// i.e. it won't fire again if component re-renders etc\nexport function useOnceDecrypted({\n txHash,\n onceDecrypted,\n}: {\n txHash: `0x${string}` | undefined;\n onceDecrypted?: (transaction: Transaction) => void;\n}) {\n const { transaction } = useStoredTransactionDecryptionEffect({\n txHash,\n onDecryptionPendingChange: onceDecrypted\n ? (prevIsPendingDecryption, newIsPendingDecryption, transaction) => {\n if (prevIsPendingDecryption === true && newIsPendingDecryption === false) {\n onceDecrypted(transaction);\n }\n }\n : undefined,\n });\n\n return {\n transaction,\n isPendingDecryption: transaction?.isPendingDecryption === true,\n };\n}\n\nfunction useStoredTransactionDecryptionEffect({\n txHash,\n onDecryptionPendingChange,\n}: {\n txHash: `0x${string}` | undefined;\n onDecryptionPendingChange?: (\n prevIsPendingDecryption: boolean | undefined,\n newIsPendingDecryption: boolean,\n transaction: Transaction\n ) => void;\n}) {\n const transaction = useStoredTransaction(txHash);\n const previousTransactionRef = useRef<Transaction | undefined>(undefined);\n\n useEffect(() => {\n if (!onDecryptionPendingChange) return;\n // if flag changed and there's a transaction in the store -- trigger the callback\n if (previousTransactionRef.current?.isPendingDecryption !== transaction?.isPendingDecryption && !!transaction) {\n onDecryptionPendingChange(\n previousTransactionRef.current?.isPendingDecryption,\n transaction.isPendingDecryption,\n transaction\n );\n\n // update the ref to the latest transaction\n previousTransactionRef.current = transaction;\n }\n }, [onDecryptionPendingChange, transaction]);\n\n return {\n transaction,\n };\n}\n","import { type UseMutationOptions, type UseMutationResult } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofheWalletClient, useCofheChainId, useCofheAccount, useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token } from './useCofheTokenLists.js';\nimport { assertTokenOperationSupported } from '@/types/token';\nimport { getClaimContractConfig } from '../constants/confidentialTokenABIs.js';\nimport { TransactionActionType, useTransactionStore } from '../stores/transactionStore.js';\nimport { useInternalMutation } from '../providers/index.js';\nimport { assert } from 'ts-essentials';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\nimport type { CofheSimulateWriteContractCallArgs } from './useCofheSimulateWriteContract.js';\n\nexport function getCofheTokenClaimUnshieldedCallArgs(params: {\n token: Token;\n account: Address;\n}): CofheSimulateWriteContractCallArgs {\n const { token, account } = params;\n\n const tokenAddress: Address = token.address;\n const confidentialityType = token.extensions.fhenix.confidentialityType;\n\n if (!confidentialityType) {\n throw new Error('confidentialityType is required in token extensions');\n }\n\n assertTokenOperationSupported(confidentialityType, 'claim');\n\n const contractConfig = getClaimContractConfig(confidentialityType);\n\n return {\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [],\n account,\n chain: undefined,\n };\n}\n\n// ============================================================================\n// Claim Unshield Hook\n// ============================================================================\ntype UseClaimUnshieldInput = {\n /** Token object with confidentialityType */\n token: Token;\n /** Amount being claimed (for activity logging) */\n amount: bigint;\n};\ntype UseClaimUnshieldOptions = Omit<UseMutationOptions<`0x${string}`, Error, UseClaimUnshieldInput>, 'mutationFn'>;\n/**\n * Hook to claim unshielded tokens after decryption completes\n * Wrapped tokens call `claimAllDecrypted()`.\n * @param options - Optional React Query mutation options\n * @returns Mutation result with transaction hash\n */\nexport function useCofheTokenClaimUnshielded(\n options?: UseClaimUnshieldOptions\n): UseMutationResult<`0x${string}`, Error, UseClaimUnshieldInput> {\n const walletClient = useCofheWalletClient();\n const publicClient = useCofhePublicClient();\n const chainId = useCofheChainId();\n const account = useCofheAccount();\n const { onSuccess, onError, ...restOfOptions } = options || {};\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n return useInternalMutation({\n mutationFn: async (input: UseClaimUnshieldInput) => {\n if (!walletClient) {\n throw new Error('WalletClient is required for claim');\n }\n\n if (!publicClient) {\n throw new Error('PublicClient is required to simulate claim before writing');\n }\n\n const tokenAddress: Address = input.token.address;\n const confidentialityType = input.token.extensions.fhenix.confidentialityType;\n\n if (!confidentialityType) {\n throw new Error('confidentialityType is required in token extensions');\n }\n\n if (!walletClient.account) {\n throw new Error('Wallet account is required for claim');\n }\n\n assertTokenOperationSupported(confidentialityType, 'claim');\n\n const contractConfig = getClaimContractConfig(confidentialityType);\n\n const { request } = await publicClient.simulateContract({\n address: tokenAddress,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [],\n account: walletClient.account,\n });\n return await walletClient.writeContract({ ...request, chain: undefined });\n },\n onError: (error, variables, onMutateResult, context) => {\n if (onError) onError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.Claim);\n },\n onSuccess: async (hash, input, onMutateResult, context) => {\n assert(chainId, 'Chain ID is required for claim');\n assert(account, 'Wallet account is required for claim');\n if (onSuccess) await onSuccess(hash, input, onMutateResult, context);\n\n useTransactionStore.getState().addTransaction({\n hash,\n\n token: input.token,\n tokenAmount: input.amount,\n\n chainId,\n actionType: TransactionActionType.Claim,\n isPendingDecryption: false, // doesn't need decryption afterwards\n account,\n });\n },\n ...restOfOptions,\n });\n}\n","import { QueryClient, type QueryKey, type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token } from './useCofheTokenLists.js';\nimport { getClaimableContractConfig } from '../constants/confidentialTokenABIs.js';\nimport { isTokenOperationSupported, type SupportedTokenConfidentialityType } from '@/types/token';\nimport { useInternalQuery } from '../providers/index.js';\nimport { decryptionAwareReadContract } from '@/utils/decryptionAwareReadContract.js';\nimport { useIsWaitingForDecryptionToInvalidate } from './useIsWaitingForDecryptionToInvalidate.js';\nimport { assert } from 'ts-essentials';\nimport { cofheLogger } from '@/utils/debug';\n\nexport function constructUnshieldClaimsQueryKey({\n chainId,\n tokenAddress,\n confidentialityType,\n accountAddress,\n}: {\n chainId: number | undefined;\n tokenAddress: Address | undefined;\n confidentialityType: string | undefined;\n accountAddress: Address | undefined;\n}) {\n return ['unshieldClaims', chainId, tokenAddress, confidentialityType, accountAddress];\n}\nexport function invalidateClaimableQueries({\n token,\n accountAddress,\n queryClient,\n}: {\n token: Token;\n accountAddress: Address;\n queryClient: QueryClient;\n}) {\n cofheLogger.log('Invalidating unshield claims queries for token:', token);\n\n queryClient.invalidateQueries({\n queryKey: constructUnshieldClaimsQueryKeyForInvalidation({\n chainId: token.chainId,\n tokenAddress: token.address,\n confidentialityType: token.extensions.fhenix.confidentialityType,\n accountAddress,\n }),\n });\n}\n\nexport function constructUnshieldClaimsQueryKeyForInvalidation({\n chainId,\n tokenAddress,\n confidentialityType,\n accountAddress,\n}: {\n chainId: number;\n tokenAddress: Address;\n confidentialityType: string;\n accountAddress: Address;\n}) {\n return constructUnshieldClaimsQueryKey({\n chainId,\n tokenAddress,\n confidentialityType,\n accountAddress,\n });\n}\n\nexport const DEFAULT_UNSHIELD_CLAIM_SUMMARY: UnshieldClaimsSummary = {\n claimableAmount: 0n,\n pendingAmount: 0n,\n hasClaimable: false,\n hasPending: false,\n};\n\nexport function isTokenConfidentialityTypeClaimable(\n type: string | undefined\n): type is SupportedTokenConfidentialityType {\n return isTokenOperationSupported(type, 'claimable');\n}\n\nexport type FetchUnshieldClaimsSummaryInput = {\n publicClient: NonNullable<ReturnType<typeof useCofhePublicClient>>;\n token: Token;\n accountAddress: Address;\n confidentialityType: SupportedTokenConfidentialityType;\n queryKey: QueryKey;\n signal: AbortSignal;\n};\n\nexport async function fetchUnshieldClaimsSummary({\n publicClient,\n token,\n accountAddress,\n confidentialityType,\n queryKey,\n signal,\n}: FetchUnshieldClaimsSummaryInput): Promise<UnshieldClaimsSummary> {\n const contractConfig = getClaimableContractConfig(confidentialityType);\n const result = await decryptionAwareReadContract({\n publicClient,\n queryKey,\n signal,\n readContractParams: {\n address: token.address,\n abi: contractConfig.abi,\n functionName: contractConfig.functionName,\n args: [accountAddress],\n },\n });\n\n const claims = result.filter((c) => !c.claimed);\n\n const { claimableAmount, pendingAmount } = claims.reduce(\n (acc, claim) => {\n if (claim.decrypted) {\n acc.claimableAmount += claim.decryptedAmount;\n } else {\n acc.pendingAmount += claim.requestedAmount;\n }\n return acc;\n },\n { claimableAmount: 0n, pendingAmount: 0n }\n );\n\n return {\n claimableAmount,\n pendingAmount,\n hasClaimable: claimableAmount > 0n,\n hasPending: pendingAmount > 0n,\n };\n}\n\n// ============================================================================\n// Unified Unshield Claims Hook\n// ============================================================================\n\n/**\n * Unshield claims summary for wrapped tokens.\n */\nexport type UnshieldClaimsSummary = {\n /** Total amount that can be claimed now (decrypted and not claimed) */\n claimableAmount: bigint;\n /** Total amount pending decryption */\n pendingAmount: bigint;\n /** Whether there are any claimable amounts */\n hasClaimable: boolean;\n /** Whether there are any pending (not yet decrypted) claims */\n hasPending: boolean;\n};\n\ntype UseUnshieldClaimsInput = {\n /** Token object with confidentialityType */\n token: Token | undefined;\n /** Account address (optional, defaults to connected account) */\n accountAddress: Address | undefined;\n};\n\ntype UseUnshieldClaimsOptions = Omit<UseQueryOptions<UnshieldClaimsSummary, Error>, 'queryKey' | 'queryFn'>;\n\n/**\n * Hook to fetch wrapped-token unshield claims.\n * @param input - Token object and optional account address\n * @param queryOptions - Optional React Query options\n * @returns Query result with UnshieldClaimsSummary\n */\nexport function useCofheTokenClaimable(\n { accountAddress: account, token }: UseUnshieldClaimsInput,\n queryOptions?: UseUnshieldClaimsOptions\n): UseQueryResult<UnshieldClaimsSummary, Error> & {\n isWaitingForDecryption: boolean;\n} {\n const publicClient = useCofhePublicClient();\n\n const confidentialityType = token?.extensions.fhenix.confidentialityType;\n\n const queryKey = constructUnshieldClaimsQueryKey({\n chainId: token?.chainId,\n tokenAddress: token?.address,\n confidentialityType,\n accountAddress: account,\n });\n // is waiting for decryption finalization -> once Unshield tx mined, but before Decryption result available\n const isWaitingForDecryption = useIsWaitingForDecryptionToInvalidate(queryKey);\n\n const result = useInternalQuery({\n queryKey,\n queryFn: async ({ signal, queryKey }): Promise<UnshieldClaimsSummary> => {\n assert(token, 'token is guaranteed to be defined in query function due to `enabled` condition');\n assert(confidentialityType, 'token.confidentialityType is guaranteed to be defined in query function');\n assert(account, 'account is guaranteed to be defined in query function due to `enabled` condition');\n assert(publicClient, 'publicClient is guaranteed to be defined in query function due to `enabled` condition');\n\n assert(\n isTokenConfidentialityTypeClaimable(confidentialityType),\n 'confidentialityType is guaranteed to be claimable type due to `enabled` condition'\n );\n\n return fetchUnshieldClaimsSummary({\n publicClient,\n token,\n accountAddress: account,\n confidentialityType,\n queryKey,\n signal,\n });\n },\n refetchOnMount: false,\n enabled: !!publicClient && !!account && !!token && isTokenConfidentialityTypeClaimable(confidentialityType),\n ...queryOptions,\n });\n\n return {\n ...result,\n isWaitingForDecryption,\n };\n}\n","import { type QueryKey } from '@tanstack/react-query';\nimport { type Abi, type Address, type ContractFunctionArgs, type ContractFunctionName, type PublicClient } from 'viem';\nimport { useDecryptionWatchersStore } from '@/stores/decryptionWatchingStore.js';\nimport {\n maybeWaitUntilRpcAwareAndReadContract,\n type ReadContractResult,\n type WaitUntilRpcAwareAndReadContractOptions,\n} from '../utils/waitUntilRpcAwareAndReadContract.js';\nimport { cofheLogger } from './debug';\n\nexport const BLOCK_AWARENESS_POLLING_INTERVAL = 3_000; // 5 seconds\n\ntype Input<TAbi extends Abi, TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>> = {\n publicClient: PublicClient;\n queryKey: QueryKey;\n signal: AbortSignal;\n readContractParams: {\n address: Address;\n abi: TAbi;\n functionName: TfunctionName;\n args: ContractFunctionArgs<TAbi, 'pure' | 'view', TfunctionName>;\n };\n};\nexport function decryptionAwareReadContract<\n TAbi extends Abi,\n TfunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,\n>({\n publicClient,\n queryKey,\n signal,\n readContractParams,\n}: Input<TAbi, TfunctionName>): Promise<ReadContractResult<TAbi, TfunctionName>> {\n const decryptionWatchersState = useDecryptionWatchersStore.getState();\n\n // if there was a tx previously, which caused the need to invalidae this query upon decryption observation,\n // and if decryption has been observed for it, use the block hash to ensure RPC is aware of it\n // so that readContract can read up-to-date data\n const blockHashToBeAwareOf =\n decryptionWatchersState.findObservedDecryption(queryKey)?.decryptionObservedAt?.blockHash;\n\n cofheLogger.log('Tracked decryption block for unshield claims:', blockHashToBeAwareOf);\n\n const rpcAwarenessOptions: WaitUntilRpcAwareAndReadContractOptions = {\n signal,\n pollingInterval: BLOCK_AWARENESS_POLLING_INTERVAL,\n onSuccess: () => {\n // once we have successfully read decrypted data, remove the invalidation tracking\n decryptionWatchersState.removeQueryKeyFromWatchers(queryKey);\n },\n };\n\n return maybeWaitUntilRpcAwareAndReadContract(\n publicClient,\n {\n blockHashToBeAwareOf,\n ...readContractParams,\n },\n rpcAwarenessOptions\n );\n}\n","import type { QueryKey } from '@tanstack/react-query';\nimport type { Address } from 'viem';\nimport { create } from 'zustand';\nimport { createJSONStorage, persist } from 'zustand/middleware';\nimport { bigintJSONStorageOptions } from '@/utils/bigintJson';\nimport type { TransactionActionType } from './transactionStore';\n\nexport type DecryptionWatcherStatus = 'scheduled' | 'executed';\n\nexport type DecryptionWatcher = {\n key: `${TransactionActionType}-tx-0x${string}`;\n createdAt: number;\n triggerTxHash: `0x${string}`;\n decryptionObservedAt?: {\n blockNumber: bigint;\n timestamp: number;\n blockHash?: `0x${string}`;\n };\n chainId: number;\n accountAddress: Address;\n queryKeys: QueryKey[];\n};\n\ntype DecryptionWatchersState = {\n byKey: Record<string, DecryptionWatcher>;\n\n upsert: (input: Omit<DecryptionWatcher, 'status'> & { status?: DecryptionWatcherStatus }) => void;\n setDecryptionObservedAt: (params: { key: string; blockNumber: bigint; blockHash?: `0x${string}` }) => void;\n findObservedDecryption: (queryKey: QueryKey) => DecryptionWatcher | undefined;\n removeQueryKeyFromWatchers: (queryKey: QueryKey) => void;\n};\n\n// Custom storage to handle bigint serialization\nconst bigintStorage = createJSONStorage<DecryptionWatchersState>(() => localStorage, bigintJSONStorageOptions);\n\nexport const useDecryptionWatchersStore = create<DecryptionWatchersState>()(\n persist(\n (set, get) => ({\n byKey: {},\n\n upsert: (input) => {\n set((state) => {\n return {\n byKey: {\n ...state.byKey,\n [input.key]: input,\n },\n };\n });\n },\n findObservedDecryption: (queryKey) => {\n return Object.values(get().byKey).find((item) =>\n item.queryKeys.some((key) => JSON.stringify(key) === JSON.stringify(queryKey) && !!item.decryptionObservedAt)\n );\n },\n removeQueryKeyFromWatchers: (queryKey) => {\n set((state) => {\n const updatedByKey = { ...state.byKey };\n // remove the queryKey from all scheduled invalidations\n for (const [key, item] of Object.entries(updatedByKey)) {\n const matchingIndex = item.queryKeys.findIndex(\n (keyInItem) => JSON.stringify(keyInItem) === JSON.stringify(queryKey)\n );\n if (matchingIndex !== -1) {\n const newQueryKeys = [...item.queryKeys];\n newQueryKeys.splice(matchingIndex, 1);\n updatedByKey[key] = {\n ...item,\n queryKeys: newQueryKeys,\n };\n }\n }\n\n // if any invalidation has no more queryKeys, remove it entirely\n for (const [key, item] of Object.entries(updatedByKey)) {\n if (item.queryKeys.length === 0) {\n delete updatedByKey[key];\n }\n }\n return {\n byKey: updatedByKey,\n };\n });\n },\n\n setDecryptionObservedAt: ({\n key,\n blockNumber,\n blockHash,\n }: {\n key: string;\n blockNumber: bigint;\n blockHash?: `0x${string}`;\n }) => {\n set((state) => {\n const existing = state.byKey[key];\n if (!existing) return state;\n return {\n byKey: {\n ...state.byKey,\n [key]: {\n ...existing,\n decryptionObservedAt: {\n blockNumber,\n blockHash,\n timestamp: Date.now(),\n },\n },\n },\n };\n });\n },\n }),\n {\n name: 'cofhe-scheduled-invalidations',\n storage: bigintStorage,\n version: 1,\n }\n )\n);\n","import { useDecryptionWatchersStore } from '@/stores/decryptionWatchingStore';\nimport { useMemo } from 'react';\nimport type { QueryKey } from '@tanstack/react-query';\nimport { cofheLogger } from '@/utils/debug';\n\nexport function useAwaitingDecryptionQueryKeySet(): ReadonlySet<string> {\n const { byKey } = useDecryptionWatchersStore();\n\n const cacheKeysAwaitingDecryption = useMemo(() => Object.values(byKey).flatMap((item) => item.queryKeys), [byKey]);\n\n return useMemo(\n () => new Set(cacheKeysAwaitingDecryption.map((key) => JSON.stringify(key))),\n [cacheKeysAwaitingDecryption]\n );\n}\n\nexport function useIsWaitingForDecryptionToInvalidate(queryKey: QueryKey): boolean {\n const cacheKeySet = useAwaitingDecryptionQueryKeySet();\n\n const result = useMemo(() => cacheKeySet.has(JSON.stringify(queryKey)), [cacheKeySet, queryKey]);\n\n cofheLogger.log(`isWaitingForDecryption for queryKey ${JSON.stringify(queryKey)}:`, result);\n\n return result;\n}\n","import { type QueryFunctionContext, type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { useMemo } from 'react';\nimport { type Address } from 'viem';\nimport { assert } from 'ts-essentials';\n\nimport { useCofheAccount, useCofheChainId, useCofhePublicClient } from './useCofheConnection.js';\nimport { type Token } from './useCofheTokenLists.js';\nimport { useInternalQueries } from '../providers/index.js';\nimport { useNormalizedList } from './useNormalizedList.js';\nimport { useIsWaitingForDecryptionByAddress } from './useIsWaitingForDecryptionByAddress.js';\nimport {\n constructUnshieldClaimsQueryKey,\n DEFAULT_UNSHIELD_CLAIM_SUMMARY,\n fetchUnshieldClaimsSummary,\n isTokenConfidentialityTypeClaimable,\n type UnshieldClaimsSummary,\n} from './useCofheTokenClaimable.js';\nimport { useStoredTransactions } from './useStoredTransactions.js';\nimport { TransactionActionType, TransactionStatus } from '@/stores/transactionStore.js';\n\nexport type UnshieldClaimsSummaryByTokenAddress = Record<Address, UnshieldClaimsSummary>;\nexport type ClaimableAmountByTokenAddress = Record<Address, bigint>;\nexport type BooleanByAddress = Record<Address, boolean>;\n\ntype UseUnshieldClaimsManyInput = {\n tokens: Token[];\n accountAddress: Address | undefined;\n};\n\ntype UseUnshieldClaimsManyOptions = Omit<\n UseQueryOptions<\n UnshieldClaimsSummary,\n Error,\n UnshieldClaimsSummary,\n ReturnType<typeof constructUnshieldClaimsQueryKey>\n >,\n 'queryKey' | 'queryFn' | 'enabled'\n>;\n\ntype ClaimableToken = Token & {\n extensions: Token['extensions'] & {\n fhenix: Token['extensions']['fhenix'] & {\n confidentialityType: 'wrapped';\n };\n };\n};\n\nfunction isClaimableToken(token: Token): token is ClaimableToken {\n return isTokenConfidentialityTypeClaimable(token.extensions?.fhenix?.confidentialityType);\n}\n\nfunction claimableDedupeKey(token: ClaimableToken): string {\n const confidentialityType = token.extensions.fhenix.confidentialityType;\n return `${token.chainId}:${token.address.toLowerCase()}:${confidentialityType}`;\n}\n\nfunction claimableSort(a: ClaimableToken, b: ClaimableToken): number {\n if (a.chainId !== b.chainId) return a.chainId - b.chainId;\n return a.address.toLowerCase().localeCompare(b.address.toLowerCase());\n}\ntype CombinedResult = {\n summariesByTokenAddress: UnshieldClaimsSummaryByTokenAddress;\n claimableByTokenAddress: ClaimableAmountByTokenAddress;\n isWaitingForDecryptionByTokenAddress?: BooleanByAddress;\n isUnshieldingInProgressByTokenAddress?: BooleanByAddress;\n isClaimingByTokenAddress?: BooleanByAddress;\n queries: UseQueryResult<UnshieldClaimsSummary, Error>[];\n isLoading: boolean;\n isFetching: boolean;\n isError: boolean;\n totalTokensClaimable: number;\n error: Error | null;\n};\n\nconst pendingClaimsFilter = (tx: { actionType: TransactionActionType; status: TransactionStatus }) =>\n tx.actionType === TransactionActionType.Claim && tx.status === TransactionStatus.Pending;\n\nconst pendingUnshieldsFilter = (tx: { actionType: TransactionActionType; status: TransactionStatus }) =>\n tx.actionType === TransactionActionType.Unshield && tx.status === TransactionStatus.Pending;\n\nconst asBooleanByTokenAddressLowercase = (\n txs: { token: { address: string }; actionType: TransactionActionType; status: TransactionStatus }[]\n) => {\n return txs.reduce<Record<string, boolean>>((acc, tx) => {\n const key = tx.token.address.toLowerCase();\n acc[key] = true;\n\n return acc;\n }, {});\n};\n\nexport function useCofheTokensClaimable(\n { tokens, accountAddress: account }: UseUnshieldClaimsManyInput,\n queryOptions?: UseUnshieldClaimsManyOptions\n): CombinedResult {\n const publicClient = useCofhePublicClient();\n\n const normalizedTokens = useNormalizedList(tokens, {\n filter: isClaimableToken,\n dedupeKey: claimableDedupeKey,\n sort: claimableSort,\n });\n\n const enabledBase = !!publicClient && !!account && normalizedTokens.length > 0;\n\n const waitingEntries = useMemo(() => {\n if (!account) return [];\n return normalizedTokens.map((token) => ({\n address: token.address,\n queryKey: constructUnshieldClaimsQueryKey({\n chainId: token.chainId,\n tokenAddress: token.address,\n confidentialityType: token.extensions.fhenix.confidentialityType,\n accountAddress: account,\n }),\n }));\n }, [account, normalizedTokens]);\n\n const isWaitingForDecryptionByTokenAddress = useIsWaitingForDecryptionByAddress(waitingEntries);\n\n const chainId = useCofheChainId();\n\n const { reduced: isUnshieldingInProgressByTokenAddress } = useStoredTransactions({\n chainId,\n account,\n filter: pendingUnshieldsFilter,\n reducer: asBooleanByTokenAddressLowercase,\n });\n\n const { reduced: isClaimingByTokenAddress } = useStoredTransactions({\n chainId,\n account,\n filter: pendingClaimsFilter,\n reducer: asBooleanByTokenAddressLowercase,\n });\n\n const combined = useInternalQueries({\n queries: normalizedTokens.map((token) => {\n const confidentialityType = token.extensions.fhenix.confidentialityType;\n const queryKey = constructUnshieldClaimsQueryKey({\n chainId: token.chainId,\n tokenAddress: token.address,\n confidentialityType,\n accountAddress: account,\n });\n\n return {\n queryKey,\n queryFn: async ({\n signal,\n queryKey,\n }: QueryFunctionContext<ReturnType<typeof constructUnshieldClaimsQueryKey>>) => {\n assert(\n isTokenConfidentialityTypeClaimable(confidentialityType),\n 'confidentialityType narrowed by token guard'\n );\n\n assert(account, 'account is required to fetch unshield claims');\n assert(publicClient, 'publicClient is required to fetch unshield claims');\n\n return fetchUnshieldClaimsSummary({\n publicClient,\n token,\n accountAddress: account,\n confidentialityType,\n queryKey,\n signal,\n });\n },\n refetchOnMount: false,\n enabled: enabledBase,\n ...queryOptions,\n };\n }),\n combine: (results) => {\n return results.reduce<\n Omit<\n CombinedResult,\n 'isWaitingForDecryptionByTokenAddress' | 'isUnshieldingInProgressByTokenAddress' | 'isClaimingByTokenAddress'\n >\n >(\n (acc, result, index) => {\n const token = normalizedTokens[index];\n if (!token) return acc;\n\n const summary = result.data ?? DEFAULT_UNSHIELD_CLAIM_SUMMARY;\n acc.summariesByTokenAddress[token.address] = summary;\n acc.claimableByTokenAddress[token.address] = summary.claimableAmount;\n\n if (summary.hasClaimable) {\n acc.totalTokensClaimable += 1;\n }\n\n acc.isLoading = acc.isLoading || result.isLoading;\n acc.isFetching = acc.isFetching || result.isFetching;\n acc.isError = acc.isError || result.isError;\n if (!acc.error && result.error) acc.error = result.error;\n\n return acc;\n },\n {\n summariesByTokenAddress: {},\n claimableByTokenAddress: {},\n totalTokensClaimable: 0,\n queries: results,\n isLoading: false,\n isFetching: false,\n isError: false,\n error: null,\n }\n );\n },\n });\n\n return {\n summariesByTokenAddress: combined.summariesByTokenAddress,\n claimableByTokenAddress: combined.claimableByTokenAddress,\n totalTokensClaimable: combined.totalTokensClaimable,\n queries: combined.queries,\n isLoading: combined.isLoading,\n isFetching: combined.isFetching,\n isError: combined.isError,\n error: combined.error,\n isWaitingForDecryptionByTokenAddress,\n isUnshieldingInProgressByTokenAddress,\n isClaimingByTokenAddress,\n };\n}\n","import { useMemo } from 'react';\n\nexport type NormalizeOptions<T, U extends T = T> = {\n /** Optional filter; can be a type guard to narrow the output type */\n filter?: (item: T) => item is U;\n /** Optional de-dupe key function */\n dedupeKey?: (item: U) => string;\n /** Optional deterministic sort */\n sort?: (a: U, b: U) => number;\n};\n\nexport function useNormalizedList<T, U extends T = T>(items: T[] | undefined, options?: NormalizeOptions<T, U>): U[] {\n return useMemo(() => {\n if (!items || items.length === 0) return [];\n\n const filter = options?.filter;\n const dedupeKey = options?.dedupeKey;\n const sort = options?.sort;\n\n const filtered = (filter ? items.filter(filter) : (items as unknown as U[])) as U[];\n\n const deduped = (() => {\n if (!dedupeKey) return filtered;\n const seen = new Set<string>();\n const unique: U[] = [];\n for (const item of filtered) {\n const key = dedupeKey(item);\n if (seen.has(key)) continue;\n seen.add(key);\n unique.push(item);\n }\n return unique;\n })();\n\n if (sort) deduped.sort(sort);\n\n return deduped;\n }, [items, options?.dedupeKey, options?.filter, options?.sort]);\n}\n\n// Compatibility aliases (internal/private helper; keep naming flexible)\nexport const useNormalizedItems = useNormalizedList;\nexport const useNormalizedTokens = useNormalizedList;\n","import { useMemo } from 'react';\nimport { isAddress, type Address } from 'viem';\nimport { assert } from 'ts-essentials';\nimport type { QueryKey } from '@tanstack/react-query';\nimport { useAwaitingDecryptionQueryKeySet } from './useIsWaitingForDecryptionToInvalidate.js';\n\nexport type IsWaitingForDecryptionByAddress = Record<Address, boolean>;\n\nexport type WaitingForDecryptionEntry = {\n address: Address;\n queryKey: QueryKey;\n};\n\n/**\n * Given a list of entries and the invalidation-store snapshot, computes whether each address\n * is currently awaiting decryption invalidation.\n */\nexport function useIsWaitingForDecryptionByAddress(\n entries: WaitingForDecryptionEntry[]\n): IsWaitingForDecryptionByAddress {\n const awaitingDecryptionKeySet = useAwaitingDecryptionQueryKeySet();\n\n return useMemo(() => {\n const map: IsWaitingForDecryptionByAddress = {};\n\n for (const entry of entries) {\n assert(isAddress(entry.address), 'address is valid');\n map[entry.address] = awaitingDecryptionKeySet.has(JSON.stringify(entry.queryKey));\n }\n\n return map;\n }, [awaitingDecryptionKeySet, entries]);\n}\n","import { useMemo } from 'react';\nimport type { Address } from 'viem';\n\nimport type { Token } from '@/types/token';\nimport { useCofheAccount, useCofheChainId } from './useCofheConnection';\nimport { useCofheTokens } from './useCofheTokenLists';\nimport { getTokenContractConfig } from '../constants/confidentialTokenABIs';\nimport {\n useCofheReadContracts,\n type CofheReadContractsContract,\n type UseCofheReadContractsQueryOptions,\n} from './useCofheReadContracts';\n\nfunction asCtHash(value: unknown): bigint | undefined {\n if (typeof value === 'bigint') return value;\n if (value && typeof value === 'object' && 'ctHash' in value) {\n const ctHash = (value as { ctHash?: unknown }).ctHash;\n if (typeof ctHash === 'bigint') return ctHash;\n }\n return undefined;\n}\n\nexport type UseCofheTokensWithExistingBalancesInput = {\n chainId?: number;\n accountAddress?: Address;\n};\n\nexport type UseCofheTokensWithExistingBalancesResult = {\n tokens: Token[];\n tokensWithExistingEncryptedBalance: Token[];\n ctHashByTokenAddress: Record<string, bigint>;\n\n isLoading: boolean;\n isFetching: boolean;\n isError: boolean;\n error: Error | null;\n\n refetch: () => Promise<unknown>;\n};\n\n/**\n * Returns tokens whose confidential (encrypted) balance handle exists for the given account.\n *\n * This does NOT decrypt balances. It only checks if the encrypted balance return value (ctHash) is non-zero.\n */\nexport function useCofheTokensWithExistingEncryptedBalances(\n { chainId: _chainId, accountAddress }: UseCofheTokensWithExistingBalancesInput = {},\n queryOptions?: UseCofheReadContractsQueryOptions\n): UseCofheTokensWithExistingBalancesResult {\n const connectedAccount = useCofheAccount();\n const account = accountAddress ?? connectedAccount;\n const currentChainId = useCofheChainId();\n const chainIdForTokens = _chainId ?? currentChainId;\n\n const tokens = useCofheTokens(chainIdForTokens);\n\n const contracts = useMemo((): readonly CofheReadContractsContract[] => {\n if (!account) return [];\n\n return tokens.map((token) => {\n const config = getTokenContractConfig(token.extensions.fhenix.confidentialityType);\n return {\n address: token.address,\n abi: config.abi,\n functionName: config.functionName,\n args: [account],\n };\n });\n }, [account, tokens]);\n\n const read = useCofheReadContracts(\n {\n contracts,\n multicallOptions: {\n allowFailure: true,\n },\n },\n {\n refetchOnMount: false,\n ...queryOptions,\n enabled: (queryOptions?.enabled ?? true) && !!account && tokens.length > 0,\n }\n );\n\n const { tokensWithExistingEncryptedBalance, ctHashByTokenAddress, error } = useMemo(() => {\n const map: Record<string, bigint> = {};\n const filtered: Token[] = [];\n\n const items = read.data;\n if (!items || items.length === 0) {\n return {\n tokensWithExistingEncryptedBalance: filtered,\n ctHashByTokenAddress: map,\n error: read.error ?? null,\n };\n }\n\n for (let index = 0; index < tokens.length; index++) {\n const token = tokens[index];\n const item = items[index];\n if (!token || !item) continue;\n if (item.error) continue;\n\n const ctHash = asCtHash(item.result);\n if (ctHash == null) continue;\n if (ctHash === 0n) continue;\n\n map[token.address.toLowerCase()] = ctHash;\n filtered.push(token);\n }\n\n return {\n tokensWithExistingEncryptedBalance: filtered,\n ctHashByTokenAddress: map,\n error: read.error ?? null,\n };\n }, [read.data, read.error, tokens]);\n\n return {\n tokens,\n tokensWithExistingEncryptedBalance,\n ctHashByTokenAddress,\n\n isLoading: read.isLoading,\n isFetching: read.isFetching,\n isError: read.isError,\n error,\n\n refetch: read.refetch,\n };\n}\n","import { type UseQueryOptions, type UseQueryResult } from '@tanstack/react-query';\nimport { assert } from 'ts-essentials';\nimport type { Address } from 'viem';\nimport { useCofheChainId, useCofhePublicClient } from './useCofheConnection';\nimport { useInternalQuery } from '../providers/index';\nimport { transformEncryptedReturnTypes, type Abi } from '@cofhe/abi';\nimport { serializeBigintRecursively } from '../utils/serializeBigint.js';\n\nconst QUERY_CACHE_PREFIX = 'cofheReadContracts';\n\nexport type CofheReadContractsContract = {\n address: Address;\n abi: Abi;\n functionName: string;\n args?: readonly unknown[];\n};\n\nexport type CofheReadContractsMulticallOptions = {\n /**\n * When `true` (default in viem), returns per-call status objects.\n * When `false`, throws on any failed call.\n */\n allowFailure?: boolean;\n /** Optional viem multicall options (kept loose to avoid coupling to viem's internal generics). */\n [key: string]: unknown;\n};\n\nexport type CofheReadContractsItem = {\n result?: unknown;\n error?: Error;\n};\n\nexport type UseCofheReadContractsQueryOptions = Omit<\n UseQueryOptions<CofheReadContractsItem[], Error>,\n 'queryKey' | 'queryFn'\n> & {\n enabled?: boolean;\n};\n\nexport function constructCofheReadContractsQueryKey(params: {\n cofheChainId?: number;\n contracts?: readonly CofheReadContractsContract[];\n allowFailure?: boolean;\n enabled?: boolean;\n}): readonly unknown[] {\n const { cofheChainId, contracts, allowFailure, enabled } = params;\n\n const serializedContracts = (contracts ?? []).map((contract) => {\n // Avoid putting non-serializable values in queryKey.\n // `abi` is typically a plain JSON array, safe to include.\n return {\n address: contract.address,\n functionName: contract.functionName,\n args: Array.isArray(contract.args) ? serializeBigintRecursively(contract.args) : contract.args,\n abi: contract.abi,\n };\n });\n\n return [QUERY_CACHE_PREFIX, cofheChainId, serializedContracts, allowFailure, enabled];\n}\n\nexport function getEnabledForCofheReadContracts(params: {\n publicClient: unknown;\n cofheChainId?: number;\n contracts?: readonly CofheReadContractsContract[];\n userEnabled?: boolean;\n}): boolean {\n const { publicClient, cofheChainId, contracts, userEnabled } = params;\n\n return !!publicClient && !!cofheChainId && !!contracts && contracts.length > 0 && (userEnabled ?? true);\n}\n\nfunction isViemAllowFailureResult(\n value: unknown\n): value is { status: 'success' | 'failure'; result?: unknown; error?: Error } {\n return !!value && typeof value === 'object' && 'status' in value;\n}\n\nfunction transformResultForContract(contract: CofheReadContractsContract, value: unknown): unknown {\n // `transformEncryptedReturnTypes` expects Cofhe ABI & function typing, but multicall contracts can be heterogeneous.\n // Runtime transformation still works; we keep types intentionally loose here.\n return transformEncryptedReturnTypes(contract.abi, contract.functionName, value);\n}\n\nexport function useCofheReadContracts(\n params: {\n contracts?: readonly CofheReadContractsContract[];\n multicallOptions?: CofheReadContractsMulticallOptions;\n },\n queryOptions?: UseCofheReadContractsQueryOptions\n): UseQueryResult<CofheReadContractsItem[], Error> {\n const { contracts, multicallOptions } = params;\n\n const publicClient = useCofhePublicClient();\n const cofheChainId = useCofheChainId();\n\n const enabled = getEnabledForCofheReadContracts({\n publicClient,\n cofheChainId,\n contracts,\n userEnabled: queryOptions?.enabled,\n });\n\n const { enabled: _ignoredEnabled, ...restQueryOptions } = queryOptions || {};\n\n return useInternalQuery({\n enabled,\n queryKey: constructCofheReadContractsQueryKey({\n cofheChainId,\n contracts,\n allowFailure: multicallOptions?.allowFailure,\n }),\n queryFn: async () => {\n assert(publicClient, 'PublicClient should be guaranteed by enabled check');\n assert(contracts && contracts.length > 0, 'Contracts should be guaranteed by enabled check');\n\n const raw = await publicClient.multicall({\n contracts,\n ...(multicallOptions || {}),\n });\n\n // When `allowFailure: true`, viem returns per-item { status, result?, error? }.\n // When `allowFailure: false`, viem returns an array of results (and throws on failure).\n return raw.map((item, index): CofheReadContractsItem => {\n const contract = contracts[index];\n if (!contract) return { error: new Error('Multicall result length mismatch') };\n\n if (isViemAllowFailureResult(item)) {\n if (item.status === 'failure') {\n return { error: item.error ?? new Error('Multicall call failed') };\n }\n return { result: transformResultForContract(contract, item.result) };\n }\n\n return { result: transformResultForContract(contract, item) };\n });\n },\n ...restQueryOptions,\n });\n}\n","import { useMemo } from 'react';\nimport type { Address } from 'viem';\n\nimport type { Token } from '@/types/token';\nimport { useInternalQueries } from '../providers';\nimport { useCofheAccount, useCofheChainId, useCofhePublicClient } from './useCofheConnection';\nimport { useCofheTokens } from './useCofheTokenLists';\nimport { formatTokenAmount, type TokenFormatOutput } from '@/utils/format';\nimport {\n createPublicTokenBalanceQueryOptions,\n getPublicTokenBalanceSource,\n type PublicTokenBalanceSource,\n type UseTokenBalanceOptions,\n} from './useCofheTokenPublicBalance';\n\nexport type UseTokensWithPublicBalancesInput = {\n chainId?: number;\n accountAddress?: Address;\n displayDecimals?: number;\n};\n\nexport type UseTokensWithPublicBalancesResult = {\n tokens: Token[];\n tokensWithPublicBalances: Token[];\n publicBalanceByTokenAddress: Record<string, TokenFormatOutput>;\n\n isLoading: boolean;\n isFetching: boolean;\n isError: boolean;\n error: Error | null;\n\n refetch: () => Promise<unknown>;\n};\n\n/**\n * Returns CoFHE tokens which have a non-zero public balance.\n *\n * Public balance source:\n * - `wrapped`: underlying `erc20Pair` (or native ETH)\n */\nexport function useTokensWithPublicBalances(\n { chainId: _chainId, accountAddress, displayDecimals = 5 }: UseTokensWithPublicBalancesInput = {},\n options?: { enabled?: boolean } & Omit<UseTokenBalanceOptions, 'select'>\n): UseTokensWithPublicBalancesResult {\n const connectedAccount = useCofheAccount();\n const account = accountAddress ?? connectedAccount;\n\n const currentChainId = useCofheChainId();\n const chainIdForTokens = _chainId ?? currentChainId;\n\n const publicClient = useCofhePublicClient();\n\n const tokens = useCofheTokens(chainIdForTokens);\n\n const sources = useMemo((): Array<{ source: PublicTokenBalanceSource; tokens: Token[] }> => {\n // Multiple CoFHE tokens can share the same public-balance source (e.g. multiple wrapped tokens\n // pointing at the same underlying ERC20). rq warns if we pass duplicate queryKeys\n // within a single `useQueries` call, so we group by source address and fan out results.\n const bySourceAddress = new Map<string, { source: PublicTokenBalanceSource; tokens: Token[] }>();\n\n for (const token of tokens) {\n const source = getPublicTokenBalanceSource(token);\n if (!source) continue;\n\n const key = source.address.toLowerCase();\n const existing = bySourceAddress.get(key);\n if (existing) {\n existing.tokens.push(token);\n } else {\n bySourceAddress.set(key, { source, tokens: [token] });\n }\n }\n\n return Array.from(bySourceAddress.values());\n }, [tokens]);\n\n const { enabled: userEnabled = true, ...restOptions } = options ?? {};\n const enabled = userEnabled && !!publicClient && !!account && sources.length > 0;\n\n const combined = useInternalQueries({\n queries: sources.map(({ source }) =>\n createPublicTokenBalanceQueryOptions({\n publicClient,\n accountAddress: account,\n tokenAddress: source.address,\n queryOptions: {\n enabled,\n ...restOptions,\n },\n })\n ),\n combine: (results) => {\n const out: Token[] = [];\n const balanceMap: Record<string, TokenFormatOutput> = {};\n\n let isLoading = false;\n let isFetching = false;\n let isError = false;\n let error: Error | null = null;\n\n for (let index = 0; index < results.length; index++) {\n const result = results[index];\n const entry = sources[index];\n if (!result || !entry) continue;\n\n isLoading = isLoading || result.isLoading;\n isFetching = isFetching || result.isFetching;\n isError = isError || result.isError;\n if (!error && result.error) error = result.error;\n\n const wei = result.data;\n if (typeof wei !== 'bigint') continue;\n if (wei <= 0n) continue;\n\n const formatted = formatTokenAmount(wei, entry.source.decimals, displayDecimals);\n for (const token of entry.tokens) {\n out.push(token);\n balanceMap[token.address.toLowerCase()] = formatted;\n }\n }\n\n return {\n tokensWithPublicBalances: out,\n publicBalanceByTokenAddress: balanceMap,\n isLoading,\n isFetching,\n isError,\n error,\n refetch: async () => {\n await Promise.all(results.map((r) => r.refetch()));\n },\n };\n },\n });\n\n return {\n tokens,\n tokensWithPublicBalances: combined.tokensWithPublicBalances,\n publicBalanceByTokenAddress: combined.publicBalanceByTokenAddress,\n\n isLoading: combined.isLoading,\n isFetching: combined.isFetching,\n isError: combined.isError,\n error: combined.error,\n\n refetch: combined.refetch,\n };\n}\n","import { type UseQueryOptions } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { useCofheAccount, useCofhePublicClient } from './useCofheConnection';\nimport { type Token, ETH_ADDRESS_LOWERCASE } from './useCofheTokenLists';\nimport { getPublicBalanceSourceType } from '@/types/token';\nimport { ERC20_BALANCE_OF_ABI } from '../constants/erc20ABIs';\nimport { assert } from 'ts-essentials';\nimport { useInternalQuery } from '../providers/index';\nimport { formatTokenAmount, type TokenFormatOutput } from '@/utils/format';\n\nexport function constructPublicTokenBalanceQueryKey({\n chainId,\n accountAddress,\n tokenAddress,\n}: {\n chainId?: number;\n accountAddress?: Address;\n tokenAddress?: Address;\n}): readonly unknown[] {\n return ['tokenBalance', chainId, accountAddress?.toLowerCase(), tokenAddress?.toLowerCase()];\n}\n\nexport function constructPublicTokenBalanceQueryKeyForInvalidation({\n chainId,\n accountAddress,\n tokenAddress,\n}: {\n chainId: number;\n accountAddress: Address;\n tokenAddress: Address;\n}) {\n return constructPublicTokenBalanceQueryKey({\n chainId,\n accountAddress,\n tokenAddress,\n });\n}\n\ntype UseTokenBalanceInput = {\n /** Token contract address */\n tokenAddress?: Address;\n /** Account address to check balance for (optional, defaults to connected account) */\n accountAddress?: Address;\n};\n\nexport type UseTokenBalanceOptions<TSelectedData = bigint> = Omit<\n UseQueryOptions<bigint, Error, TSelectedData>,\n 'queryKey' | 'queryFn'\n>;\n\nexport type PublicTokenBalanceSource = {\n address: Address;\n decimals: number;\n};\n\nexport function getPublicTokenBalanceSource(token: Token | undefined): PublicTokenBalanceSource | undefined {\n const confidentialityType = token?.extensions.fhenix.confidentialityType;\n const underlyingErc20 = token?.extensions.fhenix.erc20Pair;\n\n const publicBalanceSourceType = getPublicBalanceSourceType(confidentialityType);\n const tokenToFetchBalanceFrom =\n publicBalanceSourceType === 'erc20Pair' ? underlyingErc20 : publicBalanceSourceType === 'token' ? token : undefined;\n\n if (!tokenToFetchBalanceFrom) return undefined;\n\n return {\n address: tokenToFetchBalanceFrom.address,\n decimals: tokenToFetchBalanceFrom.decimals,\n };\n}\n\nexport function createPublicTokenBalanceQueryOptions<TSelectedData = bigint>(params: {\n publicClient: ReturnType<typeof useCofhePublicClient>;\n accountAddress?: Address;\n tokenAddress?: Address;\n queryOptions?: UseTokenBalanceOptions<TSelectedData>;\n}): UseQueryOptions<bigint, Error, TSelectedData> {\n const { publicClient, accountAddress, tokenAddress, queryOptions } = params;\n\n const { enabled: userEnabled, ...restQueryOptions } = queryOptions ?? {};\n const baseEnabled = !!publicClient && !!accountAddress && !!tokenAddress;\n const enabled = baseEnabled && (userEnabled ?? true);\n\n const queryKey = constructPublicTokenBalanceQueryKey({\n chainId: publicClient?.chain?.id,\n accountAddress,\n tokenAddress,\n });\n\n return {\n queryKey,\n queryFn: async () => {\n assert(tokenAddress, 'Token address is required to fetch token balance');\n assert(publicClient, 'PublicClient is required to fetch token balance');\n assert(accountAddress, 'Account address is required to fetch token balance');\n\n const isNativeToken = tokenAddress.toLowerCase() === ETH_ADDRESS_LOWERCASE;\n\n const balance = isNativeToken\n ? publicClient.getBalance({\n address: accountAddress,\n })\n : publicClient.readContract({\n address: tokenAddress,\n abi: ERC20_BALANCE_OF_ABI,\n functionName: 'balanceOf',\n args: [accountAddress],\n });\n\n return balance;\n },\n enabled,\n refetchOnMount: false,\n ...restQueryOptions,\n };\n}\n\n/**\n * Hook to get ERC20 token balance and return normalized display value\n * @param input - Token address, decimals, and optional publicClient/accountAddress\n * @param queryOptions - Optional React Query options\n * @returns Query result with normalized balance as string\n */\nfunction useTokenBalance<TSelectedData = bigint>(\n { tokenAddress, accountAddress }: UseTokenBalanceInput,\n queryOptions?: UseTokenBalanceOptions<TSelectedData>\n) {\n const publicClient = useCofhePublicClient();\n\n return useInternalQuery(\n createPublicTokenBalanceQueryOptions({\n publicClient,\n accountAddress,\n tokenAddress,\n queryOptions,\n })\n );\n}\n\n// ============================================================================\n// Unified Public Balance Hook\n// ============================================================================\n\ntype UsePublicTokenBalanceInput = {\n /** Token from token list */\n token: Token | undefined;\n /** Account address (optional, defaults to connected account) */\n accountAddress?: Address;\n /** Display decimals for formatting (default: 5) */\n displayDecimals?: number;\n};\n\ntype UsePublicTokenBalanceResult = {\n data?: TokenFormatOutput;\n /** Whether balance is loading */\n isFetching: boolean;\n /** Refetch function */\n refetch: () => Promise<unknown>;\n};\n\n/**\n * Hook to get public (non-confidential) balance for a token.\n * Handles wrapped tokens by reading the paired ERC20 balance or native ETH balance.\n *\n * @param input - Token and optional account address\n * @param options - Query options\n * @returns Balance data with formatted string, numeric value, loading state, and refetch function\n */\nexport function useCofheTokenPublicBalance(\n { token, accountAddress, displayDecimals = 5 }: UsePublicTokenBalanceInput,\n options?: Omit<UseTokenBalanceOptions, 'select'> // disallow passing 'select' because it's harder to type\n): UsePublicTokenBalanceResult {\n const connectedAccount = useCofheAccount();\n const account = accountAddress || connectedAccount;\n\n const { enabled: userEnabled = true, ...restOptions } = options ?? {};\n\n const tokenToFetchBalanceFrom = getPublicTokenBalanceSource(token);\n\n const { data, isFetching, refetch } = useTokenBalance(\n {\n tokenAddress: tokenToFetchBalanceFrom?.address,\n accountAddress: account,\n },\n {\n enabled: userEnabled,\n select: (value) => {\n assert(\n typeof tokenToFetchBalanceFrom?.decimals === 'number',\n 'Token decimals must be defined to format public token balance'\n );\n return formatTokenAmount(value, tokenToFetchBalanceFrom.decimals, displayDecimals);\n },\n ...restOptions,\n }\n );\n\n return {\n data,\n isFetching,\n refetch,\n };\n}\n","import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport type {\n Address,\n Abi,\n Account,\n Chain,\n ContractFunctionArgs,\n ContractFunctionName,\n PublicClient,\n SimulateContractParameters,\n SimulateContractReturnType,\n} from 'viem';\nimport { assert } from 'ts-essentials';\nimport { useInternalQuery } from '../providers/index.js';\nimport { useCofheChainId, useCofhePublicClient, useCofheWalletClient } from './useCofheConnection.js';\nimport { serializeBigintRecursively, serializeIfBigint } from '../utils/serializeBigint.js';\n\nconst QUERY_CACHE_PREFIX = 'cofheSimulateWriteContract';\n\nexport type CofheSimulateWriteContractCallArgs<\n TAbi extends Abi | readonly unknown[] = Abi,\n TFunctionName extends ContractFunctionName<TAbi, 'nonpayable' | 'payable'> = ContractFunctionName<\n TAbi,\n 'nonpayable' | 'payable'\n >,\n TArgs extends ContractFunctionArgs<TAbi, 'nonpayable' | 'payable', TFunctionName> = ContractFunctionArgs<\n TAbi,\n 'nonpayable' | 'payable',\n TFunctionName\n >,\n TChainOverride extends Chain | undefined = Chain | undefined,\n> = SimulateContractParameters<\n TAbi,\n TFunctionName,\n TArgs,\n Chain | undefined,\n TChainOverride,\n Account | Address | undefined\n>;\n\ntype CofheSimulateWriteContractData<\n TAbi extends Abi | readonly unknown[],\n TFunctionName extends ContractFunctionName<TAbi, 'nonpayable' | 'payable'>,\n TArgs extends ContractFunctionArgs<TAbi, 'nonpayable' | 'payable', TFunctionName>,\n TChainOverride extends Chain | undefined,\n> = SimulateContractReturnType<\n TAbi,\n TFunctionName,\n TArgs,\n Chain | undefined,\n Account | undefined,\n TChainOverride,\n Account | Address | undefined\n>;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction hasAddress(value: object): value is { address: Address } {\n return 'address' in value && typeof (value as { address?: unknown }).address === 'string';\n}\n\nfunction getAccountAddress(account: Account | Address | null | undefined): Address | undefined {\n if (!account) return undefined;\n if (typeof account === 'string') return account;\n if (typeof account === 'object' && hasAddress(account)) return account.address;\n return undefined;\n}\n\nexport type CofheSimulateWriteContractParams = CofheSimulateWriteContractCallArgs;\n\nexport type UseCofheSimulateWriteContractQueryOptions<TData, TSelectedData> = Omit<\n UseQueryOptions<TData, Error, TSelectedData>,\n 'queryKey' | 'queryFn'\n> & {\n enabled?: boolean;\n};\n\nexport function constructCofheSimulateWriteContractQueryKey(params: {\n cofheChainId?: number;\n callArgs?: unknown;\n resolvedAccountAddress?: Address;\n enabled?: boolean;\n}): readonly unknown[] {\n const { cofheChainId, callArgs, resolvedAccountAddress, enabled } = params;\n\n const serialized = isRecord(callArgs)\n ? {\n address: typeof callArgs.address === 'string' ? callArgs.address : undefined,\n functionName: typeof callArgs.functionName === 'string' ? callArgs.functionName : undefined,\n args: Array.isArray(callArgs.args) ? serializeBigintRecursively(callArgs.args) : undefined,\n value: serializeIfBigint(callArgs.value),\n dataSuffix: typeof callArgs.dataSuffix === 'string' ? callArgs.dataSuffix : undefined,\n account: resolvedAccountAddress,\n }\n : undefined;\n\n return [QUERY_CACHE_PREFIX, cofheChainId, serialized, enabled] as const;\n}\n\nexport function useCofheSimulateWriteContract<\n TAbi extends Abi | readonly unknown[] = Abi,\n TFunctionName extends ContractFunctionName<TAbi, 'nonpayable' | 'payable'> = ContractFunctionName<\n TAbi,\n 'nonpayable' | 'payable'\n >,\n TArgs extends ContractFunctionArgs<TAbi, 'nonpayable' | 'payable', TFunctionName> = ContractFunctionArgs<\n TAbi,\n 'nonpayable' | 'payable',\n TFunctionName\n >,\n TChainOverride extends Chain | undefined = Chain | undefined,\n TSelectedData = CofheSimulateWriteContractData<TAbi, TFunctionName, TArgs, TChainOverride>,\n>(\n callArgs?: CofheSimulateWriteContractCallArgs<TAbi, TFunctionName, TArgs, TChainOverride>,\n queryOptions?: UseCofheSimulateWriteContractQueryOptions<\n CofheSimulateWriteContractData<TAbi, TFunctionName, TArgs, TChainOverride>,\n TSelectedData\n >\n): UseQueryResult<TSelectedData, Error> {\n const walletClient = useCofheWalletClient();\n const publicClient = useCofhePublicClient();\n const cofheChainId = useCofheChainId();\n\n const { enabled: userEnabled, ...restQueryOptions } = queryOptions || {};\n\n const resolvedAccountAddress = getAccountAddress(callArgs?.account ?? walletClient?.account);\n const enabled = !!publicClient && !!walletClient && !!callArgs && !!resolvedAccountAddress && (userEnabled ?? true);\n\n type TData = CofheSimulateWriteContractData<TAbi, TFunctionName, TArgs, TChainOverride>;\n\n return useInternalQuery<TData, Error, TSelectedData>({\n enabled,\n queryKey: constructCofheSimulateWriteContractQueryKey({\n cofheChainId,\n callArgs,\n resolvedAccountAddress,\n enabled,\n }),\n retry: false, // no need to retry on error. The whole point of simulation is to check if there's an error\n queryFn: async () => {\n assert(publicClient, 'PublicClient is required to simulate contract');\n assert(walletClient, 'WalletClient is required to simulate contract');\n assert(callArgs, 'callArgs is guaranteed to be defined by enabled condition');\n\n const accountForSimulation = callArgs.account ?? walletClient.account;\n assert(accountForSimulation, 'Wallet account is required to simulate contract');\n\n const simulateArgs: CofheSimulateWriteContractCallArgs<TAbi, TFunctionName, TArgs, TChainOverride> = {\n ...callArgs,\n account: accountForSimulation,\n };\n\n return publicClient.simulateContract<TAbi, TFunctionName, TArgs, TChainOverride, Account | Address | undefined>(\n simulateArgs\n );\n },\n ...restQueryOptions,\n });\n}\n","import type { GeneratePermitPageProps } from '@/components/CofheFloatingButton/pages/permits/GeneratePermitPage/types';\nimport { FloatingButtonPage } from '@/components/CofheFloatingButton/pagesConfig/types';\nimport { usePortalNavigation, usePortalUI } from '@/stores';\n\nimport { useCallback } from 'react';\n\ntype Input = {\n cause?: GeneratePermitPageProps['cause'];\n};\nexport const useCofheNavigateToCreatePermit = () => {\n const { navigateTo, navigateBack } = usePortalNavigation();\n const { portalOpen, openPortal } = usePortalUI();\n\n return useCallback(\n ({ cause }: Input = {}) => {\n if (!portalOpen) openPortal();\n navigateTo(FloatingButtonPage.GeneratePermits, {\n pageProps: { cause, onSuccessNavigateTo: () => navigateBack() },\n navigateParams: { skipPagesHistory: true },\n });\n },\n [openPortal, portalOpen, navigateBack, navigateTo]\n );\n};\n","import { useMemo } from 'react';\nimport type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport type { TransactionReceipt } from 'viem';\nimport { assert } from 'ts-essentials';\n\nimport { useInternalQueries } from '@/providers';\nimport { useCofheChainId, useCofhePublicClient } from './useCofheConnection';\nimport { cofheLogger } from '@/utils/debug';\n\ntype TxReceiptQueryKey = readonly ['tx-receipt', number | undefined, `0x${string}`];\n\nexport type UseTransactionReceiptsByHashInput = {\n hashes?: Set<`0x${string}`>;\n /** Defaults to the connected chain id. */\n chainId?: number;\n enabled?: boolean;\n /** Additional TanStack query options applied to each receipt query. */\n queryOptions?: Omit<\n UseQueryOptions<TransactionReceipt, Error, TransactionReceipt, TxReceiptQueryKey>,\n 'queryKey' | 'queryFn' | 'enabled'\n >;\n};\n\nexport type UseTransactionReceiptsByHashResult = {\n queriesResults: UseQueryResult<TransactionReceipt, Error>[];\n receiptsByHash: Record<`0x${string}`, TransactionReceipt>;\n};\n\n/**\n * Fetch receipts for a list of already-mined transaction hashes.\n * Uses the internal TanStack QueryClient via `useInternalQueries`.\n */\nexport function useTransactionReceiptsByHash(\n { hashes, chainId: chainIdInput, enabled: enabledInput = true, queryOptions }: UseTransactionReceiptsByHashInput = {\n enabled: true,\n }\n): UseTransactionReceiptsByHashResult {\n const publicClient = useCofhePublicClient();\n const cofheChainId = useCofheChainId();\n const chainId = chainIdInput ?? cofheChainId;\n\n const enabled = !!publicClient && !!chainId && enabledInput && hashes !== undefined && hashes?.size > 0;\n\n const queries = useMemo(() => {\n if (!hashes) return [];\n return Array.from(hashes).map((hash) => {\n const queryKey: TxReceiptQueryKey = ['tx-receipt', chainId, hash];\n\n return {\n queryKey,\n enabled,\n queryFn: async (): Promise<TransactionReceipt> => {\n assert(publicClient, 'Public client is guaranteed by enabled condition');\n // The caller guarantees these txs are already mined.\n return await publicClient.getTransactionReceipt({ hash });\n },\n notifyOnChangeProps: ['data'],\n refetchOnWindowFocus: false,\n refetchOnMount: false,\n refetchOnReconnect: false,\n ...queryOptions,\n } satisfies UseQueryOptions<TransactionReceipt, Error, TransactionReceipt, TxReceiptQueryKey>;\n });\n }, [chainId, enabled, hashes, publicClient, queryOptions]);\n\n const queriesResults: UseQueryResult<TransactionReceipt, Error>[] = useInternalQueries({\n queries,\n });\n\n const receiptsByHash = useMemo<Record<`0x${string}`, TransactionReceipt>>(() => {\n cofheLogger.log('useTransactionReceiptsByHash - receiptsByHash recalculated');\n if (!hashes) return {};\n return Array.from(hashes).reduce<Record<`0x${string}`, TransactionReceipt>>((acc, hash, i) => {\n // skip those that don't have receipt data yet\n if (!queriesResults[i]?.data) return acc;\n\n acc[hash] = queriesResults[i].data;\n return acc;\n }, {});\n }, [hashes, queriesResults]);\n\n return { queriesResults, receiptsByHash };\n}\n","import type { Address } from 'viem';\nimport { ETH_ADDRESS_LOWERCASE } from '@/types/token';\n\nexport const DEFAULT_COINGECKO_API_BASE_URL = 'https://api.coingecko.com/api/v3' as const;\n\n// CoinGecko \"platform\" ids used by /simple/token_price/{platform}\nexport const COINGECKO_PLATFORM_BY_CHAIN_ID: Readonly<Record<number, string>> = {\n 1: 'ethereum',\n 10: 'optimistic-ethereum',\n 56: 'binance-smart-chain',\n 100: 'xdai',\n 137: 'polygon-pos',\n 250: 'fantom',\n 42161: 'arbitrum-one',\n 43114: 'avalanche',\n 8453: 'base',\n} as const;\n\n// CoinGecko \"coin\" ids used by /simple/price?ids=...\n// Note: Many EVM chains share native ETH pricing (L2s etc.), but we keep a minimal mapping.\nexport const COINGECKO_NATIVE_COIN_ID_BY_CHAIN_ID: Readonly<Record<number, string>> = {\n 1: 'ethereum',\n 10: 'ethereum',\n 42161: 'ethereum',\n 8453: 'ethereum',\n 100: 'xdai',\n 137: 'matic-network',\n 56: 'binancecoin',\n 43114: 'avalanche-2',\n 250: 'fantom',\n} as const;\n\nexport function normalizeCoingeckoContractAddress(address: Address): string {\n return address.toLowerCase();\n}\n\nexport function getCoingeckoPlatformId(chainId: number | undefined): string | undefined {\n if (!chainId) return undefined;\n return COINGECKO_PLATFORM_BY_CHAIN_ID[chainId];\n}\n\nexport function getCoingeckoNativeCoinId(chainId: number | undefined): string | undefined {\n if (!chainId) return undefined;\n return COINGECKO_NATIVE_COIN_ID_BY_CHAIN_ID[chainId];\n}\n\nexport function buildCoingeckoSimpleTokenPriceUrl({\n apiBaseUrl = DEFAULT_COINGECKO_API_BASE_URL,\n platformId,\n contractAddress,\n}: {\n apiBaseUrl?: string;\n platformId: string;\n contractAddress: Address;\n}): string {\n const contract = normalizeCoingeckoContractAddress(contractAddress);\n const url = new URL(`${apiBaseUrl.replace(/\\/$/, '')}/simple/token_price/${platformId}`);\n url.searchParams.set('contract_addresses', contract);\n url.searchParams.set('vs_currencies', 'usd');\n return url.toString();\n}\n\nexport function buildCoingeckoSimplePriceUrl({\n apiBaseUrl = DEFAULT_COINGECKO_API_BASE_URL,\n coinId,\n}: {\n apiBaseUrl?: string;\n coinId: string;\n}): string {\n const url = new URL(`${apiBaseUrl.replace(/\\/$/, '')}/simple/price`);\n url.searchParams.set('ids', coinId);\n url.searchParams.set('vs_currencies', 'usd');\n return url.toString();\n}\n\nexport function parseCoingeckoSimpleTokenPriceUsd({\n responseJson,\n contractAddress,\n}: {\n responseJson: unknown;\n contractAddress: Address;\n}): number | null {\n const key = normalizeCoingeckoContractAddress(contractAddress);\n const obj = responseJson as Record<string, any>;\n const usd = obj?.[key]?.usd;\n if (typeof usd !== 'number' || !Number.isFinite(usd)) return null;\n return usd;\n}\n\nexport function parseCoingeckoSimplePriceUsd({\n responseJson,\n coinId,\n}: {\n responseJson: unknown;\n coinId: string;\n}): number | null {\n const obj = responseJson as Record<string, any>;\n const usd = obj?.[coinId]?.usd;\n if (typeof usd !== 'number' || !Number.isFinite(usd)) return null;\n return usd;\n}\n\nexport function isNativeTokenAddress(address: Address | undefined): boolean {\n if (!address) return false;\n return address.toLowerCase() === ETH_ADDRESS_LOWERCASE;\n}\n\nexport const TMP_WBTC_ON_MAINNET = {\n chainId: 1,\n address: '0x2260fac5e5542a773aa44fbcfedf7c193bc2c599',\n} as const;\n","import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport type { Address } from 'viem';\n\nimport { useInternalQuery } from '@/providers';\nimport {\n buildCoingeckoSimplePriceUrl,\n buildCoingeckoSimpleTokenPriceUrl,\n DEFAULT_COINGECKO_API_BASE_URL,\n getCoingeckoNativeCoinId,\n getCoingeckoPlatformId,\n isNativeTokenAddress,\n parseCoingeckoSimplePriceUsd,\n parseCoingeckoSimpleTokenPriceUsd,\n} from '@/utils/coingecko';\n\nexport type UseCoingeckoUsdPriceInput = {\n chainId?: number;\n tokenAddress?: Address;\n /** Defaults to true. */\n enabled?: boolean;\n /** Defaults to https://api.coingecko.com/api/v3 */\n apiBaseUrl?: string;\n /** Optional override when chainId isn't in our mapping. */\n platformIdOverride?: string;\n /** Optional override for native token lookup (ETH_ADDRESS). */\n nativeCoinIdOverride?: string;\n};\n\nexport type UseCoingeckoUsdPriceOptions = Omit<\n UseQueryOptions<number | null, Error, number | null>,\n 'queryKey' | 'queryFn' | 'enabled'\n>;\n\n/**\n * Fetches a token's USD price from CoinGecko.\n * - ERC20: uses /simple/token_price/{platform}\n * - Native token (ETH_ADDRESS): uses /simple/price?ids={coinId}\n *\n * Returns `null` when CoinGecko has no price for the token.\n */\nexport function useCoingeckoUsdPrice(\n {\n chainId,\n tokenAddress,\n enabled: enabledInput = true,\n apiBaseUrl,\n platformIdOverride,\n nativeCoinIdOverride,\n }: UseCoingeckoUsdPriceInput,\n queryOptions?: UseCoingeckoUsdPriceOptions\n): UseQueryResult<number | null, Error> {\n const platformId = platformIdOverride ?? getCoingeckoPlatformId(chainId);\n const nativeCoinId = nativeCoinIdOverride ?? getCoingeckoNativeCoinId(chainId);\n const effectiveApiBaseUrl = apiBaseUrl ?? DEFAULT_COINGECKO_API_BASE_URL;\n\n const baseEnabled = !!tokenAddress && (isNativeTokenAddress(tokenAddress) ? !!nativeCoinId : !!platformId);\n const enabled = baseEnabled && enabledInput;\n\n const queryKey = [\n 'coingecko-usd-price',\n { chainId, tokenAddress, apiBaseUrl: effectiveApiBaseUrl, platformId, nativeCoinId },\n ] as const;\n\n return useInternalQuery({\n queryKey,\n enabled,\n queryFn: async ({ signal }) => {\n if (!tokenAddress) throw new Error('tokenAddress is required');\n if (typeof fetch !== 'function') {\n throw new Error('Global fetch is not available in this environment');\n }\n\n if (isNativeTokenAddress(tokenAddress)) {\n if (!nativeCoinId) return null;\n const url = buildCoingeckoSimplePriceUrl({ apiBaseUrl: effectiveApiBaseUrl, coinId: nativeCoinId });\n const res = await fetch(url, { signal, headers: { accept: 'application/json' } });\n if (!res.ok) throw new Error(`CoinGecko request failed: ${res.status} ${res.statusText}`);\n const json = await res.json();\n return parseCoingeckoSimplePriceUsd({ responseJson: json, coinId: nativeCoinId });\n }\n\n if (!platformId) return null;\n const url = buildCoingeckoSimpleTokenPriceUrl({\n apiBaseUrl: effectiveApiBaseUrl,\n platformId,\n contractAddress: tokenAddress,\n });\n\n const res = await fetch(url, { signal, headers: { accept: 'application/json' } });\n if (!res.ok) throw new Error(`CoinGecko request failed: ${res.status} ${res.statusText}`);\n const json = await res.json();\n return parseCoingeckoSimpleTokenPriceUsd({ responseJson: json, contractAddress: tokenAddress });\n },\n // Reasonable defaults; consumer can override via queryOptions.\n staleTime: queryOptions?.staleTime ?? 60_000,\n refetchOnWindowFocus: queryOptions?.refetchOnWindowFocus ?? false,\n ...queryOptions,\n });\n}\n","import type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport type { Address } from 'viem';\n\nimport { useInternalQuery } from '@/providers';\nimport {\n DEFAULT_COINGECKO_API_BASE_URL,\n getCoingeckoPlatformId,\n normalizeCoingeckoContractAddress,\n} from '@/utils/coingecko';\n\nexport type CoingeckoMarketChartPoint = {\n /** Unix ms */\n ts: number;\n /** Price value (e.g. USD) */\n value: number;\n};\n\nexport type UseCoingeckoContractMarketChartRangeInput = {\n chainId?: number;\n contractAddress?: Address;\n /** Defaults to true. */\n enabled?: boolean;\n /** Defaults to https://api.coingecko.com/api/v3 */\n apiBaseUrl?: string;\n /** Optional override when chainId isn't in our mapping. */\n platformIdOverride?: string;\n /** Defaults to 'usd'. */\n vsCurrency?: string;\n /** Defaults to 24 hours. */\n rangeMs?: number;\n};\n\nexport type UseCoingeckoContractMarketChartRangeOptions = Omit<\n UseQueryOptions<CoingeckoMarketChartPoint[] | null, Error, CoingeckoMarketChartPoint[] | null>,\n 'queryKey' | 'queryFn' | 'enabled'\n>;\n\n/**\n * Fetches contract market chart data from CoinGecko using:\n * /coins/{platformId}/contract/{contractAddress}/market_chart/range\n *\n * Returns `null` when CoinGecko has no data or request fails.\n */\nexport function useCoingeckoContractMarketChartRange(\n {\n chainId,\n contractAddress,\n enabled: enabledInput = true,\n apiBaseUrl,\n platformIdOverride,\n vsCurrency = 'usd',\n rangeMs = 24 * 3600_000,\n }: UseCoingeckoContractMarketChartRangeInput,\n queryOptions?: UseCoingeckoContractMarketChartRangeOptions\n): UseQueryResult<CoingeckoMarketChartPoint[] | null, Error> {\n const platformId = platformIdOverride ?? getCoingeckoPlatformId(chainId);\n const effectiveApiBaseUrl = apiBaseUrl ?? DEFAULT_COINGECKO_API_BASE_URL;\n\n const enabled = !!platformId && !!contractAddress && enabledInput;\n\n const queryKey = [\n 'coingecko-contract-market-chart-range',\n { chainId, contractAddress, apiBaseUrl: effectiveApiBaseUrl, platformId, vsCurrency, rangeMs },\n ] as const;\n\n return useInternalQuery({\n queryKey,\n enabled,\n queryFn: async ({ signal }) => {\n if (!platformId || !contractAddress) return null;\n if (typeof fetch !== 'function') {\n throw new Error('Global fetch is not available in this environment');\n }\n\n const now = Date.now();\n const from = Math.floor((now - rangeMs) / 1000);\n const to = Math.floor(now / 1000);\n\n const contract = normalizeCoingeckoContractAddress(contractAddress);\n const url = new URL(\n `${effectiveApiBaseUrl.replace(/\\/$/, '')}/coins/${platformId}/contract/${contract}/market_chart/range`\n );\n url.searchParams.set('vs_currency', vsCurrency);\n url.searchParams.set('from', String(from));\n url.searchParams.set('to', String(to));\n\n try {\n const res = await fetch(url.toString(), { signal, headers: { accept: 'application/json' } });\n if (!res.ok) return null;\n\n const json = (await res.json()) as { prices?: Array<[number, number]> };\n const prices = json.prices ?? [];\n if (prices.length < 2) return null;\n\n const points: CoingeckoMarketChartPoint[] = prices\n .map(([ts, value]) => ({ ts, value }))\n .filter((p) => Number.isFinite(p.ts) && Number.isFinite(p.value));\n\n return points.length >= 2 ? points : null;\n } catch {\n return null;\n }\n },\n staleTime: queryOptions?.staleTime ?? 60_000,\n refetchOnWindowFocus: queryOptions?.refetchOnWindowFocus ?? false,\n ...queryOptions,\n });\n}\n","import { type UseQueryOptions } from '@tanstack/react-query';\nimport { type Address } from 'viem';\nimport { assert } from 'ts-essentials';\n\nimport { getShieldAllowanceContractConfig } from '../constants/confidentialTokenABIs';\nimport { useInternalQuery } from '../providers/index';\nimport { useCofhePublicClient } from './useCofheConnection';\n\nexport function constructTokenAllowanceQueryKey({\n chainId,\n tokenAddress,\n ownerAddress,\n spenderAddress,\n}: {\n chainId?: number;\n tokenAddress?: Address;\n ownerAddress?: Address;\n spenderAddress?: Address;\n}): readonly unknown[] {\n return [\n 'tokenAllowance',\n chainId,\n tokenAddress?.toLowerCase(),\n ownerAddress?.toLowerCase(),\n spenderAddress?.toLowerCase(),\n ];\n}\n\nexport function constructTokenAllowanceQueryKeyForInvalidation({\n chainId,\n tokenAddress,\n ownerAddress,\n spenderAddress,\n}: {\n chainId: number;\n tokenAddress: Address;\n ownerAddress: Address;\n spenderAddress: Address;\n}): readonly unknown[] {\n return constructTokenAllowanceQueryKey({\n chainId,\n tokenAddress,\n ownerAddress,\n spenderAddress,\n });\n}\n\ntype UseTokenAllowanceInput = {\n /** ERC20 token contract address */\n tokenAddress?: Address;\n /** Allowance owner */\n ownerAddress?: Address;\n /** Allowance spender */\n spenderAddress?: Address;\n};\n\nexport type UseTokenAllowanceOptions<TSelectedData = bigint> = Omit<\n UseQueryOptions<bigint, Error, TSelectedData>,\n 'queryKey' | 'queryFn'\n>;\n\nexport function createTokenAllowanceQueryOptions<TSelectedData = bigint>(params: {\n publicClient: ReturnType<typeof useCofhePublicClient>;\n tokenAddress?: Address;\n ownerAddress?: Address;\n spenderAddress?: Address;\n queryOptions?: UseTokenAllowanceOptions<TSelectedData>;\n}): UseQueryOptions<bigint, Error, TSelectedData> {\n const { publicClient, tokenAddress, ownerAddress, spenderAddress, queryOptions } = params;\n const { enabled: userEnabled, ...restQueryOptions } = queryOptions ?? {};\n const baseEnabled = !!publicClient && !!tokenAddress && !!ownerAddress && !!spenderAddress;\n const enabled = baseEnabled && (userEnabled ?? true);\n\n const queryKey = constructTokenAllowanceQueryKey({\n chainId: publicClient?.chain?.id,\n tokenAddress,\n ownerAddress,\n spenderAddress,\n });\n\n return {\n queryKey,\n queryFn: async () => {\n assert(publicClient, 'PublicClient is required to fetch token allowance');\n assert(tokenAddress, 'Token address is required to fetch token allowance');\n assert(ownerAddress, 'Owner address is required to fetch token allowance');\n assert(spenderAddress, 'Spender address is required to fetch token allowance');\n const allowanceContract = getShieldAllowanceContractConfig();\n\n const allowance = await publicClient.readContract({\n address: tokenAddress,\n abi: allowanceContract.abi,\n functionName: allowanceContract.functionName,\n args: [ownerAddress, spenderAddress],\n });\n assert(typeof allowance === 'bigint', 'Token allowance must resolve to bigint');\n return allowance;\n },\n enabled,\n refetchOnMount: false,\n ...restQueryOptions,\n };\n}\n\nexport type UseTokenAllowanceResult = {\n data?: bigint;\n isFetching: boolean;\n refetch: () => Promise<unknown>;\n};\n\nexport function useTokenAllowance(\n { tokenAddress, ownerAddress, spenderAddress }: UseTokenAllowanceInput,\n options?: UseTokenAllowanceOptions\n): UseTokenAllowanceResult {\n const publicClient = useCofhePublicClient();\n\n const queryOptions = createTokenAllowanceQueryOptions({\n publicClient,\n tokenAddress,\n ownerAddress,\n spenderAddress,\n queryOptions: options,\n });\n\n const { data, isFetching, refetch } = useInternalQuery(queryOptions);\n\n return {\n data,\n isFetching,\n refetch,\n };\n}\n","import type { Address } from 'viem';\nimport type { Token } from './useCofheTokenLists.js';\nimport { TransactionActionType, useTransactionStore } from '../stores/transactionStore.js';\nimport { useTransactionGlobalLifecycle } from './useTransactionGlobalLifecycle.js';\nimport { hasExtras, useCofheWriteContract, type useCofheWriteContractOptions } from './useCofheWriteContract.js';\n\nexport type TokenApproveExtras = {\n token: Token;\n tokenAmount: bigint;\n account: Address;\n};\n\nexport type UseCofheTokenApproveOptions = Pick<\n useCofheWriteContractOptions<TokenApproveExtras>,\n 'onSuccess' | 'onError' | 'onMutate'\n>;\n\n/**\n * Low-level approval writer.\n *\n * Wraps `useCofheWriteContract` with:\n * - Global tx submit error reporting\n * - Persisting approval txs in the transaction store (when `extras` are provided)\n */\nexport function useCofheTokenApprove(writeMutationOptions?: UseCofheTokenApproveOptions) {\n const { onSuccess: passedOnSuccess, onError: passedOnError, ...restOfOptions } = writeMutationOptions || {};\n const { onTransactionSubmitError } = useTransactionGlobalLifecycle();\n\n return useCofheWriteContract<TokenApproveExtras>({\n ...restOfOptions,\n onError: (error, variables, onMutateResult, context) => {\n if (passedOnError) passedOnError(error, variables, onMutateResult, context);\n onTransactionSubmitError(error, TransactionActionType.Approve);\n },\n onSuccess: (hash, variables, onMutateResult, context) => {\n if (passedOnSuccess) passedOnSuccess(hash, variables, onMutateResult, context);\n\n if (!hasExtras(variables)) return;\n const { token, tokenAmount, account } = variables.extras;\n\n useTransactionStore.getState().addTransaction({\n hash,\n token,\n tokenAmount,\n chainId: token.chainId,\n actionType: TransactionActionType.Approve,\n isPendingDecryption: false,\n account,\n });\n },\n });\n}\n","import { useState, useCallback, useMemo } from 'react';\n\nexport type DurationUnit = 'hours' | 'days' | 'weeks' | 'months';\n\nexport interface UsePermitDurationOptions {\n onDurationChange: (seconds: number) => void;\n initialSeconds?: number;\n}\n\nexport interface DurationPreset {\n label: string;\n seconds: number;\n}\n\nexport interface UsePermitDurationResult {\n durationSeconds: number;\n customCount: number | '';\n customUnit: DurationUnit;\n presets: readonly DurationPreset[];\n units: readonly DurationUnit[];\n selectPreset: (seconds: number) => void;\n setCustomCount: (value: number | '') => void;\n setCustomUnit: (unit: DurationUnit) => void;\n applyCustom: (count: number | '', unit: DurationUnit) => void;\n unitSeconds: Readonly<Record<DurationUnit, number>>;\n}\n\nexport function usePermitDuration(options: UsePermitDurationOptions): UsePermitDurationResult {\n const { onDurationChange, initialSeconds = 7 * 24 * 60 * 60 } = options;\n\n const presets: readonly DurationPreset[] = useMemo(\n () => [\n { label: '1 day', seconds: 1 * 24 * 60 * 60 },\n { label: '1 week', seconds: 7 * 24 * 60 * 60 },\n { label: '1 month', seconds: 30 * 24 * 60 * 60 },\n ],\n []\n );\n\n const unitSeconds: Readonly<Record<DurationUnit, number>> = useMemo(\n () => ({\n hours: 60 * 60,\n days: 24 * 60 * 60,\n weeks: 7 * 24 * 60 * 60,\n months: 30 * 24 * 60 * 60,\n }),\n []\n );\n\n const [durationSeconds, setDurationSecondsState] = useState(initialSeconds);\n const [customCount, setCustomCountState] = useState<number | ''>('');\n const [customUnit, setCustomUnitState] = useState<DurationUnit>('days');\n\n const selectPreset = useCallback(\n (seconds: number) => {\n setDurationSecondsState(seconds);\n onDurationChange(seconds);\n },\n [onDurationChange]\n );\n\n const applyCustom = useCallback(\n (count: number | '', unit: DurationUnit) => {\n setCustomCountState(count);\n setCustomUnitState(unit);\n if (typeof count === 'number' && count > 0) {\n const computed = count * unitSeconds[unit];\n setDurationSecondsState(computed);\n onDurationChange(computed);\n }\n },\n [unitSeconds, onDurationChange]\n );\n\n const setCustomCount = useCallback((value: number | '') => applyCustom(value, customUnit), [applyCustom, customUnit]);\n const setCustomUnit = useCallback((unit: DurationUnit) => applyCustom(customCount, unit), [applyCustom, customCount]);\n\n return {\n durationSeconds,\n customCount,\n customUnit,\n presets,\n units: ['days', 'weeks', 'months', 'hours'] as const,\n selectPreset,\n setCustomCount,\n setCustomUnit,\n applyCustom,\n unitSeconds,\n };\n}\n","import { useCallback, useState } from 'react';\nimport { useCofheCreatePermitMutation, type CreatePermitArgs } from './useCofheCreatePermitMutation';\n\nexport interface UsePermitFormOptions {\n isDelegate?: boolean;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n}\n\nexport interface UsePermitFormResult {\n permitName: string;\n receiver: string;\n error: string | null; // global/submit error\n nameError: string | null; // field-specific error for name\n receiverError: string | null;\n isValid: boolean;\n isSubmitting: boolean;\n durationSeconds: number;\n handleNameChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n handleReceiverChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n setDurationSeconds: (seconds: number) => void;\n handleSubmit: () => Promise<void>;\n reset: () => void;\n}\n\nexport function usePermitForm(options: UsePermitFormOptions = {}): UsePermitFormResult {\n const { onSuccess, onError, isDelegate = false } = options;\n const [permitName, setPermitName] = useState('');\n const [receiver, setReceiver] = useState('');\n const [error, setError] = useState<string | null>(null);\n const [nameError, setNameError] = useState<string | null>(null);\n const [receiverError, setReceiverError] = useState<string | null>(null);\n const [durationSeconds, setDurationSeconds] = useState(7 * 24 * 60 * 60);\n const { mutateAsync: createPermitMutateAsync, isPending: isPermitCreationPending } = useCofheCreatePermitMutation({\n onSuccess,\n onError,\n });\n\n const recipientAddressValid = isDelegate ? isValidAddress(receiver) : true;\n const isValid = !!permitName.trim() && recipientAddressValid;\n\n const handleNameChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setPermitName(e.target.value);\n if (nameError) setNameError(null);\n },\n [nameError]\n );\n\n const handleReceiverChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setReceiver(e.target.value);\n if (receiverError) setReceiverError(null);\n },\n [receiverError]\n );\n\n const handleSubmit = useCallback(async () => {\n if (isPermitCreationPending) return;\n const nameToUse = permitName.trim();\n if (!nameToUse) {\n setNameError('Permit name is required.');\n return;\n }\n if (isDelegate) {\n if (!isValidAddress(receiver)) {\n setReceiverError('Valid receiver address is required.');\n return;\n }\n }\n try {\n const expirationSeconds = Math.floor(Date.now() / 1000) + durationSeconds;\n const args: CreatePermitArgs = isDelegate\n ? { name: nameToUse, isSelf: false, receiver: receiver.trim() as `0x${string}`, expirationSeconds }\n : { name: nameToUse, isSelf: true, expirationSeconds };\n\n await createPermitMutateAsync(args);\n setPermitName('');\n setReceiver('');\n setError(null);\n setNameError(null);\n setReceiverError(null);\n } catch (e: any) {\n setError(e?.message ?? 'Failed to create permit');\n }\n }, [isPermitCreationPending, permitName, isDelegate, receiver, durationSeconds, createPermitMutateAsync]);\n\n const reset = useCallback(() => {\n setPermitName('');\n setReceiver('');\n setError(null);\n setNameError(null);\n setReceiverError(null);\n }, []);\n\n return {\n permitName,\n receiver,\n error,\n nameError,\n receiverError,\n isValid,\n isSubmitting: isPermitCreationPending,\n durationSeconds,\n handleNameChange,\n handleReceiverChange,\n setDurationSeconds,\n handleSubmit,\n reset,\n };\n}\n\nfunction isValidAddress(address: string): boolean {\n const a = address.trim();\n return /^0x[a-fA-F0-9]{40}$/.test(a);\n}\n","// Persisted store for long running flags / settings / etc\n\nimport { create } from 'zustand';\nimport { createJSONStorage, persist } from 'zustand/middleware';\n\ntype PortalPersistedStore = {\n hasCreatedFirstPermit: boolean;\n};\n\ntype PortalPersistedActions = {\n setHasCreatedFirstPermit: (hasCreated: boolean) => void;\n};\n\nexport const usePortalPersisted = create<PortalPersistedStore & PortalPersistedActions>()(\n persist(\n (set, get) => ({\n hasCreatedFirstPermit: false,\n\n setHasCreatedFirstPermit: (hasCreated) => set({ hasCreatedFirstPermit: hasCreated }),\n }),\n {\n name: 'cofhesdk-react-persisted',\n storage: createJSONStorage(() => localStorage),\n }\n )\n);\n","import { usePortalPersisted } from '@/stores/portalPersisted.js';\nimport { useInternalMutation } from '../../providers/index.js';\nimport { useCofheClient } from '../useCofheClient.js';\n\nexport type CreatePermitArgs =\n | {\n name: string;\n isSelf: true;\n expirationSeconds: number; // unix timestamp (seconds)\n }\n | {\n name: string;\n isSelf: false;\n receiver: `0x${string}`;\n expirationSeconds: number; // unix timestamp (seconds)\n };\n\ntype Input = {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n};\n\nexport const useCofheCreatePermitMutation = ({ onSuccess, onError }: Input = {}) => {\n const cofheClient = useCofheClient();\n const { setHasCreatedFirstPermit } = usePortalPersisted();\n\n return useInternalMutation<void, Error, CreatePermitArgs>({\n onSuccess,\n onError,\n onSettled: () => {\n // Mark that the user has created at least one permit\n // After this, we will show him warnings and notifications accordingly\n setHasCreatedFirstPermit(true);\n },\n mutationFn: async (args) => {\n const { name, isSelf, expirationSeconds } = args;\n const { account } = cofheClient.getSnapshot();\n if (!account) throw new Error('No connected account found');\n\n if (isSelf) {\n await cofheClient.permits.createSelf({\n expiration: expirationSeconds,\n issuer: account,\n name: name.trim(),\n });\n return;\n }\n\n await cofheClient.permits.createSharing({\n expiration: expirationSeconds,\n issuer: account,\n recipient: args.receiver,\n name: name.trim(),\n });\n },\n });\n};\n","import { useCallback, useMemo } from 'react';\nimport { type Permit } from '@cofhe/sdk/permits';\nimport { useCofheActivePermit, useCofheAllPermits } from '../useCofhePermits';\nimport { FloatingButtonPage } from '@/components/CofheFloatingButton/pagesConfig/types';\nimport { useCofheNavigateToCreatePermit } from './useCofheNavigateToCreatePermit';\nimport { usePortalModals, usePortalNavigation } from '@/stores';\nimport { PortalModal } from '@/components/CofheFloatingButton/modals/types';\n\nexport type PermitStatus = 'active' | 'valid' | 'expired';\nexport type PermitActionId = 'generate' | 'delegate' | 'import';\n\nexport const usePermitsList = () => {\n const allPermits = useCofheAllPermits();\n const activePermit = useCofheActivePermit();\n const { navigateTo } = usePortalNavigation();\n const { openModal } = usePortalModals();\n\n const activePermitHash = useMemo(() => {\n return activePermit?.permit.hash;\n }, [activePermit?.permit.hash]);\n\n const selfPermits = useMemo<Permit[]>(() => {\n return allPermits.filter((permit) => permit.type === 'self');\n }, [allPermits]);\n\n const delegatedPermits = useMemo<Permit[]>(() => {\n return allPermits.filter((permit) => permit.type === 'sharing');\n }, [allPermits]);\n\n const importedPermits = useMemo<Permit[]>(() => {\n return allPermits.filter((permit) => permit.type === 'recipient');\n }, [allPermits]);\n\n const navigateToGeneratePermit = useCofheNavigateToCreatePermit();\n\n const handlePermitAction = useCallback(\n (actionId: PermitActionId) => {\n if (actionId === 'generate') {\n navigateToGeneratePermit();\n return;\n }\n if (actionId === 'delegate') {\n navigateTo(FloatingButtonPage.DelegatePermits, {});\n return;\n }\n if (actionId === 'import') {\n navigateTo(FloatingButtonPage.ReceivePermits);\n }\n },\n [navigateTo, navigateToGeneratePermit]\n );\n\n const handleOpenPermit = useCallback(\n (hash: string) => {\n openModal(PortalModal.PermitDetails, { hash });\n },\n [openModal]\n );\n\n return {\n activePermitHash,\n selfPermits,\n delegatedPermits,\n importedPermits,\n handlePermitAction,\n handleOpenPermit,\n };\n};\n","import { useState, useCallback } from 'react';\nimport { useCofheContext } from '../../providers/CofheProvider.js';\nimport { PermitUtils, type RecipientPermit } from '@cofhe/sdk/permits';\nimport { cofheLogger } from '@/utils/debug.js';\n\nexport type UseReceivePermitReturn = {\n importedPermit: RecipientPermit | null;\n permitData: string;\n setPermitData: (v: string) => void;\n permitName: string;\n setPermitName: (v: string) => void;\n isSubmitting: boolean;\n errorMsg: string | null;\n successMsg: string | null;\n submit: () => Promise<void>;\n};\n\ntype Input = {\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n};\n\nexport function useReceivePermit({ onSuccess, onError }: Input = {}): UseReceivePermitReturn {\n const { client } = useCofheContext();\n\n const [importedPermit, setImportedPermit] = useState<RecipientPermit | null>(null);\n const [permitData, setPermitData] = useState('');\n const [permitName, setPermitName] = useState('');\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [errorMsg, setErrorMsg] = useState<string | null>(null);\n const [successMsg, setSuccessMsg] = useState<string | null>(null);\n\n const submit = useCallback(async () => {\n setErrorMsg(null);\n setSuccessMsg(null);\n if (!permitData.trim()) {\n setErrorMsg('Please paste permit data.');\n return;\n }\n\n try {\n setIsSubmitting(true);\n // If user provided a name, override the incoming permit's name\n let importArg: any | string = permitData.trim();\n if (permitName.trim()) {\n try {\n const parsed = JSON.parse(permitData.trim());\n importArg = { ...parsed, name: permitName.trim() };\n } catch (e) {\n setErrorMsg('Invalid permit data. Expected JSON.');\n setIsSubmitting(false);\n return;\n }\n }\n\n await client.permits.importShared(importArg);\n\n setSuccessMsg('Permit received and set active.');\n onSuccess?.();\n } catch (err: any) {\n const message = err?.message ?? 'Failed to import permit';\n setErrorMsg(message);\n onError?.(new Error(message));\n } finally {\n setIsSubmitting(false);\n }\n }, [client, permitData, permitName, onSuccess, onError]);\n\n const handleSetPermitData = useCallback((v: string) => {\n setPermitData(v);\n try {\n const permit = PermitUtils.importShared(v);\n setImportedPermit(permit);\n setErrorMsg(null);\n } catch (e) {\n cofheLogger.error('Error parsing pasted permit data', e);\n setImportedPermit(null);\n // TODO: Improve error message, we have the error message in the caught error but its a zod error so its messy\n setErrorMsg(`Invalid permit data. Expected JSON.`);\n }\n }, []);\n\n return {\n importedPermit,\n permitData,\n setPermitData: handleSetPermitData,\n permitName,\n setPermitName,\n isSubmitting,\n errorMsg,\n successMsg,\n submit,\n };\n}\n","import { useCallback, useMemo } from 'react';\nimport { zeroAddress } from 'viem';\nimport { PermitUtils } from '@cofhe/sdk/permits';\nimport {\n useCofheActivePermit,\n useCofhePermit,\n useCofheRemovePermit,\n useCofheSelectPermit,\n} from '../useCofhePermits.js';\nimport { useCopyFeedback } from '../useCopyFeedback.js';\nimport { formatExpirationLabel, truncateAddress } from '@/utils/utils.js';\nimport { usePortalNavigation, usePortalToasts } from '@/stores';\n\nconst COPY_KEY = 'permit-details-json';\n\nexport const usePermitDetailsAndActions = (permitHash: string) => {\n const permit = useCofhePermit(permitHash);\n const activePermit = useCofheActivePermit();\n const { navigateBack } = usePortalNavigation();\n const { isCopied, copyWithFeedback } = useCopyFeedback();\n const { addToast } = usePortalToasts();\n const selectActivePermit = useCofheSelectPermit({\n onSuccess: () => {\n addToast({\n variant: 'success',\n title: 'Permit selected',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to select permit',\n description: error instanceof Error ? error.message : 'Unknown error',\n });\n },\n });\n const removePermit = useCofheRemovePermit({\n onSuccess: () => {\n addToast({\n variant: 'success',\n title: 'Permit deleted',\n });\n },\n onError: (error) => {\n addToast({\n variant: 'error',\n title: 'Failed to delete permit',\n description: error instanceof Error ? error.message : 'Unknown error',\n });\n },\n });\n\n const isActivePermit = permit != null && activePermit?.permit.hash === permitHash;\n const expirationDate = permit != null ? new Date(permit.expiration * 1000).toLocaleString() : undefined;\n const isShareablePermit = permit?.type === 'sharing';\n\n const permitLabel = useMemo(() => {\n if (!permit) return undefined;\n if (permit.name?.trim()) return permit.name;\n const fallbackAddress =\n permit.recipient && permit.recipient !== zeroAddress ? permit.recipient : permit.issuer || zeroAddress;\n return truncateAddress(fallbackAddress, 4, 4) ?? fallbackAddress;\n }, [permit]);\n\n const expirationInfo = useMemo(() => formatExpirationLabel(permit?.expiration), [permit?.expiration]);\n\n const permitJson = useMemo(() => {\n if (!permit) return undefined;\n return PermitUtils.export(permit);\n }, [permit]);\n\n const handleBack = useCallback(() => {\n navigateBack();\n }, [navigateBack]);\n\n const handleCopySharablePermitData = useCallback(() => {\n if (!permitJson) return;\n copyWithFeedback(COPY_KEY, permitJson);\n addToast({\n variant: 'success',\n title: 'Permit data copied',\n description: 'Share copied data with recipient.',\n });\n }, [copyWithFeedback, permitJson, addToast]);\n\n const handleSelectActivePermit = useCallback(() => {\n selectActivePermit(permitHash);\n }, [selectActivePermit, permitHash]);\n\n const handleRemovePermit = useCallback(() => {\n removePermit(permitHash);\n }, [removePermit, permitHash]);\n\n return {\n permitExists: permit != null,\n permit,\n permitLabel,\n permitJson,\n expirationInfo,\n expirationDate,\n handleBack,\n handleCopySharablePermitData,\n handleSelectActivePermit,\n handleRemovePermit,\n isCopyComplete: isCopied(COPY_KEY),\n isActivePermit,\n isShareablePermit,\n };\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\n/**\n * useCopyFeedback\n * - Copies provided text to clipboard and exposes transient \"copied\" state per key.\n * - Useful for lists where each row has a copy action and needs quick feedback.\n */\nexport function useCopyFeedback(defaultDurationMs: number = 2000) {\n const [copiedKeys, setCopiedKeys] = useState<Set<string>>(new Set());\n const timersRef = useRef<Map<string, number>>(new Map());\n\n const isCopied = useCallback((key: string) => copiedKeys.has(key), [copiedKeys]);\n\n const clearTimer = useCallback((key: string) => {\n const timers = timersRef.current;\n const existing = timers.get(key);\n if (existing) {\n window.clearTimeout(existing);\n timers.delete(key);\n }\n }, []);\n\n const copyWithFeedback = useCallback(\n async (key: string, text: string, durationMs?: number): Promise<boolean> => {\n try {\n await navigator.clipboard.writeText(text);\n\n setCopiedKeys((prev) => {\n const next = new Set(prev);\n next.add(key);\n return next;\n });\n\n clearTimer(key);\n const timeout = window.setTimeout(() => {\n setCopiedKeys((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n timersRef.current.delete(key);\n }, durationMs ?? defaultDurationMs);\n timersRef.current.set(key, timeout);\n return true;\n } catch {\n return false;\n }\n },\n [clearTimer, defaultDurationMs]\n );\n\n // Cleanup timers on unmount\n useEffect(() => {\n return () => {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n for (const id of timersRef.current.values()) {\n window.clearTimeout(id);\n }\n timersRef.current.clear();\n };\n }, []);\n\n return { copiedKeys, isCopied, copyWithFeedback };\n}\n","import { useEffect, useRef } from 'react';\n\n/**\n * A reusable hook to schedule a timeout that can be rescheduled and safely cleaned up.\n * Useful for auto-clearing messages, debounced effects, or any delayed callback.\n */\nexport function useReschedulableTimeout(callback: () => void, defaultTimeout: number) {\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n const schedule = (timeout?: number) => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = setTimeout(() => {\n callback();\n }, timeout ?? defaultTimeout);\n };\n\n const cancel = () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n\n return { schedule, cancel };\n}\n"]}