tradeblocks-mcp 4.2.0 → 4.3.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.
Files changed (47) hide show
  1. package/README.md +40 -1
  2. package/dist/{chunk-YRD62LDE.js → chunk-35RVWZGT.js} +4 -1
  3. package/dist/{chunk-4UU7IT2A.js.map → chunk-35RVWZGT.js.map} +1 -1
  4. package/dist/{chunk-4UU7IT2A.js → chunk-ENXBPJ7Y.js} +148 -6
  5. package/dist/chunk-ENXBPJ7Y.js.map +1 -0
  6. package/dist/{chunk-62GCLMQA.js → chunk-TLX7IBCM.js} +3 -6
  7. package/dist/chunk-TLX7IBCM.js.map +1 -0
  8. package/dist/{daily-logs-store-PXB53WEK.js → daily-logs-store-FZRIGYUX.js} +2 -2
  9. package/dist/{daily-logs-store-65YHFJ5F.js → daily-logs-store-MEZ5S3BR.js} +2 -2
  10. package/dist/market/provenance/index.js +1 -4
  11. package/dist/market/provenance/index.js.map +1 -1
  12. package/dist/{sync-JL7OPLCT.js → sync-EW33QZPD.js} +3 -3
  13. package/dist/test-exports.js +320 -279
  14. package/dist/test-exports.js.map +1 -1
  15. package/dist/{trades-store-UGZ62A7N.js → trades-store-3TOLBL2W.js} +2 -2
  16. package/dist/{trades-store-MOFJHRC2.js → trades-store-PNLPRYRJ.js} +2 -2
  17. package/package.json +1 -1
  18. package/server/{chunk-7N6HBOAY.js → chunk-PDSUY2X2.js} +148 -6
  19. package/server/chunk-PDSUY2X2.js.map +1 -0
  20. package/server/{chunk-J4GWE6JR.js → chunk-YIWLVX7Z.js} +3 -6
  21. package/server/chunk-YIWLVX7Z.js.map +1 -0
  22. package/server/{daily-logs-store-YAXASQN4.js → daily-logs-store-LRVO7COL.js} +2 -2
  23. package/server/index.js +993 -801
  24. package/server/index.js.map +1 -1
  25. package/server/{sync-ZV3QEGMO.js → sync-2POG6KA6.js} +3 -3
  26. package/server/{trades-store-MF7YYLCH.js → trades-store-MXUZLSF5.js} +2 -2
  27. package/src/db/dataset-schemas.ts +97 -23
  28. package/src/tools/market-data.ts +327 -245
  29. package/src/tools/profile-analysis.ts +18 -4
  30. package/src/tools/reports/fields.ts +16 -11
  31. package/src/tools/reports/helpers.ts +6 -2
  32. package/src/tools/reports/predictive.ts +15 -4
  33. package/src/tools/shared/field-analysis.ts +57 -14
  34. package/src/tools/shared/filter-objective.ts +73 -0
  35. package/src/utils/trade-analysis-fields.ts +19 -4
  36. package/dist/chunk-62GCLMQA.js.map +0 -1
  37. package/dist/chunk-YRD62LDE.js.map +0 -1
  38. package/server/chunk-7N6HBOAY.js.map +0 -1
  39. package/server/chunk-J4GWE6JR.js.map +0 -1
  40. /package/dist/{daily-logs-store-65YHFJ5F.js.map → daily-logs-store-FZRIGYUX.js.map} +0 -0
  41. /package/dist/{daily-logs-store-PXB53WEK.js.map → daily-logs-store-MEZ5S3BR.js.map} +0 -0
  42. /package/dist/{sync-JL7OPLCT.js.map → sync-EW33QZPD.js.map} +0 -0
  43. /package/dist/{trades-store-MOFJHRC2.js.map → trades-store-3TOLBL2W.js.map} +0 -0
  44. /package/dist/{trades-store-UGZ62A7N.js.map → trades-store-PNLPRYRJ.js.map} +0 -0
  45. /package/server/{daily-logs-store-YAXASQN4.js.map → daily-logs-store-LRVO7COL.js.map} +0 -0
  46. /package/server/{sync-ZV3QEGMO.js.map → sync-2POG6KA6.js.map} +0 -0
  47. /package/server/{trades-store-MF7YYLCH.js.map → trades-store-MXUZLSF5.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../lib/calculations/trade-matching.ts","../../lib/db/calendar-days.ts","../../lib/utils/id.ts","../../lib/db/blocks-store.ts","../../lib/models/reporting-trade.ts","../../lib/utils/equity-curve.ts","../../lib/utils/combine-leg-groups.ts","../../lib/db/combined-trades-cache.ts","../../lib/data/treasury-rates.ts","../../lib/data/sofr-rates.ts","../../lib/utils/published-rates.ts","../../lib/utils/risk-free-rate.ts","../../lib/db/performance-snapshot-cache.ts","../../lib/db/trades-store.ts","../../lib/utils/trade-frequency.ts","../../lib/calculations/static-dataset-matcher.ts","../../lib/db/index.ts","../../lib/db/daily-logs-store.ts"],"sourcesContent":["/**\n * Trade Matching & Scaling Utilities\n *\n * Pure business logic for matching backtest trades to actual (reporting log)\n * trades and computing scaled P/L comparisons. Used by live alignment engine,\n * slippage analysis, and discrepancy analysis.\n */\n\nimport type { Trade } from \"../models/trade.ts\";\nimport type { ReportingTrade } from \"../models/reporting-trade.ts\";\nimport { matchTradeSets } from \"./trade-set-alignment.ts\";\n\n/**\n * Helper to format date key for trade matching\n */\nexport function formatDateKey(d: Date): string {\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Helper to truncate time to minute precision for matching\n */\nexport function truncateTimeToMinute(time: string | undefined): string {\n if (!time) return \"00:00\";\n const match = time.trim().match(/^(\\d{1,2}):(\\d{2})(?::\\d{2}(?:\\.\\d+)?)?\\s*([AP]M)?$/i);\n if (!match) return \"00:00\";\n\n let hour = Number(match[1]);\n const period = match[3]?.toUpperCase();\n if (period) {\n if (hour < 1 || hour > 12) return \"00:00\";\n hour = (hour % 12) + (period === \"PM\" ? 12 : 0);\n } else if (hour > 23) {\n return \"00:00\";\n }\n\n return `${String(hour).padStart(2, \"0\")}:${match[2]}`;\n}\n\n/**\n * Helper to parse hour from time string\n */\nexport function parseHourFromTime(timeOpened: string | undefined): number | null {\n if (!timeOpened || typeof timeOpened !== \"string\") return null;\n const parts = timeOpened.split(\":\");\n if (parts.length < 1) return null;\n const hour = parseInt(parts[0], 10);\n if (isNaN(hour) || hour < 0 || hour > 23) return null;\n return hour;\n}\n\n/**\n * Helper to get ISO week key (YYYY-Www format)\n */\nexport function getIsoWeekKey(dateStr: string): string {\n const [yearStr, monthStr, dayStr] = dateStr.split(\"-\");\n const year = Number(yearStr);\n const month = Number(monthStr) - 1;\n const day = Number(dayStr);\n const date = new Date(Date.UTC(year, month, day));\n const thursday = new Date(date.getTime());\n const dayOfWeek = thursday.getUTCDay() || 7;\n thursday.setUTCDate(thursday.getUTCDate() + (4 - dayOfWeek));\n const yearStart = new Date(Date.UTC(thursday.getUTCFullYear(), 0, 1));\n const weekNum = Math.ceil(((thursday.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n return `${thursday.getUTCFullYear()}-W${String(weekNum).padStart(2, \"0\")}`;\n}\n\n/**\n * Helper to get month key (YYYY-MM format)\n */\nexport function getMonthKey(dateStr: string): string {\n return dateStr.substring(0, 7);\n}\n\n/**\n * Matched trade data for slippage analysis\n */\nexport interface MatchedTradeData {\n date: string;\n strategy: string;\n timeOpened: string;\n totalSlippage: number;\n openingVix?: number;\n closingVix?: number;\n gap?: number;\n movement?: number;\n hourOfDay: number | null;\n contracts: number;\n}\n\n/**\n * Apply date range filter to trades\n */\nexport function applyDateRangeFilter<T extends { dateOpened: Date }>(\n trades: T[],\n dateRange?: { from?: string; to?: string },\n): T[] {\n if (!dateRange || (!dateRange.from && !dateRange.to)) {\n return trades;\n }\n\n return trades.filter((t) => {\n const tradeDate = formatDateKey(new Date(t.dateOpened));\n if (dateRange.from && tradeDate < dateRange.from) return false;\n if (dateRange.to && tradeDate > dateRange.to) return false;\n return true;\n });\n}\n\n/**\n * Apply strategy filter to trades\n */\nexport function applyStrategyFilter<T extends { strategy: string }>(\n trades: T[],\n strategy?: string,\n): T[] {\n if (!strategy) return trades;\n return trades.filter((t) => t.strategy.toLowerCase() === strategy.toLowerCase());\n}\n\n/**\n * Calculate scaled P/L values for slippage comparison\n */\nexport function calculateScaledPl(\n btPl: number,\n actualPl: number,\n btContracts: number,\n actualContracts: number,\n scaling: \"raw\" | \"perContract\" | \"toReported\",\n): { scaledBtPl: number; scaledActualPl: number } {\n let scaledBtPl = btPl;\n let scaledActualPl = actualPl;\n\n if (scaling === \"perContract\") {\n scaledBtPl = btContracts > 0 ? btPl / btContracts : 0;\n scaledActualPl = actualContracts > 0 ? actualPl / actualContracts : 0;\n } else if (scaling === \"toReported\") {\n if (btContracts > 0 && actualContracts > 0) {\n const scalingFactor = actualContracts / btContracts;\n scaledBtPl = btPl * scalingFactor;\n } else if (btContracts === 0) {\n scaledBtPl = 0;\n }\n }\n\n return { scaledBtPl, scaledActualPl };\n}\n\n/**\n * Match backtest trades to actual trades and calculate slippage\n */\nexport function matchTrades(\n backtestTrades: Trade[],\n actualTrades: ReportingTrade[],\n scaling: \"raw\" | \"perContract\" | \"toReported\",\n): {\n matchedTrades: MatchedTradeData[];\n unmatchedBacktestCount: number;\n unmatchedActualCount: number;\n} {\n const {\n matched,\n unmatchedBacktestIndices,\n unmatchedActualIndices,\n unusableBacktest,\n unusableActual,\n } = matchTradeSets(backtestTrades, actualTrades);\n\n const matchedTrades: MatchedTradeData[] = matched.map(({ backtestIndex, actualIndex }) => {\n const btTrade = backtestTrades[backtestIndex];\n const actualTrade = actualTrades[actualIndex];\n const { scaledBtPl, scaledActualPl } = calculateScaledPl(\n btTrade.pl,\n actualTrade.pl,\n btTrade.numContracts,\n actualTrade.numContracts,\n scaling,\n );\n\n return {\n date: formatDateKey(new Date(btTrade.dateOpened)),\n strategy: btTrade.strategy,\n timeOpened: truncateTimeToMinute(btTrade.timeOpened),\n // Total slippage = actual P/L - backtest P/L (after scaling)\n totalSlippage: scaledActualPl - scaledBtPl,\n openingVix: btTrade.openingVix,\n closingVix: btTrade.closingVix,\n gap: btTrade.gap,\n movement: btTrade.movement,\n hourOfDay: parseHourFromTime(btTrade.timeOpened),\n contracts: actualTrade.numContracts,\n };\n });\n\n // Malformed rows never match; count them with the unmatched totals so the\n // matched + unmatched accounting still spans every input row.\n const unmatchedBacktestCount = unmatchedBacktestIndices.length + unusableBacktest.length;\n const unmatchedActualCount = unmatchedActualIndices.length + unusableActual.length;\n\n return { matchedTrades, unmatchedBacktestCount, unmatchedActualCount };\n}\n\n/**\n * Get correlation interpretation string\n */\nexport function getCorrelationInterpretation(coeff: number): string {\n const abs = Math.abs(coeff);\n const direction = coeff >= 0 ? \"positive\" : \"negative\";\n if (abs >= 0.7) return `strong ${direction}`;\n if (abs >= 0.4) return `moderate ${direction}`;\n return `weak ${direction}`;\n}\n\n/**\n * Get confidence level based on sample size\n */\nexport function getConfidenceLevel(n: number): \"low\" | \"moderate\" | \"high\" {\n if (n < 10) return \"low\";\n if (n < 30) return \"moderate\";\n return \"high\";\n}\n","/**\n * Calendar days in IndexedDB.\n *\n * Trade, daily-log and reporting-log dates are calendar days held in memory as local-midnight\n * `Date` values. A `Date` is an instant, so storing one ties the day to the importing browser's\n * timezone. IndexedDB therefore holds these fields as `YYYY-MM-DD` strings: they are encoded from\n * the value's local calendar parts on write and decoded to local midnight in the current zone on\n * read.\n */\n\nimport { formatDateKey } from \"../calculations/trade-matching.ts\";\n\nconst DAY_MS = 86_400_000;\nconst HOUR_MS = 3_600_000;\nconst QUARTER_HOUR_MS = 900_000;\n\n/** A record as IndexedDB holds it: the named calendar-day fields are `YYYY-MM-DD` strings. */\nexport type StoredCalendarDays<T, K extends keyof T> = Omit<T, K> & {\n [P in K]: undefined extends T[P] ? string | undefined : string;\n};\n\n/** Calendar-day fields of `Trade`, `ReportingTrade` and the trade rows derived from them. */\nexport const TRADE_DAY_FIELDS = [\"dateOpened\", \"dateClosed\"] as const;\nexport type TradeDayField = (typeof TRADE_DAY_FIELDS)[number];\n/** Calendar-day field of `DailyLogEntry` and of MFE/MAE chart points. */\nexport const DATED_ROW_DAY_FIELDS = [\"date\"] as const;\n\nexport function encodeCalendarDay(date: Date): string {\n return formatDateKey(date);\n}\n\nfunction decodeCalendarDay(day: string): Date {\n const [year, month, date] = day.split(\"-\").map(Number);\n return new Date(year, month - 1, date);\n}\n\n/** Realm-safe: a structured clone can hand back a `Date` from another global. */\nexport function isDate(value: unknown): value is Date {\n return Object.prototype.toString.call(value) === \"[object Date]\";\n}\n\nexport function encodeCalendarDays<T extends object, K extends keyof T>(\n record: T,\n fields: readonly K[],\n): StoredCalendarDays<T, K> {\n const stored = { ...record } as Record<PropertyKey, unknown>;\n for (const field of fields) {\n const value = stored[field];\n if (isDate(value)) stored[field] = encodeCalendarDay(value);\n }\n return stored as StoredCalendarDays<T, K>;\n}\n\nexport function decodeCalendarDays<T extends object, K extends keyof T>(\n stored: StoredCalendarDays<T, K>,\n fields: readonly K[],\n): T {\n const record: Record<PropertyKey, unknown> = { ...stored };\n for (const field of fields) {\n const value = record[field];\n if (typeof value === \"string\") record[field] = decodeCalendarDay(value);\n }\n return record as T;\n}\n\nfunction utcDay(ms: number): string {\n const date = new Date(ms);\n const month = String(date.getUTCMonth() + 1).padStart(2, \"0\");\n const day = String(date.getUTCDate()).padStart(2, \"0\");\n return `${date.getUTCFullYear()}-${month}-${day}`;\n}\n\n/**\n * Recover the calendar day a pre-v7 browser stored as a `Date` instant, or `null` when the\n * instant alone cannot prove it.\n *\n * Stored days were local midnight in the importing zone or, from older parsers, UTC midnight.\n * Every real offset lies between -12h and +14h on the quarter-hour grid, so a midnight lands\n * before 10:00 UTC on its own day (zones at or west of UTC) or after 12:00 UTC on the previous\n * day (east of UTC). From 10:00 to 12:00 UTC the two readings collide (offsets -10..-12 and\n * +12..+14 name different days), and an off-grid instant came from a timestamp, not a day.\n */\nexport function recoverCalendarDay(instant: Date): string | null {\n const ms = instant.getTime();\n if (!Number.isFinite(ms)) return null;\n const timeOfDay = ((ms % DAY_MS) + DAY_MS) % DAY_MS;\n if (timeOfDay % QUARTER_HOUR_MS !== 0) return null;\n if (timeOfDay < 10 * HOUR_MS) return utcDay(ms);\n if (timeOfDay > 12 * HOUR_MS) return utcDay(ms + DAY_MS);\n return null;\n}\n","/**\n * Opaque identifier generation\n *\n * `crypto.randomUUID()` is only exposed in secure contexts. Serving a production\n * build over plain http from a LAN address (anything that is not localhost or\n * https) leaves `crypto` defined but `crypto.randomUUID` undefined, so call sites\n * that used it directly threw \"crypto.randomUUID is not a function\". Every id in\n * the app is an opaque string, so falling back to a locally generated UUIDv4\n * keeps the stored format identical.\n */\n\nconst HEX = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, \"0\"));\n\n/**\n * Format 16 random bytes as a canonical UUID string, stamping the version 4 and\n * RFC 4122 variant bits.\n */\nfunction formatUuidV4(bytes: Uint8Array): string {\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n\n const hex = Array.from(bytes, (byte) => HEX[byte]);\n return [\n hex.slice(0, 4).join(\"\"),\n hex.slice(4, 6).join(\"\"),\n hex.slice(6, 8).join(\"\"),\n hex.slice(8, 10).join(\"\"),\n hex.slice(10, 16).join(\"\"),\n ].join(\"-\");\n}\n\n/**\n * Generate an opaque identifier as a canonical UUID string.\n *\n * Prefers `crypto.randomUUID()`, falls back to `crypto.getRandomValues()`, and\n * only reaches `Math.random()` when neither is available.\n *\n * @returns A UUID string, e.g. \"3f6b0f3e-9c5b-4f4e-8a2f-1d0c9b8a7e6f\"\n */\nexport function generateId(): string {\n const cryptoObj: Crypto | undefined = globalThis.crypto;\n\n if (typeof cryptoObj?.randomUUID === \"function\") {\n return cryptoObj.randomUUID();\n }\n\n const bytes = new Uint8Array(16);\n\n if (typeof cryptoObj?.getRandomValues === \"function\") {\n cryptoObj.getRandomValues(bytes);\n } else {\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n\n return formatUuidV4(bytes);\n}\n","/**\n * Blocks Store - CRUD operations for trading blocks\n */\n\nimport type { ProcessedBlock, Block } from \"../models/block.ts\";\nimport { generateId } from \"../utils/id.ts\";\nimport {\n STORES,\n withReadTransaction,\n withWriteTransaction,\n promisifyRequest,\n DatabaseError,\n} from \"./index.ts\";\nimport {\n decodeCalendarDays,\n encodeCalendarDays,\n type StoredCalendarDays,\n} from \"./calendar-days.ts\";\n\ntype DateRange = NonNullable<ProcessedBlock[\"dateRange\"]>;\ntype PersistedBlock = Omit<ProcessedBlock, \"dateRange\"> & {\n dateRange?: StoredCalendarDays<DateRange, keyof DateRange>;\n};\n\n/** The block's date range holds calendar days (its trades' first and last opening days). */\nconst RANGE_DAY_FIELDS = [\"start\", \"end\"] as const;\n\nfunction toPersisted(block: ProcessedBlock | PersistedBlock): PersistedBlock {\n if (!block.dateRange) return block as PersistedBlock;\n return { ...block, dateRange: encodeCalendarDays(block.dateRange, RANGE_DAY_FIELDS) };\n}\n\nfunction fromPersisted(block: PersistedBlock): ProcessedBlock {\n if (!block.dateRange) return block as ProcessedBlock;\n return {\n ...block,\n dateRange: decodeCalendarDays<DateRange, keyof DateRange>(block.dateRange, RANGE_DAY_FIELDS),\n };\n}\n\n/**\n * Clear a collection's unverified-day count after its rows are replaced or deleted, inside the\n * transaction that changes them.\n */\nexport async function clearUnverifiedCalendarDays(\n transaction: IDBTransaction,\n blockId: string,\n collection: keyof NonNullable<ProcessedBlock[\"unverifiedCalendarDays\"]>,\n): Promise<void> {\n const store = transaction.objectStore(STORES.BLOCKS);\n const block: PersistedBlock | undefined = await promisifyRequest(store.get(blockId));\n const counts = block?.unverifiedCalendarDays;\n if (!block || !counts || !(collection in counts)) return;\n delete counts[collection];\n if (Object.keys(counts).length === 0) delete block.unverifiedCalendarDays;\n await promisifyRequest(store.put(block));\n}\n\n/**\n * Create a new block\n */\nexport async function createBlock(\n blockData: Omit<ProcessedBlock, \"id\" | \"created\" | \"lastModified\">,\n): Promise<ProcessedBlock> {\n const block: ProcessedBlock = {\n ...blockData,\n id: generateId(),\n created: new Date(),\n lastModified: new Date(),\n };\n\n await withWriteTransaction(STORES.BLOCKS, async (transaction) => {\n const store = transaction.objectStore(STORES.BLOCKS);\n await promisifyRequest(store.add(toPersisted(block)));\n });\n\n return block;\n}\n\n/**\n * Get block by ID\n */\nexport async function getBlock(blockId: string): Promise<ProcessedBlock | null> {\n return withReadTransaction(STORES.BLOCKS, async (transaction) => {\n const store = transaction.objectStore(STORES.BLOCKS);\n const result: PersistedBlock | undefined = await promisifyRequest(store.get(blockId));\n return result ? fromPersisted(result) : null;\n });\n}\n\n/**\n * Get all blocks\n */\nexport async function getAllBlocks(): Promise<ProcessedBlock[]> {\n return withReadTransaction(STORES.BLOCKS, async (transaction) => {\n const store = transaction.objectStore(STORES.BLOCKS);\n const result: PersistedBlock[] = await promisifyRequest(store.getAll());\n\n // Sort by last modified (newest first)\n return result\n .sort((a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime())\n .map(fromPersisted);\n });\n}\n\n/**\n * Get active block\n */\nexport async function getActiveBlock(): Promise<ProcessedBlock | null> {\n return withReadTransaction(STORES.BLOCKS, async (transaction) => {\n const store = transaction.objectStore(STORES.BLOCKS);\n const index = store.index(\"isActive\");\n const result: PersistedBlock | undefined = await promisifyRequest(\n index.get(true as unknown as IDBValidKey),\n );\n return result ? fromPersisted(result) : null;\n });\n}\n\n/**\n * Update block\n */\nexport async function updateBlock(\n blockId: string,\n updates: Partial<ProcessedBlock>,\n): Promise<ProcessedBlock> {\n return withWriteTransaction(STORES.BLOCKS, async (transaction) => {\n const store = transaction.objectStore(STORES.BLOCKS);\n\n // Get existing block\n const existing: PersistedBlock | undefined = await promisifyRequest(store.get(blockId));\n if (!existing) {\n throw new DatabaseError(`Block not found: ${blockId}`, \"update\", STORES.BLOCKS);\n }\n\n // Merge updates with lastModified timestamp\n const updatedBlock = toPersisted({\n ...existing,\n ...(updates as Partial<PersistedBlock>),\n lastModified: new Date(),\n });\n\n await promisifyRequest(store.put(updatedBlock));\n return fromPersisted(updatedBlock);\n });\n}\n\n/**\n * Set active block (deactivates all others)\n */\nexport async function setActiveBlock(blockId: string): Promise<void> {\n await withWriteTransaction(STORES.BLOCKS, async (transaction) => {\n const store = transaction.objectStore(STORES.BLOCKS);\n\n // First, verify the block exists\n const targetBlock = await promisifyRequest(store.get(blockId));\n if (!targetBlock) {\n throw new DatabaseError(`Block not found: ${blockId}`, \"setActive\", STORES.BLOCKS);\n }\n\n // Get all blocks and update their active status\n const allBlocks = await promisifyRequest(store.getAll());\n\n for (const block of allBlocks) {\n const isActive = block.id === blockId;\n if (block.isActive !== isActive) {\n await promisifyRequest(\n store.put({\n ...block,\n isActive,\n lastModified: new Date(),\n }),\n );\n }\n }\n });\n}\n\n/**\n * Delete block and all associated data\n */\nexport async function deleteBlock(blockId: string): Promise<void> {\n await withWriteTransaction(\n [STORES.BLOCKS, STORES.TRADES, STORES.DAILY_LOGS, STORES.CALCULATIONS, STORES.REPORTING_LOGS],\n async (transaction) => {\n // Delete block\n const blocksStore = transaction.objectStore(STORES.BLOCKS);\n await promisifyRequest(blocksStore.delete(blockId));\n\n // Delete associated trades\n const tradesStore = transaction.objectStore(STORES.TRADES);\n const tradesIndex = tradesStore.index(\"blockId\");\n const tradesRequest = tradesIndex.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n tradesRequest.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n tradesRequest.onerror = () => reject(tradesRequest.error);\n });\n\n // Delete associated daily logs\n const dailyLogsStore = transaction.objectStore(STORES.DAILY_LOGS);\n const dailyLogsIndex = dailyLogsStore.index(\"blockId\");\n const dailyLogsRequest = dailyLogsIndex.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n dailyLogsRequest.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n dailyLogsRequest.onerror = () => reject(dailyLogsRequest.error);\n });\n\n // Delete associated reporting trades\n const reportingStore = transaction.objectStore(STORES.REPORTING_LOGS);\n const reportingIndex = reportingStore.index(\"blockId\");\n const reportingRequest = reportingIndex.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n reportingRequest.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n reportingRequest.onerror = () => reject(reportingRequest.error);\n });\n\n // Delete associated calculations\n const calculationsStore = transaction.objectStore(STORES.CALCULATIONS);\n const calculationsIndex = calculationsStore.index(\"blockId\");\n const calculationsRequest = calculationsIndex.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n calculationsRequest.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n calculationsRequest.onerror = () => reject(calculationsRequest.error);\n });\n },\n );\n}\n\n/**\n * Get blocks count\n */\nexport async function getBlocksCount(): Promise<number> {\n return withReadTransaction(STORES.BLOCKS, async (transaction) => {\n const store = transaction.objectStore(STORES.BLOCKS);\n const result = await promisifyRequest(store.count());\n return result;\n });\n}\n\n/**\n * Check if block name is unique\n */\nexport async function isBlockNameUnique(name: string, excludeId?: string): Promise<boolean> {\n return withReadTransaction(STORES.BLOCKS, async (transaction) => {\n const store = transaction.objectStore(STORES.BLOCKS);\n const index = store.index(\"name\");\n const result = await promisifyRequest(index.getAll(name));\n\n if (excludeId) {\n return result.filter((block) => block.id !== excludeId).length === 0;\n }\n\n return result.length === 0;\n });\n}\n\n/**\n * Update block processing status\n */\nexport async function updateProcessingStatus(\n blockId: string,\n status: ProcessedBlock[\"processingStatus\"],\n error?: string,\n): Promise<void> {\n await updateBlock(blockId, {\n processingStatus: status,\n processingError: error,\n ...(status === \"completed\" && { lastProcessedAt: new Date() }),\n });\n}\n\n/**\n * Update block statistics\n */\nexport async function updateBlockStats(\n blockId: string,\n portfolioStats: ProcessedBlock[\"portfolioStats\"],\n strategyStats?: ProcessedBlock[\"strategyStats\"],\n performanceMetrics?: ProcessedBlock[\"performanceMetrics\"],\n): Promise<void> {\n await updateBlock(blockId, {\n portfolioStats,\n strategyStats,\n performanceMetrics,\n });\n}\n\n/**\n * Convert ProcessedBlock to legacy Block format (for backward compatibility)\n */\nexport function toLegacyBlock(processedBlock: ProcessedBlock): Block {\n return {\n id: processedBlock.id,\n name: processedBlock.name,\n description: processedBlock.description,\n isActive: processedBlock.isActive,\n created: processedBlock.created,\n lastModified: processedBlock.lastModified,\n tradeLog: {\n fileName: processedBlock.tradeLog.fileName,\n rowCount: processedBlock.tradeLog.processedRowCount,\n fileSize: processedBlock.tradeLog.fileSize,\n },\n dailyLog: processedBlock.dailyLog\n ? {\n fileName: processedBlock.dailyLog.fileName,\n rowCount: processedBlock.dailyLog.processedRowCount,\n fileSize: processedBlock.dailyLog.fileSize,\n }\n : undefined,\n stats: {\n totalPnL: processedBlock.portfolioStats?.totalPl || 0,\n winRate: processedBlock.portfolioStats?.winRate || 0,\n totalTrades: processedBlock.portfolioStats?.totalTrades || 0,\n avgWin: processedBlock.portfolioStats?.avgWin || 0,\n avgLoss: processedBlock.portfolioStats?.avgLoss || 0,\n },\n };\n}\n","/**\n * Reporting trade model represents live trading executions coming from the\n * strategy-trade-log.csv export. These records are the actual OO trade log,\n * used to compare live performance against backtested results for a block.\n */\nexport interface ReportingTrade {\n strategy: string;\n account?: string;\n dateOpened: Date;\n timeOpened?: string;\n /** Exact source timestamp, before display formatting/truncation. */\n rawTimeOpened?: string;\n openingPrice: number;\n legs: string;\n initialPremium: number;\n /** Confirmed signed opening price per share of one lot; absent on unclassified legacy rows. */\n initialPremiumUnit?: \"quote\";\n numContracts: number;\n pl: number;\n closingPrice?: number;\n dateClosed?: Date;\n timeClosed?: string;\n /** Exact source timestamp, before display formatting/truncation. */\n rawTimeClosed?: string;\n daysInTrade?: number;\n avgClosingCost?: number;\n reasonForClose?: string;\n /** Lossless source row, including columns unknown to this library version. */\n sourceFields?: Record<string, string>;\n}\n\n/**\n * Old OO rows retained their raw Initial Premium cell; old TAT rows did not.\n * A matching source cell is evidence of a verbatim quote, not a price-size guess.\n */\nexport function hasReportingPremiumQuote(trade: ReportingTrade): boolean {\n if (trade.initialPremiumUnit === \"quote\") return true;\n const source = trade.sourceFields;\n if (!source) return false;\n const cell =\n source[\"Initial Premium\"] ?? source[\"Initial Premium ($)\"] ?? source[\"Initial Credit\"];\n return cell !== undefined && cell.trim() !== \"\" && Number(cell) === trade.initialPremium;\n}\n\n/**\n * Raw reporting trade data direct from the CSV prior to conversion.\n */\nexport interface RawReportingTradeData {\n Strategy: string;\n Account?: string;\n \"Date Opened\": string;\n \"Time Opened\"?: string;\n \"Opening Price\": string;\n Legs: string;\n \"Initial Premium\": string;\n \"No. of Contracts\": string;\n \"P/L\": string;\n \"Closing Price\"?: string;\n \"Date Closed\"?: string;\n \"Time Closed\"?: string;\n \"Avg. Closing Cost\"?: string;\n \"Reason For Close\"?: string;\n \"Days in Trade\"?: string;\n /** Exact source row captured before alias normalization. */\n __sourceFields?: Record<string, string>;\n [column: string]: string | Record<string, string> | undefined;\n}\n\n/**\n * Required columns that must be present for a reporting log import to be valid.\n */\nexport const REQUIRED_REPORTING_TRADE_COLUMNS = [\n \"Strategy\",\n \"Date Opened\",\n \"Opening Price\",\n \"Legs\",\n \"Initial Premium\",\n \"No. of Contracts\",\n \"P/L\",\n] as const;\n\n/**\n * Column aliases to support slight variations in exports.\n */\nexport const REPORTING_TRADE_COLUMN_ALIASES: Record<string, string> = {\n \"Initial Premium ($)\": \"Initial Premium\",\n \"Initial Credit\": \"Initial Premium\",\n Contracts: \"No. of Contracts\",\n \"Contracts Traded\": \"No. of Contracts\",\n PL: \"P/L\",\n};\n","/**\n * Shared utility for equity curve calculations.\n *\n * This module provides a single source of truth for rebuilding equity curves\n * when trades are modified (scaled, filtered, etc.). It prevents bugs where\n * fundsAtClose values become inconsistent with P&L values.\n *\n * @example\n * ```typescript\n * // Rebuild equity curve after scaling trades\n * const scaledTrades = trades.map(t => ({ ...t, pl: t.pl * 0.5 }))\n * const withEquity = rebuildEquityCurve(scaledTrades, { initialCapital: 10000 })\n *\n * // Or use the combined helper\n * const scaled = scaleTradesWithEquityCurve(trades, 0.5, { initialCapital: 10000 })\n * ```\n */\n\nimport { PlBasis, type Trade } from \"../models/trade.ts\";\n\n/**\n * Options for rebuilding equity curves.\n */\nexport interface RebuildEquityCurveOptions {\n /**\n * Initial capital to start the equity curve from.\n * If not provided, will be calculated from the first trade's fundsAtClose - pl.\n */\n initialCapital?: number;\n\n /**\n * Whether to sort trades by close date before processing.\n * Default: true\n */\n sortByDate?: boolean;\n\n /**\n * Whether to include commissions in P&L calculation.\n * When true, uses basis-aware net P&L and deducts fees at most once.\n * Default: false (uses the reported value from trade.pl)\n */\n useNetPl?: boolean;\n}\n\n/**\n * Options for scaling trades with equity curve rebuild.\n */\nexport interface ScaleTradesOptions extends RebuildEquityCurveOptions {\n /**\n * Whether to also scale commission fees.\n * Default: true\n */\n scaleCommissions?: boolean;\n}\n\n/**\n * Sort trades by close date and time.\n *\n * @param trades - Array of trades to sort\n * @returns New array sorted by dateClosed and timeClosed\n */\nexport function sortTradesByCloseDate<T extends Pick<Trade, \"dateClosed\" | \"timeClosed\">>(\n trades: T[],\n): T[] {\n return [...trades].sort((a, b) => {\n if (!a.dateClosed && !b.dateClosed) return 0;\n if (!a.dateClosed) return 1;\n if (!b.dateClosed) return -1;\n\n const dateA = new Date(a.dateClosed);\n const dateB = new Date(b.dateClosed);\n const cmp = dateA.getTime() - dateB.getTime();\n if (cmp !== 0) return cmp;\n\n // Secondary sort by time\n return (a.timeClosed || \"\").localeCompare(b.timeClosed || \"\");\n });\n}\n\n/**\n * Calculate initial capital from a sorted array of trades.\n *\n * Uses the first trade's fundsAtClose - pl to derive the starting capital.\n *\n * @param sortedTrades - Trades sorted by close date\n * @returns Initial capital, or undefined if cannot be determined\n */\nexport function calculateInitialCapital(\n sortedTrades: Pick<\n Trade,\n \"fundsAtClose\" | \"pl\" | \"plBasis\" | \"openingCommissionsFees\" | \"closingCommissionsFees\"\n >[],\n): number | undefined {\n if (sortedTrades.length === 0) return undefined;\n\n const firstTrade = sortedTrades[0];\n if (firstTrade.fundsAtClose === undefined || firstTrade.fundsAtClose === null) {\n return undefined;\n }\n\n const metricPl = firstTrade.plBasis === undefined ? firstTrade.pl : getNetPl(firstTrade);\n return firstTrade.fundsAtClose - metricPl;\n}\n\n/**\n * Get the net P&L for a trade, deducting commissions exactly once.\n *\n * Option Omega exports declare `net_includes_fees`, so their reported P/L is\n * returned unchanged. An omitted basis preserves the historical TradeBlocks\n * contract and is treated as `gross_before_fees`.\n *\n * @param trade - Trade to calculate net P&L for\n * @returns Net P&L value\n */\nexport function getNetPl(\n trade: Pick<Trade, \"pl\" | \"plBasis\" | \"openingCommissionsFees\" | \"closingCommissionsFees\">,\n): number {\n if (trade.plBasis === PlBasis.NetIncludesFees) {\n return trade.pl;\n }\n const openingComm = trade.openingCommissionsFees ?? 0;\n const closingComm = trade.closingCommissionsFees ?? 0;\n return trade.pl - openingComm - closingComm;\n}\n\n/**\n * Get gross-before-fee P/L from a basis-aware trade.\n */\nexport function getGrossPl(\n trade: Pick<Trade, \"pl\" | \"plBasis\" | \"openingCommissionsFees\" | \"closingCommissionsFees\">,\n): number {\n if (trade.plBasis !== PlBasis.NetIncludesFees) {\n return trade.pl;\n }\n const openingComm = trade.openingCommissionsFees ?? 0;\n const closingComm = trade.closingCommissionsFees ?? 0;\n return trade.pl + openingComm + closingComm;\n}\n\n/**\n * Rebuild the equity curve for a set of trades.\n *\n * This function recalculates fundsAtClose for each trade based on cumulative P&L.\n * It's essential to call this after modifying trade P&L values (e.g., scaling).\n *\n * IMPORTANT: The returned trades maintain their original order but have\n * fundsAtClose recalculated based on chronological P&L accumulation.\n *\n * @param trades - Array of trades (will not be mutated)\n * @param options - Configuration options\n * @returns New array of trades with recalculated fundsAtClose values\n *\n * @example\n * ```typescript\n * // After scaling P&L, rebuild the equity curve\n * const scaledTrades = trades.map(t => ({ ...t, pl: t.pl * 0.5 }))\n * const withEquity = rebuildEquityCurve(scaledTrades, { initialCapital: 10000 })\n * ```\n */\nexport function rebuildEquityCurve<T extends Trade>(\n trades: T[],\n options: RebuildEquityCurveOptions = {},\n): T[] {\n const { sortByDate = true, useNetPl = false } = options;\n\n if (trades.length === 0) return [];\n\n // Filter to trades with close dates for equity calculation\n const closedTrades = trades.filter((t) => t.dateClosed);\n if (closedTrades.length === 0) return [...trades];\n\n // Sort trades chronologically\n const sortedTrades = sortByDate ? sortTradesByCloseDate(closedTrades) : closedTrades;\n\n // Determine initial capital\n let initialCapital = options.initialCapital;\n if (initialCapital === undefined) {\n // Try to calculate from original first trade's fundsAtClose\n const originalSorted = sortTradesByCloseDate(\n trades.filter((t) => t.dateClosed && t.fundsAtClose !== undefined && t.fundsAtClose !== null),\n );\n initialCapital = calculateInitialCapital(originalSorted);\n\n // Fallback to a reasonable default\n if (initialCapital === undefined) {\n initialCapital = 1000000;\n }\n }\n\n // Build mapping of trade -> new fundsAtClose\n // We use a Map keyed by trade reference since trades may have same values\n const fundsAtCloseMap = new Map<T, number>();\n let runningEquity = initialCapital;\n\n for (const trade of sortedTrades) {\n const pl = useNetPl ? getNetPl(trade) : trade.pl;\n runningEquity += pl;\n fundsAtCloseMap.set(trade, runningEquity);\n }\n\n // Return trades in original order with updated fundsAtClose\n return trades.map((trade) => {\n const newFundsAtClose = fundsAtCloseMap.get(trade);\n if (newFundsAtClose !== undefined) {\n return { ...trade, fundsAtClose: newFundsAtClose };\n }\n return { ...trade };\n });\n}\n\n/**\n * Scale trades by a factor and rebuild the equity curve.\n *\n * This is the recommended way to scale trades as it ensures the equity curve\n * remains consistent with the scaled P&L values.\n *\n * @param trades - Array of trades (will not be mutated)\n * @param scaleFactor - Factor to multiply P&L by (e.g., 0.5 for half, 2 for double)\n * @param options - Configuration options\n * @returns New array of trades with scaled P&L and recalculated fundsAtClose\n *\n * @example\n * ```typescript\n * // Scale trades to 50% and rebuild equity curve\n * const scaled = scaleTradesWithEquityCurve(trades, 0.5, { initialCapital: 10000 })\n *\n * // Scale up by 2x\n * const doubled = scaleTradesWithEquityCurve(trades, 2.0)\n * ```\n */\nexport function scaleTradesWithEquityCurve<T extends Trade>(\n trades: T[],\n scaleFactor: number,\n options: ScaleTradesOptions = {},\n): T[] {\n const { scaleCommissions = true, ...rebuildOptions } = options;\n\n if (trades.length === 0) return [];\n\n // Scale P&L and optionally commissions\n const scaledTrades = trades.map((trade) => {\n const scaled: T = {\n ...trade,\n pl: trade.pl * scaleFactor,\n };\n\n if (scaleCommissions) {\n if (trade.openingCommissionsFees !== undefined) {\n scaled.openingCommissionsFees = trade.openingCommissionsFees * scaleFactor;\n }\n if (trade.closingCommissionsFees !== undefined) {\n scaled.closingCommissionsFees = trade.closingCommissionsFees * scaleFactor;\n }\n }\n\n return scaled;\n });\n\n // Rebuild equity curve with scaled P&L\n return rebuildEquityCurve(scaledTrades, rebuildOptions);\n}\n\n/**\n * Normalize trades to one lot (single contract) and rebuild equity curve.\n *\n * Divides P&L by contract count to get per-contract performance.\n *\n * @param trades - Array of trades (will not be mutated)\n * @param options - Configuration options\n * @returns New array of trades normalized to one lot with rebuilt equity curve\n *\n * @example\n * ```typescript\n * const normalized = normalizeToOneLot(trades, { initialCapital: 10000 })\n * ```\n */\nexport function normalizeToOneLot<T extends Trade>(\n trades: T[],\n options: RebuildEquityCurveOptions = {},\n): T[] {\n if (trades.length === 0) return [];\n\n // Normalize each trade to single contract\n const normalizedTrades = trades.map((trade) => {\n const contracts = trade.numContracts || 1;\n const scaleFactor = 1 / contracts;\n\n return {\n ...trade,\n pl: trade.pl * scaleFactor,\n numContracts: 1,\n openingCommissionsFees: trade.openingCommissionsFees\n ? trade.openingCommissionsFees * scaleFactor\n : trade.openingCommissionsFees,\n closingCommissionsFees: trade.closingCommissionsFees\n ? trade.closingCommissionsFees * scaleFactor\n : trade.closingCommissionsFees,\n };\n });\n\n // Rebuild equity curve with normalized P&L\n return rebuildEquityCurve(normalizedTrades, options);\n}\n","/**\n * Leg Group Combining Utility\n *\n * For MEIC (Multiple Entry Iron Condor) and similar strategies where the backtester\n * creates separate trade records for each leg group (e.g., calls and puts) that were\n * opened simultaneously but may have different exit conditions/times.\n *\n * This utility groups trades by entry timestamp and combines them into single trade records.\n */\n\nimport { PlBasis, type Trade } from \"../models/trade.ts\";\nimport { formatDateKey } from \"../calculations/trade-matching.ts\";\nimport { hasReportingPremiumQuote, type ReportingTrade } from \"../models/reporting-trade.ts\";\nimport { yieldToMain, checkCancelled } from \"./async-helpers.ts\";\nimport { getNetPl } from \"./equity-curve.ts\";\n\n/**\n * Key used to group trades that were opened at the same time\n */\nexport interface TradeGroupKey {\n dateOpened: string; // ISO date string\n timeOpened: string;\n strategy: string;\n}\n\n/**\n * Result of combining multiple leg groups into a single trade\n */\nexport interface CombinedTrade extends Trade {\n originalTradeCount: number; // Number of trades that were combined\n combinedLegs: string[]; // Array of leg strings from each trade\n}\n\n/**\n * Result of combining multiple ReportingTrade leg groups into a single trade\n */\nexport interface CombinedReportingTrade extends ReportingTrade {\n originalTradeCount: number; // Number of trades that were combined\n combinedLegs: string[]; // Array of leg strings from each trade\n}\n\n/**\n * Type guard to check if a Trade is a CombinedTrade\n */\nexport function isCombinedTrade(trade: Trade): trade is CombinedTrade {\n return \"originalTradeCount\" in trade && \"combinedLegs\" in trade;\n}\n\n/**\n * Type guard to check if a ReportingTrade is a CombinedReportingTrade\n */\nexport function isCombinedReportingTrade(trade: ReportingTrade): trade is CombinedReportingTrade {\n return \"originalTradeCount\" in trade && \"combinedLegs\" in trade;\n}\n\n/**\n * Generate a unique key for grouping trades by entry timestamp\n */\nfunction generateGroupKey(trade: Trade): string {\n const dateStr = formatDateKey(trade.dateOpened);\n return `${dateStr}|${trade.timeOpened}|${trade.strategy}`;\n}\n\n/**\n * Parse a group key back into its components\n * (Not currently used but kept for future API compatibility)\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction parseGroupKey(key: string): TradeGroupKey {\n const [dateOpened, timeOpened, strategy] = key.split(\"|\");\n return { dateOpened, timeOpened, strategy };\n}\n\n/**\n * Group trades by their entry timestamp (date + time + strategy)\n * Returns a map where the key is the group identifier and value is array of trades\n */\nexport function groupTradesByEntry(trades: Trade[]): Map<string, Trade[]> {\n const groups = new Map<string, Trade[]>();\n\n for (const trade of trades) {\n const key = generateGroupKey(trade);\n const group = groups.get(key) || [];\n group.push(trade);\n groups.set(key, group);\n }\n\n return groups;\n}\n\n/**\n * Combine a group of trades that were opened at the same time into a single trade record\n *\n * Rules for combining:\n * - Opening fields: Use first trade's values (they should be identical)\n * - Closing fields: Use the last closing time among all trades\n * - Premium: Sum of all premiums\n * - P/L: Sum of all P/Ls\n * - Commissions: Sum of all commissions\n * - Margin: Use the maximum margin requirement\n * - Contracts: Sum of all contracts\n * - Legs: Concatenate all leg descriptions\n * - Closing price: Use weighted average based on premiums\n * - Funds at close: Use final funds from last closed trade\n */\nexport function combineLegGroup(trades: Trade[]): CombinedTrade {\n if (trades.length === 0) {\n throw new Error(\"Cannot combine empty trade group\");\n }\n\n // Sort trades by closing time (or use original order if not closed)\n const sortedTrades = [...trades].sort((a, b) => {\n if (!a.dateClosed && !b.dateClosed) return 0;\n if (!a.dateClosed) return 1;\n if (!b.dateClosed) return -1;\n\n const dateCompare = a.dateClosed.getTime() - b.dateClosed.getTime();\n if (dateCompare !== 0) return dateCompare;\n\n // Secondary sort by time if dates are equal\n const timeA = a.timeClosed || \"00:00:00\";\n const timeB = b.timeClosed || \"00:00:00\";\n return timeA.localeCompare(timeB);\n });\n\n // Use first trade as template (opening info should be identical)\n const firstTrade = sortedTrades[0];\n const lastTrade = sortedTrades[sortedTrades.length - 1];\n\n // Aggregate numeric values\n const totalPremium = trades.reduce((sum, t) => sum + t.premium, 0);\n const allBasesUndeclared = trades.every((trade) => trade.plBasis === undefined);\n const totalPL = allBasesUndeclared\n ? trades.reduce((sum, trade) => sum + trade.pl, 0)\n : trades.reduce((sum, trade) => sum + getNetPl(trade), 0);\n // Use the contract size of the first leg to represent the \"Strategy Unit Size\"\n // e.g. A 10-lot Iron Condor has 4 legs of 10 contracts.\n // We want the combined trade to say \"10 contracts\" (10 ICs), not 40.\n const totalContracts = firstTrade.numContracts;\n const totalOpeningCommissions = trades.reduce((sum, t) => sum + t.openingCommissionsFees, 0);\n const totalClosingCommissions = trades.reduce((sum, t) => sum + t.closingCommissionsFees, 0);\n\n // For margin:\n // - Debit trades (totalPremium < 0): Sum margin (e.g. Straddle = Call + Put cost)\n // - Credit trades (totalPremium >= 0): Max margin (e.g. Iron Condor = Max(Call side, Put side))\n const maxMargin =\n totalPremium < 0\n ? trades.reduce((sum, t) => sum + t.marginReq, 0)\n : Math.max(...trades.map((t) => t.marginReq));\n\n // Calculate weighted average closing price\n let weightedClosingPrice: number | undefined;\n if (trades.every((t) => t.closingPrice !== undefined)) {\n const totalPremiumForClosedTrades = trades\n .filter((t) => t.closingPrice !== undefined)\n .reduce((sum, t) => sum + Math.abs(t.premium), 0);\n\n if (totalPremiumForClosedTrades > 0) {\n weightedClosingPrice =\n trades\n .filter((t) => t.closingPrice !== undefined)\n .reduce((sum, t) => sum + t.closingPrice! * Math.abs(t.premium), 0) /\n totalPremiumForClosedTrades;\n }\n }\n\n // Calculate total closing cost if all trades have it recorded\n let avgClosingCost: number | undefined;\n const tradesWithClosingCost = trades.filter((t) => t.avgClosingCost !== undefined);\n if (tradesWithClosingCost.length === trades.length) {\n avgClosingCost = tradesWithClosingCost.reduce((sum, t) => sum + t.avgClosingCost!, 0);\n }\n\n // Combine leg descriptions\n const combinedLegs = trades.map((t) => t.legs);\n const combinedLegsString = combinedLegs.join(\" | \");\n\n // Use last trade's closing information (latest exit)\n const dateClosed = lastTrade.dateClosed;\n const timeClosed = lastTrade.timeClosed;\n const reasonForClose = lastTrade.reasonForClose;\n const fundsAtClose = lastTrade.fundsAtClose;\n const closingShortLongRatio = lastTrade.closingShortLongRatio;\n const closingVix = lastTrade.closingVix;\n\n // Calculate combined opening short/long ratio (weighted by premium)\n const totalAbsPremium = trades.reduce((sum, t) => sum + Math.abs(t.premium), 0);\n const weightedOpeningShortLongRatio =\n totalAbsPremium > 0\n ? trades.reduce((sum, t) => sum + t.openingShortLongRatio * Math.abs(t.premium), 0) /\n totalAbsPremium\n : trades[0].openingShortLongRatio;\n\n // For optional fields, use first trade's value or undefined\n const gap = firstTrade.gap;\n const movement = firstTrade.movement;\n\n // Max profit/loss handling:\n // - For single trades (originalTradeCount === 1): preserve original percentage values from CSV\n // - For combined trades (originalTradeCount > 1): derive dollar amounts from margin\n let maxProfit: number | undefined;\n let maxLoss: number | undefined;\n\n if (trades.length === 1) {\n // Single trade: preserve original values (percentages from CSV)\n maxProfit = firstTrade.maxProfit;\n maxLoss = firstTrade.maxLoss;\n // For debit trades without explicit maxLoss, use premium paid as max loss\n if (maxLoss === undefined && firstTrade.premium < 0) {\n maxLoss = firstTrade.premium;\n }\n } else {\n // Combined trades: sum maxProfit, use margin for maxLoss\n if (trades.every((t) => t.maxProfit !== undefined)) {\n maxProfit = trades.reduce((sum, t) => sum + t.maxProfit!, 0);\n }\n\n // Use margin requirement as ground truth for worst-case loss\n if (maxMargin && Number.isFinite(maxMargin) && maxMargin > 0) {\n maxLoss = -maxMargin;\n } else if (trades.every((t) => t.maxLoss !== undefined)) {\n maxLoss = trades.reduce((sum, t) => sum + t.maxLoss!, 0);\n } else if (totalPremium < 0) {\n // Fallback: For debit trades, the max loss is at least the premium paid\n maxLoss = totalPremium;\n }\n }\n\n const combined: CombinedTrade = {\n // Opening information (from first trade)\n dateOpened: firstTrade.dateOpened,\n timeOpened: firstTrade.timeOpened,\n openingPrice: firstTrade.openingPrice,\n legs: combinedLegsString,\n premium: totalPremium,\n openingVix: firstTrade.openingVix,\n\n // Closing information (from last closed trade)\n closingPrice: weightedClosingPrice,\n dateClosed,\n timeClosed,\n avgClosingCost,\n reasonForClose,\n closingVix,\n\n // Aggregated values\n pl: totalPL,\n plBasis: allBasesUndeclared ? undefined : PlBasis.NetIncludesFees,\n // A singleton keeps the source's own P/L %; a multi-row group has no source value for the\n // combined position, so enrichment computes it from the combined P/L and premium.\n plPct: trades.length === 1 ? firstTrade.plPct : undefined,\n numContracts: totalContracts,\n fundsAtClose,\n marginReq: maxMargin,\n openingCommissionsFees: totalOpeningCommissions,\n closingCommissionsFees: totalClosingCommissions,\n\n // Strategy and ratios\n strategy: firstTrade.strategy,\n openingShortLongRatio: weightedOpeningShortLongRatio,\n closingShortLongRatio,\n\n // Optional market data\n gap,\n movement,\n maxProfit,\n maxLoss,\n\n // Combined trade metadata\n originalTradeCount: trades.length,\n combinedLegs,\n };\n\n return combined;\n}\n\nexport interface CombineLegGroupsProgress {\n step: string;\n percent: number;\n}\n\nexport interface CombineLegGroupsOptions {\n onProgress?: (progress: CombineLegGroupsProgress) => void;\n signal?: AbortSignal;\n}\n\n/**\n * Process all trades and combine leg groups that share the same entry timestamp\n *\n * @param trades - Array of trades to process\n * @returns Array of trades with leg groups combined (single trades are preserved as-is)\n */\nexport function combineAllLegGroups(trades: Trade[]): CombinedTrade[] {\n const groups = groupTradesByEntry(trades);\n const combinedTrades: CombinedTrade[] = [];\n\n for (const [, groupTrades] of groups) {\n combinedTrades.push(combineLegGroup(groupTrades));\n }\n\n // Sort by date/time to maintain chronological order\n combinedTrades.sort((a, b) => {\n const dateCompare = a.dateOpened.getTime() - b.dateOpened.getTime();\n if (dateCompare !== 0) return dateCompare;\n return a.timeOpened.localeCompare(b.timeOpened);\n });\n\n return combinedTrades;\n}\n\n/**\n * Async version of combineAllLegGroups with progress reporting and cancellation support\n * Use this for large datasets to keep UI responsive\n *\n * @param trades - Array of trades to process\n * @param options - Progress callback and abort signal\n * @returns Array of trades with leg groups combined\n */\nexport async function combineAllLegGroupsAsync(\n trades: Trade[],\n options?: CombineLegGroupsOptions,\n): Promise<CombinedTrade[]> {\n const { onProgress, signal } = options ?? {};\n\n checkCancelled(signal);\n onProgress?.({ step: \"Grouping trades by entry\", percent: 0 });\n await yieldToMain();\n\n const groups = groupTradesByEntry(trades);\n const combinedTrades: CombinedTrade[] = [];\n const totalGroups = groups.size;\n let processedGroups = 0;\n\n checkCancelled(signal);\n onProgress?.({ step: \"Combining leg groups\", percent: 10 });\n\n for (const [, groupTrades] of groups) {\n combinedTrades.push(combineLegGroup(groupTrades));\n processedGroups++;\n\n // Yield every 100 groups to keep UI responsive\n if (processedGroups % 100 === 0) {\n checkCancelled(signal);\n const percent = 10 + Math.floor((processedGroups / totalGroups) * 70);\n onProgress?.({ step: `Combining leg groups (${processedGroups}/${totalGroups})`, percent });\n await yieldToMain();\n }\n }\n\n checkCancelled(signal);\n onProgress?.({ step: \"Sorting combined trades\", percent: 85 });\n await yieldToMain();\n\n // Sort by date/time to maintain chronological order\n combinedTrades.sort((a, b) => {\n const dateCompare = a.dateOpened.getTime() - b.dateOpened.getTime();\n if (dateCompare !== 0) return dateCompare;\n return a.timeOpened.localeCompare(b.timeOpened);\n });\n\n onProgress?.({ step: \"Complete\", percent: 100 });\n\n return combinedTrades;\n}\n\n/**\n * Identify which trades would be affected by combining leg groups\n * Useful for showing users what will change before they enable the feature\n *\n * @returns Object with statistics about grouping\n */\nexport function analyzeLegGroups(trades: Trade[]): {\n totalTrades: number;\n uniqueEntries: number;\n groupedEntries: number;\n maxGroupSize: number;\n avgGroupSize: number;\n groupSizeDistribution: Record<number, number>; // size -> count\n} {\n const groups = groupTradesByEntry(trades);\n\n const groupSizes = Array.from(groups.values()).map((g) => g.length);\n const groupedEntries = groupSizes.filter((size) => size > 1).length;\n\n const distribution: Record<number, number> = {};\n for (const size of groupSizes) {\n distribution[size] = (distribution[size] || 0) + 1;\n }\n\n return {\n totalTrades: trades.length,\n uniqueEntries: groups.size,\n groupedEntries,\n maxGroupSize: groupSizes.length > 0 ? Math.max(...groupSizes) : 0,\n avgGroupSize:\n groupSizes.length > 0 ? groupSizes.reduce((a, b) => a + b, 0) / groupSizes.length : 0,\n groupSizeDistribution: distribution,\n };\n}\n\n// =============================================================================\n// ReportingTrade Combining Functions\n// =============================================================================\n\n/**\n * Generate a unique key for grouping ReportingTrades by entry timestamp\n */\nfunction generateReportingGroupKey(trade: ReportingTrade): string {\n const dateStr = formatDateKey(trade.dateOpened);\n const timeStr = trade.timeOpened ?? \"00:00:00\";\n return `${dateStr}|${timeStr}|${trade.strategy}`;\n}\n\n/**\n * Group ReportingTrades by their entry timestamp (date + time + strategy)\n * Returns a map where the key is the group identifier and value is array of trades\n */\nexport function groupReportingTradesByEntry(\n trades: ReportingTrade[],\n): Map<string, ReportingTrade[]> {\n const groups = new Map<string, ReportingTrade[]>();\n\n for (const trade of trades) {\n const key = generateReportingGroupKey(trade);\n const group = groups.get(key) || [];\n group.push(trade);\n groups.set(key, group);\n }\n\n return groups;\n}\n\n/**\n * Combine a group of ReportingTrades that were opened at the same time into a single trade record\n *\n * Rules for combining (simpler than Trade - fewer fields):\n * - Opening fields: Use first trade's values (should be identical)\n * - Closing fields: Use the last closing time among all trades\n * - Premium: Sum of the signed per-share quotes (all component rows share the lot count)\n * - P/L: Sum of all P/Ls\n * - Contracts: Use first trade's contract count (strategy unit size)\n * - Legs: Concatenate all leg descriptions\n */\nexport function combineReportingLegGroup(trades: ReportingTrade[]): CombinedReportingTrade {\n if (trades.length === 0) {\n throw new Error(\"Cannot combine empty reporting trade group\");\n }\n\n // Sort trades by closing time\n const sortedTrades = [...trades].sort((a, b) => {\n if (!a.dateClosed && !b.dateClosed) return 0;\n if (!a.dateClosed) return 1;\n if (!b.dateClosed) return -1;\n\n const dateCompare = a.dateClosed.getTime() - b.dateClosed.getTime();\n if (dateCompare !== 0) return dateCompare;\n\n const timeA = a.timeClosed || \"00:00:00\";\n const timeB = b.timeClosed || \"00:00:00\";\n return timeA.localeCompare(timeB);\n });\n\n const firstTrade = sortedTrades[0];\n const lastTrade = sortedTrades[sortedTrades.length - 1];\n\n // Aggregate numeric values\n const totalPremium = trades.reduce((sum, t) => sum + t.initialPremium, 0);\n const totalPL = trades.reduce((sum, t) => sum + t.pl, 0);\n const totalContracts = firstTrade.numContracts; // Strategy unit size\n\n // Combine leg descriptions\n const combinedLegs = trades.map((t) => t.legs);\n const combinedLegsString = combinedLegs.join(\" | \");\n\n // Calculate total closing cost if all trades have it\n let avgClosingCost: number | undefined;\n const tradesWithClosingCost = trades.filter((t) => t.avgClosingCost !== undefined);\n if (tradesWithClosingCost.length === trades.length) {\n avgClosingCost = tradesWithClosingCost.reduce((sum, t) => sum + t.avgClosingCost!, 0);\n }\n\n // Weighted average closing price\n let closingPrice: number | undefined;\n if (trades.every((t) => t.closingPrice !== undefined)) {\n const totalPremiumAbs = trades.reduce((sum, t) => sum + Math.abs(t.initialPremium), 0);\n if (totalPremiumAbs > 0) {\n closingPrice =\n trades.reduce((sum, t) => sum + t.closingPrice! * Math.abs(t.initialPremium), 0) /\n totalPremiumAbs;\n }\n }\n\n return {\n strategy: firstTrade.strategy,\n dateOpened: firstTrade.dateOpened,\n timeOpened: firstTrade.timeOpened,\n openingPrice: firstTrade.openingPrice,\n legs: combinedLegsString,\n initialPremium: totalPremium,\n initialPremiumUnit: trades.every(hasReportingPremiumQuote) ? \"quote\" : undefined,\n numContracts: totalContracts,\n pl: totalPL,\n closingPrice,\n dateClosed: lastTrade.dateClosed,\n timeClosed: lastTrade.timeClosed,\n avgClosingCost,\n reasonForClose: lastTrade.reasonForClose,\n originalTradeCount: trades.length,\n combinedLegs,\n };\n}\n\n/**\n * Process all ReportingTrades and combine leg groups that share the same entry timestamp\n *\n * @param trades - Array of ReportingTrades to process\n * @returns Array of trades with leg groups combined\n */\nexport function combineAllReportingLegGroups(trades: ReportingTrade[]): CombinedReportingTrade[] {\n const groups = groupReportingTradesByEntry(trades);\n const combinedTrades: CombinedReportingTrade[] = [];\n\n for (const [, groupTrades] of groups) {\n combinedTrades.push(combineReportingLegGroup(groupTrades));\n }\n\n // Sort chronologically\n combinedTrades.sort((a, b) => {\n const dateCompare = a.dateOpened.getTime() - b.dateOpened.getTime();\n if (dateCompare !== 0) return dateCompare;\n const timeA = a.timeOpened || \"00:00:00\";\n const timeB = b.timeOpened || \"00:00:00\";\n return timeA.localeCompare(timeB);\n });\n\n return combinedTrades;\n}\n","/**\n * Combined Trades Cache\n *\n * Caches pre-calculated combined leg group trades in IndexedDB\n * to avoid expensive recalculation on every page load.\n */\n\nimport type { CombinedTrade } from \"../utils/combine-leg-groups.ts\";\nimport {\n INDEXES,\n promisifyRequest,\n STORES,\n withReadTransaction,\n withWriteTransaction,\n} from \"./index.ts\";\nimport {\n decodeCalendarDays,\n encodeCalendarDays,\n type StoredCalendarDays,\n TRADE_DAY_FIELDS,\n type TradeDayField,\n} from \"./calendar-days.ts\";\n\n/**\n * Cache entry for combined trades\n */\ninterface CombinedTradesCache {\n id: string; // Format: `combined_trades_${blockId}`\n blockId: string;\n calculationType: \"combined_trades\";\n trades: StoredCalendarDays<CombinedTrade, TradeDayField>[];\n tradeCount: number;\n calculatedAt: Date;\n}\n\n/**\n * Generate the cache ID for a block\n */\nfunction getCacheId(blockId: string): string {\n return `combined_trades_v2_${blockId}`;\n}\n\n/**\n * Store pre-calculated combined trades for a block\n */\nexport async function storeCombinedTradesCache(\n blockId: string,\n combinedTrades: CombinedTrade[],\n): Promise<void> {\n const cacheEntry: CombinedTradesCache = {\n id: getCacheId(blockId),\n blockId,\n calculationType: \"combined_trades\",\n trades: combinedTrades.map((trade) => encodeCalendarDays(trade, TRADE_DAY_FIELDS)),\n tradeCount: combinedTrades.length,\n calculatedAt: new Date(),\n };\n\n await withWriteTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n await promisifyRequest(store.put(cacheEntry));\n });\n}\n\n/**\n * Get cached combined trades for a block\n * Returns null if cache doesn't exist\n */\nexport async function getCombinedTradesCache(blockId: string): Promise<CombinedTrade[] | null> {\n return withReadTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n const cacheId = getCacheId(blockId);\n const result = await promisifyRequest(store.get(cacheId));\n\n if (!result || result.calculationType !== \"combined_trades\") {\n return null;\n }\n\n const cache = result as CombinedTradesCache;\n\n return cache.trades.map((trade) =>\n decodeCalendarDays<CombinedTrade, TradeDayField>(trade, TRADE_DAY_FIELDS),\n );\n });\n}\n\n/**\n * Delete cached combined trades for a block\n */\nexport async function deleteCombinedTradesCache(blockId: string): Promise<void> {\n await withWriteTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n const cacheId = getCacheId(blockId);\n\n // Check if entry exists before trying to delete\n const existing = await promisifyRequest(store.get(cacheId));\n if (existing) {\n await promisifyRequest(store.delete(cacheId));\n }\n });\n}\n\n/**\n * Check if combined trades cache exists for a block\n */\nexport async function hasCombinedTradesCache(blockId: string): Promise<boolean> {\n return withReadTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n const cacheId = getCacheId(blockId);\n const result = await promisifyRequest(store.get(cacheId));\n return result?.calculationType === \"combined_trades\";\n });\n}\n\n/**\n * Invalidate all calculation caches for a block\n * (including combined trades cache)\n */\nexport async function invalidateBlockCaches(blockId: string): Promise<void> {\n await withWriteTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n const index = store.index(INDEXES.CALCULATIONS_BY_BLOCK);\n const request = index.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n request.onerror = () => reject(request.error);\n });\n });\n}\n","/**\n * Historical 3-Month Treasury Bill Rates (DTB3)\n * Source: Federal Reserve Economic Data (FRED), St. Louis Federal Reserve\n * Data series: DTB3 (Market Yield on U.S. Treasury Securities at 3-Month Constant Maturity)\n *\n * Values are annual percentages (e.g., 4.32 = 4.32% annual rate)\n * Keys are dates in YYYY-MM-DD format (US Eastern time)\n *\n * Used for calculating risk-free rate in Sharpe/Sortino ratio calculations.\n *\n * @see https://fred.stlouisfed.org/series/DTB3\n *\n * ## How to Update\n *\n * Daily DTB3 and SOFR observations are published to the rates-data branch.\n * For a reviewed release, run `node scripts/rates.mjs seed` to refresh both\n * bundled tables from that validated publication. The release workflow checks\n * bundle freshness with `node scripts/rates.mjs seed-check --max-lag-days 10`.\n *\n * Note: Rates are only available for trading days (weekdays, excluding market holidays).\n * The lookup utility handles weekends/holidays by finding the most recent prior trading day.\n */\nexport const TREASURY_RATES: Record<string, number> = {\n \"2013-01-02\": 0.08,\n \"2013-01-03\": 0.08,\n \"2013-01-04\": 0.07,\n \"2013-01-07\": 0.07,\n \"2013-01-08\": 0.07,\n \"2013-01-09\": 0.06,\n \"2013-01-10\": 0.06,\n \"2013-01-11\": 0.07,\n \"2013-01-14\": 0.08,\n \"2013-01-15\": 0.09,\n \"2013-01-16\": 0.08,\n \"2013-01-17\": 0.07,\n \"2013-01-18\": 0.08,\n \"2013-01-22\": 0.08,\n \"2013-01-23\": 0.08,\n \"2013-01-24\": 0.08,\n \"2013-01-25\": 0.08,\n \"2013-01-28\": 0.07,\n \"2013-01-29\": 0.07,\n \"2013-01-30\": 0.07,\n \"2013-01-31\": 0.07,\n \"2013-02-01\": 0.06,\n \"2013-02-04\": 0.07,\n \"2013-02-05\": 0.07,\n \"2013-02-06\": 0.07,\n \"2013-02-07\": 0.07,\n \"2013-02-08\": 0.07,\n \"2013-02-11\": 0.09,\n \"2013-02-12\": 0.09,\n \"2013-02-13\": 0.1,\n \"2013-02-14\": 0.11,\n \"2013-02-15\": 0.1,\n \"2013-02-19\": 0.12,\n \"2013-02-20\": 0.12,\n \"2013-02-21\": 0.13,\n \"2013-02-22\": 0.13,\n \"2013-02-25\": 0.12,\n \"2013-02-26\": 0.14,\n \"2013-02-27\": 0.11,\n \"2013-02-28\": 0.11,\n \"2013-03-01\": 0.11,\n \"2013-03-04\": 0.11,\n \"2013-03-05\": 0.08,\n \"2013-03-06\": 0.1,\n \"2013-03-07\": 0.1,\n \"2013-03-08\": 0.1,\n \"2013-03-11\": 0.1,\n \"2013-03-12\": 0.1,\n \"2013-03-13\": 0.09,\n \"2013-03-14\": 0.1,\n \"2013-03-15\": 0.09,\n \"2013-03-18\": 0.07,\n \"2013-03-19\": 0.07,\n \"2013-03-20\": 0.07,\n \"2013-03-21\": 0.07,\n \"2013-03-22\": 0.07,\n \"2013-03-25\": 0.08,\n \"2013-03-26\": 0.07,\n \"2013-03-27\": 0.09,\n \"2013-03-28\": 0.07,\n \"2013-04-01\": 0.08,\n \"2013-04-02\": 0.07,\n \"2013-04-03\": 0.06,\n \"2013-04-04\": 0.07,\n \"2013-04-05\": 0.07,\n \"2013-04-08\": 0.07,\n \"2013-04-09\": 0.06,\n \"2013-04-10\": 0.07,\n \"2013-04-11\": 0.07,\n \"2013-04-12\": 0.06,\n \"2013-04-15\": 0.06,\n \"2013-04-16\": 0.06,\n \"2013-04-17\": 0.06,\n \"2013-04-18\": 0.05,\n \"2013-04-19\": 0.05,\n \"2013-04-22\": 0.05,\n \"2013-04-23\": 0.05,\n \"2013-04-24\": 0.06,\n \"2013-04-25\": 0.05,\n \"2013-04-26\": 0.05,\n \"2013-04-29\": 0.05,\n \"2013-04-30\": 0.05,\n \"2013-05-01\": 0.06,\n \"2013-05-02\": 0.05,\n \"2013-05-03\": 0.05,\n \"2013-05-06\": 0.04,\n \"2013-05-07\": 0.04,\n \"2013-05-08\": 0.04,\n \"2013-05-09\": 0.04,\n \"2013-05-10\": 0.04,\n \"2013-05-13\": 0.05,\n \"2013-05-14\": 0.05,\n \"2013-05-15\": 0.04,\n \"2013-05-16\": 0.03,\n \"2013-05-17\": 0.04,\n \"2013-05-20\": 0.05,\n \"2013-05-21\": 0.04,\n \"2013-05-22\": 0.04,\n \"2013-05-23\": 0.05,\n \"2013-05-24\": 0.04,\n \"2013-05-28\": 0.05,\n \"2013-05-29\": 0.05,\n \"2013-05-30\": 0.04,\n \"2013-05-31\": 0.04,\n \"2013-06-03\": 0.05,\n \"2013-06-04\": 0.04,\n \"2013-06-05\": 0.05,\n \"2013-06-06\": 0.05,\n \"2013-06-07\": 0.04,\n \"2013-06-10\": 0.05,\n \"2013-06-11\": 0.05,\n \"2013-06-12\": 0.05,\n \"2013-06-13\": 0.05,\n \"2013-06-14\": 0.05,\n \"2013-06-17\": 0.05,\n \"2013-06-18\": 0.05,\n \"2013-06-19\": 0.05,\n \"2013-06-20\": 0.05,\n \"2013-06-21\": 0.05,\n \"2013-06-24\": 0.06,\n \"2013-06-25\": 0.06,\n \"2013-06-26\": 0.06,\n \"2013-06-27\": 0.06,\n \"2013-06-28\": 0.04,\n \"2013-07-01\": 0.04,\n \"2013-07-02\": 0.03,\n \"2013-07-03\": 0.05,\n \"2013-07-05\": 0.04,\n \"2013-07-08\": 0.05,\n \"2013-07-09\": 0.04,\n \"2013-07-10\": 0.04,\n \"2013-07-11\": 0.04,\n \"2013-07-12\": 0.04,\n \"2013-07-15\": 0.04,\n \"2013-07-16\": 0.03,\n \"2013-07-17\": 0.03,\n \"2013-07-18\": 0.03,\n \"2013-07-19\": 0.03,\n \"2013-07-22\": 0.04,\n \"2013-07-23\": 0.02,\n \"2013-07-24\": 0.03,\n \"2013-07-25\": 0.02,\n \"2013-07-26\": 0.03,\n \"2013-07-29\": 0.03,\n \"2013-07-30\": 0.04,\n \"2013-07-31\": 0.04,\n \"2013-08-01\": 0.04,\n \"2013-08-02\": 0.04,\n \"2013-08-05\": 0.05,\n \"2013-08-06\": 0.04,\n \"2013-08-07\": 0.05,\n \"2013-08-08\": 0.05,\n \"2013-08-09\": 0.05,\n \"2013-08-12\": 0.06,\n \"2013-08-13\": 0.06,\n \"2013-08-14\": 0.05,\n \"2013-08-15\": 0.05,\n \"2013-08-16\": 0.05,\n \"2013-08-19\": 0.06,\n \"2013-08-20\": 0.04,\n \"2013-08-21\": 0.04,\n \"2013-08-22\": 0.03,\n \"2013-08-23\": 0.03,\n \"2013-08-26\": 0.04,\n \"2013-08-27\": 0.05,\n \"2013-08-28\": 0.03,\n \"2013-08-29\": 0.02,\n \"2013-08-30\": 0.03,\n \"2013-09-03\": 0.02,\n \"2013-09-04\": 0.02,\n \"2013-09-05\": 0.02,\n \"2013-09-06\": 0.02,\n \"2013-09-09\": 0.02,\n \"2013-09-10\": 0.02,\n \"2013-09-11\": 0.02,\n \"2013-09-12\": 0.01,\n \"2013-09-13\": 0.01,\n \"2013-09-16\": 0.02,\n \"2013-09-17\": 0.01,\n \"2013-09-18\": 0.01,\n \"2013-09-19\": 0.01,\n \"2013-09-20\": 0.01,\n \"2013-09-23\": 0.02,\n \"2013-09-24\": 0.02,\n \"2013-09-25\": 0.02,\n \"2013-09-26\": 0.0,\n \"2013-09-27\": 0.02,\n \"2013-09-30\": 0.02,\n \"2013-10-01\": 0.02,\n \"2013-10-02\": 0.02,\n \"2013-10-03\": 0.03,\n \"2013-10-04\": 0.03,\n \"2013-10-07\": 0.03,\n \"2013-10-08\": 0.05,\n \"2013-10-09\": 0.05,\n \"2013-10-10\": 0.05,\n \"2013-10-11\": 0.08,\n \"2013-10-15\": 0.14,\n \"2013-10-16\": 0.1,\n \"2013-10-17\": 0.05,\n \"2013-10-18\": 0.04,\n \"2013-10-21\": 0.04,\n \"2013-10-22\": 0.04,\n \"2013-10-23\": 0.04,\n \"2013-10-24\": 0.03,\n \"2013-10-25\": 0.04,\n \"2013-10-28\": 0.04,\n \"2013-10-29\": 0.04,\n \"2013-10-30\": 0.04,\n \"2013-10-31\": 0.04,\n \"2013-11-01\": 0.04,\n \"2013-11-04\": 0.05,\n \"2013-11-05\": 0.05,\n \"2013-11-06\": 0.05,\n \"2013-11-07\": 0.05,\n \"2013-11-08\": 0.06,\n \"2013-11-12\": 0.08,\n \"2013-11-13\": 0.08,\n \"2013-11-14\": 0.08,\n \"2013-11-15\": 0.08,\n \"2013-11-18\": 0.09,\n \"2013-11-19\": 0.08,\n \"2013-11-20\": 0.08,\n \"2013-11-21\": 0.07,\n \"2013-11-22\": 0.07,\n \"2013-11-25\": 0.08,\n \"2013-11-26\": 0.07,\n \"2013-11-27\": 0.07,\n \"2013-11-29\": 0.06,\n \"2013-12-02\": 0.05,\n \"2013-12-03\": 0.06,\n \"2013-12-04\": 0.06,\n \"2013-12-05\": 0.06,\n \"2013-12-06\": 0.06,\n \"2013-12-09\": 0.07,\n \"2013-12-10\": 0.07,\n \"2013-12-11\": 0.07,\n \"2013-12-12\": 0.07,\n \"2013-12-13\": 0.07,\n \"2013-12-16\": 0.07,\n \"2013-12-17\": 0.07,\n \"2013-12-18\": 0.07,\n \"2013-12-19\": 0.06,\n \"2013-12-20\": 0.07,\n \"2013-12-23\": 0.07,\n \"2013-12-24\": 0.07,\n \"2013-12-26\": 0.07,\n \"2013-12-27\": 0.07,\n \"2013-12-30\": 0.07,\n \"2013-12-31\": 0.07,\n \"2014-01-02\": 0.07,\n \"2014-01-03\": 0.07,\n \"2014-01-06\": 0.05,\n \"2014-01-07\": 0.04,\n \"2014-01-08\": 0.05,\n \"2014-01-09\": 0.04,\n \"2014-01-10\": 0.05,\n \"2014-01-13\": 0.03,\n \"2014-01-14\": 0.04,\n \"2014-01-15\": 0.04,\n \"2014-01-16\": 0.04,\n \"2014-01-17\": 0.05,\n \"2014-01-21\": 0.04,\n \"2014-01-22\": 0.04,\n \"2014-01-23\": 0.04,\n \"2014-01-24\": 0.04,\n \"2014-01-27\": 0.05,\n \"2014-01-28\": 0.05,\n \"2014-01-29\": 0.04,\n \"2014-01-30\": 0.02,\n \"2014-01-31\": 0.02,\n \"2014-02-03\": 0.05,\n \"2014-02-04\": 0.06,\n \"2014-02-05\": 0.07,\n \"2014-02-06\": 0.07,\n \"2014-02-07\": 0.08,\n \"2014-02-10\": 0.07,\n \"2014-02-11\": 0.05,\n \"2014-02-12\": 0.05,\n \"2014-02-13\": 0.03,\n \"2014-02-14\": 0.02,\n \"2014-02-18\": 0.05,\n \"2014-02-19\": 0.06,\n \"2014-02-20\": 0.05,\n \"2014-02-21\": 0.05,\n \"2014-02-24\": 0.05,\n \"2014-02-25\": 0.05,\n \"2014-02-26\": 0.05,\n \"2014-02-27\": 0.04,\n \"2014-02-28\": 0.05,\n \"2014-03-03\": 0.05,\n \"2014-03-04\": 0.05,\n \"2014-03-05\": 0.06,\n \"2014-03-06\": 0.05,\n \"2014-03-07\": 0.06,\n \"2014-03-10\": 0.05,\n \"2014-03-11\": 0.05,\n \"2014-03-12\": 0.05,\n \"2014-03-13\": 0.05,\n \"2014-03-14\": 0.05,\n \"2014-03-17\": 0.06,\n \"2014-03-18\": 0.05,\n \"2014-03-19\": 0.06,\n \"2014-03-20\": 0.06,\n \"2014-03-21\": 0.06,\n \"2014-03-24\": 0.06,\n \"2014-03-25\": 0.05,\n \"2014-03-26\": 0.05,\n \"2014-03-27\": 0.04,\n \"2014-03-28\": 0.04,\n \"2014-03-31\": 0.05,\n \"2014-04-01\": 0.04,\n \"2014-04-02\": 0.02,\n \"2014-04-03\": 0.02,\n \"2014-04-04\": 0.03,\n \"2014-04-07\": 0.03,\n \"2014-04-08\": 0.03,\n \"2014-04-09\": 0.04,\n \"2014-04-10\": 0.04,\n \"2014-04-11\": 0.04,\n \"2014-04-14\": 0.04,\n \"2014-04-15\": 0.04,\n \"2014-04-16\": 0.04,\n \"2014-04-17\": 0.03,\n \"2014-04-21\": 0.04,\n \"2014-04-22\": 0.03,\n \"2014-04-23\": 0.02,\n \"2014-04-24\": 0.01,\n \"2014-04-25\": 0.03,\n \"2014-04-28\": 0.03,\n \"2014-04-29\": 0.02,\n \"2014-04-30\": 0.03,\n \"2014-05-01\": 0.03,\n \"2014-05-02\": 0.02,\n \"2014-05-05\": 0.03,\n \"2014-05-06\": 0.03,\n \"2014-05-07\": 0.03,\n \"2014-05-08\": 0.03,\n \"2014-05-09\": 0.03,\n \"2014-05-12\": 0.03,\n \"2014-05-13\": 0.03,\n \"2014-05-14\": 0.03,\n \"2014-05-15\": 0.03,\n \"2014-05-16\": 0.03,\n \"2014-05-19\": 0.03,\n \"2014-05-20\": 0.03,\n \"2014-05-21\": 0.04,\n \"2014-05-22\": 0.03,\n \"2014-05-23\": 0.04,\n \"2014-05-27\": 0.04,\n \"2014-05-28\": 0.04,\n \"2014-05-29\": 0.04,\n \"2014-05-30\": 0.04,\n \"2014-06-02\": 0.04,\n \"2014-06-03\": 0.04,\n \"2014-06-04\": 0.04,\n \"2014-06-05\": 0.04,\n \"2014-06-06\": 0.04,\n \"2014-06-09\": 0.04,\n \"2014-06-10\": 0.04,\n \"2014-06-11\": 0.04,\n \"2014-06-12\": 0.04,\n \"2014-06-13\": 0.04,\n \"2014-06-16\": 0.04,\n \"2014-06-17\": 0.04,\n \"2014-06-18\": 0.03,\n \"2014-06-19\": 0.02,\n \"2014-06-20\": 0.02,\n \"2014-06-23\": 0.03,\n \"2014-06-24\": 0.03,\n \"2014-06-25\": 0.03,\n \"2014-06-26\": 0.04,\n \"2014-06-27\": 0.03,\n \"2014-06-30\": 0.04,\n \"2014-07-01\": 0.02,\n \"2014-07-02\": 0.02,\n \"2014-07-03\": 0.01,\n \"2014-07-07\": 0.04,\n \"2014-07-08\": 0.03,\n \"2014-07-09\": 0.03,\n \"2014-07-10\": 0.02,\n \"2014-07-11\": 0.02,\n \"2014-07-14\": 0.03,\n \"2014-07-15\": 0.02,\n \"2014-07-16\": 0.02,\n \"2014-07-17\": 0.02,\n \"2014-07-18\": 0.02,\n \"2014-07-21\": 0.03,\n \"2014-07-22\": 0.03,\n \"2014-07-23\": 0.03,\n \"2014-07-24\": 0.03,\n \"2014-07-25\": 0.03,\n \"2014-07-28\": 0.04,\n \"2014-07-29\": 0.02,\n \"2014-07-30\": 0.04,\n \"2014-07-31\": 0.03,\n \"2014-08-01\": 0.03,\n \"2014-08-04\": 0.04,\n \"2014-08-05\": 0.03,\n \"2014-08-06\": 0.03,\n \"2014-08-07\": 0.03,\n \"2014-08-08\": 0.03,\n \"2014-08-11\": 0.04,\n \"2014-08-12\": 0.03,\n \"2014-08-13\": 0.04,\n \"2014-08-14\": 0.04,\n \"2014-08-15\": 0.03,\n \"2014-08-18\": 0.03,\n \"2014-08-19\": 0.03,\n \"2014-08-20\": 0.04,\n \"2014-08-21\": 0.02,\n \"2014-08-22\": 0.03,\n \"2014-08-25\": 0.04,\n \"2014-08-26\": 0.03,\n \"2014-08-27\": 0.04,\n \"2014-08-28\": 0.03,\n \"2014-08-29\": 0.03,\n \"2014-09-02\": 0.03,\n \"2014-09-03\": 0.03,\n \"2014-09-04\": 0.03,\n \"2014-09-05\": 0.03,\n \"2014-09-08\": 0.02,\n \"2014-09-09\": 0.02,\n \"2014-09-10\": 0.02,\n \"2014-09-11\": 0.02,\n \"2014-09-12\": 0.02,\n \"2014-09-15\": 0.02,\n \"2014-09-16\": 0.02,\n \"2014-09-17\": 0.02,\n \"2014-09-18\": 0.02,\n \"2014-09-19\": 0.02,\n \"2014-09-22\": 0.01,\n \"2014-09-23\": 0.01,\n \"2014-09-24\": 0.02,\n \"2014-09-25\": 0.01,\n \"2014-09-26\": 0.01,\n \"2014-09-29\": 0.02,\n \"2014-09-30\": 0.02,\n \"2014-10-01\": 0.02,\n \"2014-10-02\": 0.01,\n \"2014-10-03\": 0.01,\n \"2014-10-06\": 0.02,\n \"2014-10-07\": 0.02,\n \"2014-10-08\": 0.01,\n \"2014-10-09\": 0.01,\n \"2014-10-10\": 0.01,\n \"2014-10-14\": 0.02,\n \"2014-10-15\": 0.02,\n \"2014-10-16\": 0.03,\n \"2014-10-17\": 0.02,\n \"2014-10-20\": 0.02,\n \"2014-10-21\": 0.02,\n \"2014-10-22\": 0.02,\n \"2014-10-23\": 0.01,\n \"2014-10-24\": 0.01,\n \"2014-10-27\": 0.02,\n \"2014-10-28\": 0.02,\n \"2014-10-29\": 0.03,\n \"2014-10-30\": 0.01,\n \"2014-10-31\": 0.01,\n \"2014-11-03\": 0.02,\n \"2014-11-04\": 0.03,\n \"2014-11-05\": 0.03,\n \"2014-11-06\": 0.03,\n \"2014-11-07\": 0.03,\n \"2014-11-10\": 0.02,\n \"2014-11-12\": 0.02,\n \"2014-11-13\": 0.02,\n \"2014-11-14\": 0.02,\n \"2014-11-17\": 0.03,\n \"2014-11-18\": 0.02,\n \"2014-11-19\": 0.01,\n \"2014-11-20\": 0.02,\n \"2014-11-21\": 0.01,\n \"2014-11-24\": 0.02,\n \"2014-11-25\": 0.02,\n \"2014-11-26\": 0.02,\n \"2014-11-28\": 0.02,\n \"2014-12-01\": 0.03,\n \"2014-12-02\": 0.03,\n \"2014-12-03\": 0.01,\n \"2014-12-04\": 0.02,\n \"2014-12-05\": 0.02,\n \"2014-12-08\": 0.03,\n \"2014-12-09\": 0.04,\n \"2014-12-10\": 0.03,\n \"2014-12-11\": 0.03,\n \"2014-12-12\": 0.02,\n \"2014-12-15\": 0.04,\n \"2014-12-16\": 0.03,\n \"2014-12-17\": 0.03,\n \"2014-12-18\": 0.04,\n \"2014-12-19\": 0.04,\n \"2014-12-22\": 0.05,\n \"2014-12-23\": 0.03,\n \"2014-12-24\": 0.01,\n \"2014-12-26\": 0.01,\n \"2014-12-29\": 0.03,\n \"2014-12-30\": 0.03,\n \"2014-12-31\": 0.04,\n \"2015-01-02\": 0.02,\n \"2015-01-05\": 0.03,\n \"2015-01-06\": 0.03,\n \"2015-01-07\": 0.03,\n \"2015-01-08\": 0.03,\n \"2015-01-09\": 0.02,\n \"2015-01-12\": 0.03,\n \"2015-01-13\": 0.03,\n \"2015-01-14\": 0.04,\n \"2015-01-15\": 0.03,\n \"2015-01-16\": 0.03,\n \"2015-01-20\": 0.03,\n \"2015-01-21\": 0.03,\n \"2015-01-22\": 0.03,\n \"2015-01-23\": 0.02,\n \"2015-01-26\": 0.03,\n \"2015-01-27\": 0.02,\n \"2015-01-28\": 0.02,\n \"2015-01-29\": 0.03,\n \"2015-01-30\": 0.02,\n \"2015-02-02\": 0.02,\n \"2015-02-03\": 0.02,\n \"2015-02-04\": 0.01,\n \"2015-02-05\": 0.02,\n \"2015-02-06\": 0.02,\n \"2015-02-09\": 0.01,\n \"2015-02-10\": 0.01,\n \"2015-02-11\": 0.01,\n \"2015-02-12\": 0.02,\n \"2015-02-13\": 0.01,\n \"2015-02-17\": 0.02,\n \"2015-02-18\": 0.02,\n \"2015-02-19\": 0.02,\n \"2015-02-20\": 0.02,\n \"2015-02-23\": 0.02,\n \"2015-02-24\": 0.02,\n \"2015-02-25\": 0.02,\n \"2015-02-26\": 0.03,\n \"2015-02-27\": 0.02,\n \"2015-03-02\": 0.02,\n \"2015-03-03\": 0.02,\n \"2015-03-04\": 0.01,\n \"2015-03-05\": 0.02,\n \"2015-03-06\": 0.01,\n \"2015-03-09\": 0.02,\n \"2015-03-10\": 0.02,\n \"2015-03-11\": 0.03,\n \"2015-03-12\": 0.03,\n \"2015-03-13\": 0.03,\n \"2015-03-16\": 0.05,\n \"2015-03-17\": 0.05,\n \"2015-03-18\": 0.03,\n \"2015-03-19\": 0.03,\n \"2015-03-20\": 0.01,\n \"2015-03-23\": 0.03,\n \"2015-03-24\": 0.02,\n \"2015-03-25\": 0.04,\n \"2015-03-26\": 0.03,\n \"2015-03-27\": 0.04,\n \"2015-03-30\": 0.04,\n \"2015-03-31\": 0.03,\n \"2015-04-01\": 0.03,\n \"2015-04-02\": 0.02,\n \"2015-04-03\": 0.02,\n \"2015-04-06\": 0.03,\n \"2015-04-07\": 0.02,\n \"2015-04-08\": 0.03,\n \"2015-04-09\": 0.03,\n \"2015-04-10\": 0.02,\n \"2015-04-13\": 0.03,\n \"2015-04-14\": 0.02,\n \"2015-04-15\": 0.02,\n \"2015-04-16\": 0.02,\n \"2015-04-17\": 0.01,\n \"2015-04-20\": 0.03,\n \"2015-04-21\": 0.03,\n \"2015-04-22\": 0.03,\n \"2015-04-23\": 0.03,\n \"2015-04-24\": 0.03,\n \"2015-04-27\": 0.02,\n \"2015-04-28\": 0.02,\n \"2015-04-29\": 0.01,\n \"2015-04-30\": 0.01,\n \"2015-05-01\": 0.01,\n \"2015-05-04\": 0.02,\n \"2015-05-05\": 0.01,\n \"2015-05-06\": 0.02,\n \"2015-05-07\": 0.01,\n \"2015-05-08\": 0.01,\n \"2015-05-11\": 0.02,\n \"2015-05-12\": 0.03,\n \"2015-05-13\": 0.02,\n \"2015-05-14\": 0.01,\n \"2015-05-15\": 0.02,\n \"2015-05-18\": 0.02,\n \"2015-05-19\": 0.02,\n \"2015-05-20\": 0.02,\n \"2015-05-21\": 0.02,\n \"2015-05-22\": 0.02,\n \"2015-05-26\": 0.02,\n \"2015-05-27\": 0.01,\n \"2015-05-28\": 0.01,\n \"2015-05-29\": 0.01,\n \"2015-06-01\": 0.02,\n \"2015-06-02\": 0.01,\n \"2015-06-03\": 0.02,\n \"2015-06-04\": 0.02,\n \"2015-06-05\": 0.03,\n \"2015-06-08\": 0.02,\n \"2015-06-09\": 0.02,\n \"2015-06-10\": 0.02,\n \"2015-06-11\": 0.01,\n \"2015-06-12\": 0.02,\n \"2015-06-15\": 0.02,\n \"2015-06-16\": 0.01,\n \"2015-06-17\": 0.01,\n \"2015-06-18\": 0.01,\n \"2015-06-19\": 0.01,\n \"2015-06-22\": 0.01,\n \"2015-06-23\": 0.01,\n \"2015-06-24\": 0.01,\n \"2015-06-25\": 0.01,\n \"2015-06-26\": 0.01,\n \"2015-06-29\": 0.02,\n \"2015-06-30\": 0.01,\n \"2015-07-01\": 0.01,\n \"2015-07-02\": 0.01,\n \"2015-07-06\": 0.02,\n \"2015-07-07\": 0.02,\n \"2015-07-08\": 0.02,\n \"2015-07-09\": 0.03,\n \"2015-07-10\": 0.01,\n \"2015-07-13\": 0.02,\n \"2015-07-14\": 0.01,\n \"2015-07-15\": 0.02,\n \"2015-07-16\": 0.02,\n \"2015-07-17\": 0.03,\n \"2015-07-20\": 0.04,\n \"2015-07-21\": 0.03,\n \"2015-07-22\": 0.04,\n \"2015-07-23\": 0.03,\n \"2015-07-24\": 0.04,\n \"2015-07-27\": 0.05,\n \"2015-07-28\": 0.05,\n \"2015-07-29\": 0.06,\n \"2015-07-30\": 0.07,\n \"2015-07-31\": 0.08,\n \"2015-08-03\": 0.08,\n \"2015-08-04\": 0.08,\n \"2015-08-05\": 0.08,\n \"2015-08-06\": 0.04,\n \"2015-08-07\": 0.06,\n \"2015-08-10\": 0.12,\n \"2015-08-11\": 0.1,\n \"2015-08-12\": 0.1,\n \"2015-08-13\": 0.1,\n \"2015-08-14\": 0.09,\n \"2015-08-17\": 0.1,\n \"2015-08-18\": 0.07,\n \"2015-08-19\": 0.05,\n \"2015-08-20\": 0.02,\n \"2015-08-21\": 0.03,\n \"2015-08-24\": 0.06,\n \"2015-08-25\": 0.07,\n \"2015-08-26\": 0.06,\n \"2015-08-27\": 0.06,\n \"2015-08-28\": 0.06,\n \"2015-08-31\": 0.08,\n \"2015-09-01\": 0.03,\n \"2015-09-02\": 0.03,\n \"2015-09-03\": 0.02,\n \"2015-09-04\": 0.02,\n \"2015-09-08\": 0.06,\n \"2015-09-09\": 0.03,\n \"2015-09-10\": 0.02,\n \"2015-09-11\": 0.04,\n \"2015-09-14\": 0.07,\n \"2015-09-15\": 0.07,\n \"2015-09-16\": 0.06,\n \"2015-09-17\": 0.01,\n \"2015-09-18\": -0.01,\n \"2015-09-21\": 0.01,\n \"2015-09-22\": -0.01,\n \"2015-09-23\": 0.01,\n \"2015-09-24\": 0.01,\n \"2015-09-25\": -0.01,\n \"2015-09-28\": 0.01,\n \"2015-09-29\": 0.01,\n \"2015-09-30\": -0.01,\n \"2015-10-01\": -0.02,\n \"2015-10-02\": 0.0,\n \"2015-10-05\": 0.01,\n \"2015-10-06\": 0.0,\n \"2015-10-07\": 0.0,\n \"2015-10-08\": -0.01,\n \"2015-10-09\": 0.01,\n \"2015-10-13\": 0.01,\n \"2015-10-14\": 0.0,\n \"2015-10-15\": 0.01,\n \"2015-10-16\": 0.01,\n \"2015-10-19\": 0.02,\n \"2015-10-20\": 0.02,\n \"2015-10-21\": 0.01,\n \"2015-10-22\": 0.0,\n \"2015-10-23\": 0.01,\n \"2015-10-26\": 0.02,\n \"2015-10-27\": 0.03,\n \"2015-10-28\": 0.04,\n \"2015-10-29\": 0.07,\n \"2015-10-30\": 0.08,\n \"2015-11-02\": 0.08,\n \"2015-11-03\": 0.06,\n \"2015-11-04\": 0.05,\n \"2015-11-05\": 0.05,\n \"2015-11-06\": 0.08,\n \"2015-11-09\": 0.14,\n \"2015-11-10\": 0.13,\n \"2015-11-12\": 0.14,\n \"2015-11-13\": 0.13,\n \"2015-11-16\": 0.15,\n \"2015-11-17\": 0.14,\n \"2015-11-18\": 0.12,\n \"2015-11-19\": 0.11,\n \"2015-11-20\": 0.11,\n \"2015-11-23\": 0.14,\n \"2015-11-24\": 0.16,\n \"2015-11-25\": 0.19,\n \"2015-11-27\": 0.17,\n \"2015-11-30\": 0.22,\n \"2015-12-01\": 0.21,\n \"2015-12-02\": 0.21,\n \"2015-12-03\": 0.21,\n \"2015-12-04\": 0.22,\n \"2015-12-07\": 0.29,\n \"2015-12-08\": 0.27,\n \"2015-12-09\": 0.26,\n \"2015-12-10\": 0.24,\n \"2015-12-11\": 0.22,\n \"2015-12-14\": 0.26,\n \"2015-12-15\": 0.25,\n \"2015-12-16\": 0.27,\n \"2015-12-17\": 0.23,\n \"2015-12-18\": 0.19,\n \"2015-12-21\": 0.24,\n \"2015-12-22\": 0.21,\n \"2015-12-23\": 0.2,\n \"2015-12-24\": 0.2,\n \"2015-12-28\": 0.23,\n \"2015-12-29\": 0.23,\n \"2015-12-30\": 0.21,\n \"2015-12-31\": 0.16,\n \"2016-01-04\": 0.22,\n \"2016-01-05\": 0.2,\n \"2016-01-06\": 0.21,\n \"2016-01-07\": 0.2,\n \"2016-01-08\": 0.2,\n \"2016-01-11\": 0.21,\n \"2016-01-12\": 0.21,\n \"2016-01-13\": 0.22,\n \"2016-01-14\": 0.25,\n \"2016-01-15\": 0.23,\n \"2016-01-19\": 0.26,\n \"2016-01-20\": 0.26,\n \"2016-01-21\": 0.28,\n \"2016-01-22\": 0.3,\n \"2016-01-25\": 0.31,\n \"2016-01-26\": 0.31,\n \"2016-01-27\": 0.32,\n \"2016-01-28\": 0.34,\n \"2016-01-29\": 0.32,\n \"2016-02-01\": 0.35,\n \"2016-02-02\": 0.34,\n \"2016-02-03\": 0.33,\n \"2016-02-04\": 0.29,\n \"2016-02-05\": 0.29,\n \"2016-02-08\": 0.32,\n \"2016-02-09\": 0.3,\n \"2016-02-10\": 0.31,\n \"2016-02-11\": 0.28,\n \"2016-02-12\": 0.29,\n \"2016-02-16\": 0.3,\n \"2016-02-17\": 0.3,\n \"2016-02-18\": 0.3,\n \"2016-02-19\": 0.3,\n \"2016-02-22\": 0.33,\n \"2016-02-23\": 0.32,\n \"2016-02-24\": 0.33,\n \"2016-02-25\": 0.32,\n \"2016-02-26\": 0.32,\n \"2016-02-29\": 0.33,\n \"2016-03-01\": 0.33,\n \"2016-03-02\": 0.35,\n \"2016-03-03\": 0.27,\n \"2016-03-04\": 0.28,\n \"2016-03-07\": 0.32,\n \"2016-03-08\": 0.29,\n \"2016-03-09\": 0.3,\n \"2016-03-10\": 0.31,\n \"2016-03-11\": 0.32,\n \"2016-03-14\": 0.34,\n \"2016-03-15\": 0.34,\n \"2016-03-16\": 0.31,\n \"2016-03-17\": 0.29,\n \"2016-03-18\": 0.29,\n \"2016-03-21\": 0.31,\n \"2016-03-22\": 0.3,\n \"2016-03-23\": 0.3,\n \"2016-03-24\": 0.29,\n \"2016-03-28\": 0.29,\n \"2016-03-29\": 0.23,\n \"2016-03-30\": 0.2,\n \"2016-03-31\": 0.21,\n \"2016-04-01\": 0.23,\n \"2016-04-04\": 0.23,\n \"2016-04-05\": 0.23,\n \"2016-04-06\": 0.23,\n \"2016-04-07\": 0.23,\n \"2016-04-08\": 0.23,\n \"2016-04-11\": 0.23,\n \"2016-04-12\": 0.22,\n \"2016-04-13\": 0.23,\n \"2016-04-14\": 0.22,\n \"2016-04-15\": 0.22,\n \"2016-04-18\": 0.22,\n \"2016-04-19\": 0.21,\n \"2016-04-20\": 0.23,\n \"2016-04-21\": 0.23,\n \"2016-04-22\": 0.23,\n \"2016-04-25\": 0.25,\n \"2016-04-26\": 0.24,\n \"2016-04-27\": 0.24,\n \"2016-04-28\": 0.22,\n \"2016-04-29\": 0.22,\n \"2016-05-02\": 0.22,\n \"2016-05-03\": 0.21,\n \"2016-05-04\": 0.19,\n \"2016-05-05\": 0.2,\n \"2016-05-06\": 0.19,\n \"2016-05-09\": 0.24,\n \"2016-05-10\": 0.24,\n \"2016-05-11\": 0.26,\n \"2016-05-12\": 0.27,\n \"2016-05-13\": 0.28,\n \"2016-05-16\": 0.28,\n \"2016-05-17\": 0.28,\n \"2016-05-18\": 0.3,\n \"2016-05-19\": 0.3,\n \"2016-05-20\": 0.32,\n \"2016-05-23\": 0.35,\n \"2016-05-24\": 0.35,\n \"2016-05-25\": 0.33,\n \"2016-05-26\": 0.3,\n \"2016-05-27\": 0.31,\n \"2016-05-31\": 0.34,\n \"2016-06-01\": 0.3,\n \"2016-06-02\": 0.28,\n \"2016-06-03\": 0.29,\n \"2016-06-06\": 0.28,\n \"2016-06-07\": 0.28,\n \"2016-06-08\": 0.24,\n \"2016-06-09\": 0.25,\n \"2016-06-10\": 0.25,\n \"2016-06-13\": 0.27,\n \"2016-06-14\": 0.27,\n \"2016-06-15\": 0.26,\n \"2016-06-16\": 0.27,\n \"2016-06-17\": 0.26,\n \"2016-06-20\": 0.28,\n \"2016-06-21\": 0.27,\n \"2016-06-22\": 0.27,\n \"2016-06-23\": 0.3,\n \"2016-06-24\": 0.26,\n \"2016-06-27\": 0.27,\n \"2016-06-28\": 0.26,\n \"2016-06-29\": 0.26,\n \"2016-06-30\": 0.26,\n \"2016-07-01\": 0.27,\n \"2016-07-05\": 0.28,\n \"2016-07-06\": 0.27,\n \"2016-07-07\": 0.29,\n \"2016-07-08\": 0.27,\n \"2016-07-11\": 0.31,\n \"2016-07-12\": 0.29,\n \"2016-07-13\": 0.31,\n \"2016-07-14\": 0.31,\n \"2016-07-15\": 0.31,\n \"2016-07-18\": 0.32,\n \"2016-07-19\": 0.31,\n \"2016-07-20\": 0.32,\n \"2016-07-21\": 0.31,\n \"2016-07-22\": 0.32,\n \"2016-07-25\": 0.32,\n \"2016-07-26\": 0.31,\n \"2016-07-27\": 0.31,\n \"2016-07-28\": 0.25,\n \"2016-07-29\": 0.27,\n \"2016-08-01\": 0.29,\n \"2016-08-02\": 0.29,\n \"2016-08-03\": 0.28,\n \"2016-08-04\": 0.26,\n \"2016-08-05\": 0.27,\n \"2016-08-08\": 0.31,\n \"2016-08-09\": 0.29,\n \"2016-08-10\": 0.28,\n \"2016-08-11\": 0.28,\n \"2016-08-12\": 0.28,\n \"2016-08-15\": 0.31,\n \"2016-08-16\": 0.27,\n \"2016-08-17\": 0.3,\n \"2016-08-18\": 0.29,\n \"2016-08-19\": 0.29,\n \"2016-08-22\": 0.29,\n \"2016-08-23\": 0.3,\n \"2016-08-24\": 0.31,\n \"2016-08-25\": 0.33,\n \"2016-08-26\": 0.33,\n \"2016-08-29\": 0.33,\n \"2016-08-30\": 0.33,\n \"2016-08-31\": 0.33,\n \"2016-09-01\": 0.33,\n \"2016-09-02\": 0.32,\n \"2016-09-06\": 0.32,\n \"2016-09-07\": 0.34,\n \"2016-09-08\": 0.34,\n \"2016-09-09\": 0.34,\n \"2016-09-12\": 0.37,\n \"2016-09-13\": 0.36,\n \"2016-09-14\": 0.33,\n \"2016-09-15\": 0.29,\n \"2016-09-16\": 0.29,\n \"2016-09-19\": 0.3,\n \"2016-09-20\": 0.3,\n \"2016-09-21\": 0.22,\n \"2016-09-22\": 0.18,\n \"2016-09-23\": 0.18,\n \"2016-09-26\": 0.25,\n \"2016-09-27\": 0.26,\n \"2016-09-28\": 0.27,\n \"2016-09-29\": 0.26,\n \"2016-09-30\": 0.28,\n \"2016-10-03\": 0.32,\n \"2016-10-04\": 0.33,\n \"2016-10-05\": 0.32,\n \"2016-10-06\": 0.32,\n \"2016-10-07\": 0.32,\n \"2016-10-11\": 0.35,\n \"2016-10-12\": 0.36,\n \"2016-10-13\": 0.29,\n \"2016-10-14\": 0.31,\n \"2016-10-17\": 0.34,\n \"2016-10-18\": 0.34,\n \"2016-10-19\": 0.34,\n \"2016-10-20\": 0.34,\n \"2016-10-21\": 0.33,\n \"2016-10-24\": 0.33,\n \"2016-10-25\": 0.34,\n \"2016-10-26\": 0.33,\n \"2016-10-27\": 0.29,\n \"2016-10-28\": 0.29,\n \"2016-10-31\": 0.34,\n \"2016-11-01\": 0.35,\n \"2016-11-02\": 0.36,\n \"2016-11-03\": 0.37,\n \"2016-11-04\": 0.37,\n \"2016-11-07\": 0.41,\n \"2016-11-08\": 0.43,\n \"2016-11-09\": 0.44,\n \"2016-11-10\": 0.47,\n \"2016-11-14\": 0.54,\n \"2016-11-15\": 0.5,\n \"2016-11-16\": 0.46,\n \"2016-11-17\": 0.43,\n \"2016-11-18\": 0.43,\n \"2016-11-21\": 0.46,\n \"2016-11-22\": 0.48,\n \"2016-11-23\": 0.5,\n \"2016-11-25\": 0.48,\n \"2016-11-28\": 0.48,\n \"2016-11-29\": 0.48,\n \"2016-11-30\": 0.48,\n \"2016-12-01\": 0.47,\n \"2016-12-02\": 0.48,\n \"2016-12-05\": 0.49,\n \"2016-12-06\": 0.49,\n \"2016-12-07\": 0.51,\n \"2016-12-08\": 0.5,\n \"2016-12-09\": 0.53,\n \"2016-12-12\": 0.51,\n \"2016-12-13\": 0.54,\n \"2016-12-14\": 0.54,\n \"2016-12-15\": 0.5,\n \"2016-12-16\": 0.5,\n \"2016-12-19\": 0.52,\n \"2016-12-20\": 0.52,\n \"2016-12-21\": 0.51,\n \"2016-12-22\": 0.5,\n \"2016-12-23\": 0.51,\n \"2016-12-27\": 0.51,\n \"2016-12-28\": 0.52,\n \"2016-12-29\": 0.46,\n \"2016-12-30\": 0.5,\n \"2017-01-03\": 0.53,\n \"2017-01-04\": 0.52,\n \"2017-01-05\": 0.51,\n \"2017-01-06\": 0.52,\n \"2017-01-09\": 0.5,\n \"2017-01-10\": 0.51,\n \"2017-01-11\": 0.51,\n \"2017-01-12\": 0.51,\n \"2017-01-13\": 0.52,\n \"2017-01-17\": 0.54,\n \"2017-01-18\": 0.52,\n \"2017-01-19\": 0.51,\n \"2017-01-20\": 0.49,\n \"2017-01-23\": 0.51,\n \"2017-01-24\": 0.5,\n \"2017-01-25\": 0.49,\n \"2017-01-26\": 0.5,\n \"2017-01-27\": 0.51,\n \"2017-01-30\": 0.51,\n \"2017-01-31\": 0.52,\n \"2017-02-01\": 0.5,\n \"2017-02-02\": 0.51,\n \"2017-02-03\": 0.5,\n \"2017-02-06\": 0.53,\n \"2017-02-07\": 0.53,\n \"2017-02-08\": 0.53,\n \"2017-02-09\": 0.53,\n \"2017-02-10\": 0.54,\n \"2017-02-13\": 0.52,\n \"2017-02-14\": 0.54,\n \"2017-02-15\": 0.53,\n \"2017-02-16\": 0.52,\n \"2017-02-17\": 0.52,\n \"2017-02-21\": 0.53,\n \"2017-02-22\": 0.52,\n \"2017-02-23\": 0.51,\n \"2017-02-24\": 0.51,\n \"2017-02-27\": 0.5,\n \"2017-02-28\": 0.53,\n \"2017-03-01\": 0.62,\n \"2017-03-02\": 0.66,\n \"2017-03-03\": 0.7,\n \"2017-03-06\": 0.73,\n \"2017-03-07\": 0.75,\n \"2017-03-08\": 0.72,\n \"2017-03-09\": 0.72,\n \"2017-03-10\": 0.73,\n \"2017-03-13\": 0.78,\n \"2017-03-14\": 0.77,\n \"2017-03-15\": 0.72,\n \"2017-03-16\": 0.72,\n \"2017-03-17\": 0.72,\n \"2017-03-20\": 0.75,\n \"2017-03-21\": 0.76,\n \"2017-03-22\": 0.76,\n \"2017-03-23\": 0.75,\n \"2017-03-24\": 0.77,\n \"2017-03-27\": 0.77,\n \"2017-03-28\": 0.77,\n \"2017-03-29\": 0.77,\n \"2017-03-30\": 0.77,\n \"2017-03-31\": 0.75,\n \"2017-04-03\": 0.78,\n \"2017-04-04\": 0.78,\n \"2017-04-05\": 0.79,\n \"2017-04-06\": 0.78,\n \"2017-04-07\": 0.81,\n \"2017-04-10\": 0.81,\n \"2017-04-11\": 0.81,\n \"2017-04-12\": 0.8,\n \"2017-04-13\": 0.8,\n \"2017-04-17\": 0.82,\n \"2017-04-18\": 0.81,\n \"2017-04-19\": 0.8,\n \"2017-04-20\": 0.78,\n \"2017-04-21\": 0.78,\n \"2017-04-24\": 0.8,\n \"2017-04-25\": 0.81,\n \"2017-04-26\": 0.82,\n \"2017-04-27\": 0.8,\n \"2017-04-28\": 0.79,\n \"2017-05-01\": 0.82,\n \"2017-05-02\": 0.81,\n \"2017-05-03\": 0.84,\n \"2017-05-04\": 0.84,\n \"2017-05-05\": 0.88,\n \"2017-05-08\": 0.9,\n \"2017-05-09\": 0.9,\n \"2017-05-10\": 0.89,\n \"2017-05-11\": 0.87,\n \"2017-05-12\": 0.86,\n \"2017-05-15\": 0.89,\n \"2017-05-16\": 0.89,\n \"2017-05-17\": 0.89,\n \"2017-05-18\": 0.91,\n \"2017-05-19\": 0.9,\n \"2017-05-22\": 0.92,\n \"2017-05-23\": 0.91,\n \"2017-05-24\": 0.92,\n \"2017-05-25\": 0.92,\n \"2017-05-26\": 0.92,\n \"2017-05-30\": 0.92,\n \"2017-05-31\": 0.96,\n \"2017-06-01\": 0.96,\n \"2017-06-02\": 0.96,\n \"2017-06-05\": 0.95,\n \"2017-06-06\": 0.96,\n \"2017-06-07\": 0.98,\n \"2017-06-08\": 0.99,\n \"2017-06-09\": 0.99,\n \"2017-06-12\": 0.97,\n \"2017-06-13\": 0.99,\n \"2017-06-14\": 0.99,\n \"2017-06-15\": 1.0,\n \"2017-06-16\": 1.01,\n \"2017-06-19\": 1.01,\n \"2017-06-20\": 1.0,\n \"2017-06-21\": 0.97,\n \"2017-06-22\": 0.94,\n \"2017-06-23\": 0.95,\n \"2017-06-26\": 0.98,\n \"2017-06-27\": 0.99,\n \"2017-06-28\": 1.0,\n \"2017-06-29\": 1.02,\n \"2017-06-30\": 1.01,\n \"2017-07-03\": 1.04,\n \"2017-07-05\": 1.03,\n \"2017-07-06\": 1.02,\n \"2017-07-07\": 1.03,\n \"2017-07-10\": 1.03,\n \"2017-07-11\": 1.03,\n \"2017-07-12\": 1.03,\n \"2017-07-13\": 1.03,\n \"2017-07-14\": 1.02,\n \"2017-07-17\": 1.05,\n \"2017-07-18\": 1.05,\n \"2017-07-19\": 1.09,\n \"2017-07-20\": 1.13,\n \"2017-07-21\": 1.14,\n \"2017-07-24\": 1.15,\n \"2017-07-25\": 1.16,\n \"2017-07-26\": 1.11,\n \"2017-07-27\": 1.09,\n \"2017-07-28\": 1.06,\n \"2017-07-31\": 1.05,\n \"2017-08-01\": 1.06,\n \"2017-08-02\": 1.06,\n \"2017-08-03\": 1.06,\n \"2017-08-04\": 1.06,\n \"2017-08-07\": 1.01,\n \"2017-08-08\": 1.04,\n \"2017-08-09\": 1.04,\n \"2017-08-10\": 1.03,\n \"2017-08-11\": 1.01,\n \"2017-08-14\": 1.01,\n \"2017-08-15\": 1.02,\n \"2017-08-16\": 1.0,\n \"2017-08-17\": 0.98,\n \"2017-08-18\": 1.0,\n \"2017-08-21\": 0.99,\n \"2017-08-22\": 0.99,\n \"2017-08-23\": 0.98,\n \"2017-08-24\": 1.0,\n \"2017-08-25\": 1.01,\n \"2017-08-28\": 0.97,\n \"2017-08-29\": 1.01,\n \"2017-08-30\": 1.01,\n \"2017-08-31\": 0.99,\n \"2017-09-01\": 1.0,\n \"2017-09-05\": 1.01,\n \"2017-09-06\": 1.05,\n \"2017-09-07\": 1.03,\n \"2017-09-08\": 1.02,\n \"2017-09-11\": 1.04,\n \"2017-09-12\": 1.02,\n \"2017-09-13\": 1.02,\n \"2017-09-14\": 1.03,\n \"2017-09-15\": 1.03,\n \"2017-09-18\": 1.04,\n \"2017-09-19\": 1.03,\n \"2017-09-20\": 1.02,\n \"2017-09-21\": 1.02,\n \"2017-09-22\": 1.01,\n \"2017-09-25\": 1.04,\n \"2017-09-26\": 1.05,\n \"2017-09-27\": 1.05,\n \"2017-09-28\": 1.04,\n \"2017-09-29\": 1.04,\n \"2017-10-02\": 1.0,\n \"2017-10-03\": 1.05,\n \"2017-10-04\": 1.06,\n \"2017-10-05\": 1.05,\n \"2017-10-06\": 1.05,\n \"2017-10-10\": 1.06,\n \"2017-10-11\": 1.08,\n \"2017-10-12\": 1.07,\n \"2017-10-13\": 1.07,\n \"2017-10-16\": 1.09,\n \"2017-10-17\": 1.07,\n \"2017-10-18\": 1.07,\n \"2017-10-19\": 1.08,\n \"2017-10-20\": 1.09,\n \"2017-10-23\": 1.08,\n \"2017-10-24\": 1.1,\n \"2017-10-25\": 1.1,\n \"2017-10-26\": 1.09,\n \"2017-10-27\": 1.08,\n \"2017-10-30\": 1.1,\n \"2017-10-31\": 1.13,\n \"2017-11-01\": 1.16,\n \"2017-11-02\": 1.15,\n \"2017-11-03\": 1.16,\n \"2017-11-06\": 1.17,\n \"2017-11-07\": 1.2,\n \"2017-11-08\": 1.21,\n \"2017-11-09\": 1.22,\n \"2017-11-10\": 1.21,\n \"2017-11-13\": 1.22,\n \"2017-11-14\": 1.24,\n \"2017-11-15\": 1.23,\n \"2017-11-16\": 1.25,\n \"2017-11-17\": 1.26,\n \"2017-11-20\": 1.28,\n \"2017-11-21\": 1.28,\n \"2017-11-22\": 1.27,\n \"2017-11-24\": 1.26,\n \"2017-11-27\": 1.25,\n \"2017-11-28\": 1.28,\n \"2017-11-29\": 1.27,\n \"2017-11-30\": 1.25,\n \"2017-12-01\": 1.25,\n \"2017-12-04\": 1.28,\n \"2017-12-05\": 1.28,\n \"2017-12-06\": 1.28,\n \"2017-12-07\": 1.27,\n \"2017-12-08\": 1.26,\n \"2017-12-11\": 1.31,\n \"2017-12-12\": 1.32,\n \"2017-12-13\": 1.28,\n \"2017-12-14\": 1.3,\n \"2017-12-15\": 1.29,\n \"2017-12-18\": 1.36,\n \"2017-12-19\": 1.35,\n \"2017-12-20\": 1.36,\n \"2017-12-21\": 1.33,\n \"2017-12-22\": 1.31,\n \"2017-12-26\": 1.45,\n \"2017-12-27\": 1.42,\n \"2017-12-28\": 1.37,\n \"2017-12-29\": 1.37,\n \"2018-01-02\": 1.42,\n \"2018-01-03\": 1.39,\n \"2018-01-04\": 1.39,\n \"2018-01-05\": 1.37,\n \"2018-01-08\": 1.43,\n \"2018-01-09\": 1.42,\n \"2018-01-10\": 1.4,\n \"2018-01-11\": 1.41,\n \"2018-01-12\": 1.41,\n \"2018-01-16\": 1.43,\n \"2018-01-17\": 1.42,\n \"2018-01-18\": 1.43,\n \"2018-01-19\": 1.42,\n \"2018-01-22\": 1.43,\n \"2018-01-23\": 1.42,\n \"2018-01-24\": 1.41,\n \"2018-01-25\": 1.4,\n \"2018-01-26\": 1.39,\n \"2018-01-29\": 1.43,\n \"2018-01-30\": 1.42,\n \"2018-01-31\": 1.44,\n \"2018-02-01\": 1.46,\n \"2018-02-02\": 1.46,\n \"2018-02-05\": 1.49,\n \"2018-02-06\": 1.5,\n \"2018-02-07\": 1.53,\n \"2018-02-08\": 1.53,\n \"2018-02-09\": 1.53,\n \"2018-02-12\": 1.61,\n \"2018-02-13\": 1.57,\n \"2018-02-14\": 1.56,\n \"2018-02-15\": 1.56,\n \"2018-02-16\": 1.59,\n \"2018-02-20\": 1.64,\n \"2018-02-21\": 1.62,\n \"2018-02-22\": 1.61,\n \"2018-02-23\": 1.61,\n \"2018-02-26\": 1.65,\n \"2018-02-27\": 1.64,\n \"2018-02-28\": 1.63,\n \"2018-03-01\": 1.6,\n \"2018-03-02\": 1.62,\n \"2018-03-05\": 1.67,\n \"2018-03-06\": 1.65,\n \"2018-03-07\": 1.65,\n \"2018-03-08\": 1.64,\n \"2018-03-09\": 1.64,\n \"2018-03-12\": 1.68,\n \"2018-03-13\": 1.7,\n \"2018-03-14\": 1.73,\n \"2018-03-15\": 1.74,\n \"2018-03-16\": 1.75,\n \"2018-03-19\": 1.77,\n \"2018-03-20\": 1.78,\n \"2018-03-21\": 1.71,\n \"2018-03-22\": 1.69,\n \"2018-03-23\": 1.71,\n \"2018-03-26\": 1.76,\n \"2018-03-27\": 1.74,\n \"2018-03-28\": 1.7,\n \"2018-03-29\": 1.7,\n \"2018-04-02\": 1.74,\n \"2018-04-03\": 1.72,\n \"2018-04-04\": 1.68,\n \"2018-04-05\": 1.69,\n \"2018-04-06\": 1.7,\n \"2018-04-09\": 1.73,\n \"2018-04-10\": 1.71,\n \"2018-04-11\": 1.7,\n \"2018-04-12\": 1.72,\n \"2018-04-13\": 1.73,\n \"2018-04-16\": 1.76,\n \"2018-04-17\": 1.77,\n \"2018-04-18\": 1.78,\n \"2018-04-19\": 1.79,\n \"2018-04-20\": 1.78,\n \"2018-04-23\": 1.84,\n \"2018-04-24\": 1.84,\n \"2018-04-25\": 1.82,\n \"2018-04-26\": 1.79,\n \"2018-04-27\": 1.78,\n \"2018-04-30\": 1.84,\n \"2018-05-01\": 1.82,\n \"2018-05-02\": 1.81,\n \"2018-05-03\": 1.8,\n \"2018-05-04\": 1.8,\n \"2018-05-07\": 1.83,\n \"2018-05-08\": 1.84,\n \"2018-05-09\": 1.85,\n \"2018-05-10\": 1.86,\n \"2018-05-11\": 1.88,\n \"2018-05-14\": 1.9,\n \"2018-05-15\": 1.89,\n \"2018-05-16\": 1.88,\n \"2018-05-17\": 1.88,\n \"2018-05-18\": 1.87,\n \"2018-05-21\": 1.9,\n \"2018-05-22\": 1.9,\n \"2018-05-23\": 1.88,\n \"2018-05-24\": 1.87,\n \"2018-05-25\": 1.86,\n \"2018-05-29\": 1.9,\n \"2018-05-30\": 1.9,\n \"2018-05-31\": 1.89,\n \"2018-06-01\": 1.88,\n \"2018-06-04\": 1.91,\n \"2018-06-05\": 1.91,\n \"2018-06-06\": 1.91,\n \"2018-06-07\": 1.9,\n \"2018-06-08\": 1.89,\n \"2018-06-11\": 1.91,\n \"2018-06-12\": 1.89,\n \"2018-06-13\": 1.9,\n \"2018-06-14\": 1.9,\n \"2018-06-15\": 1.9,\n \"2018-06-18\": 1.91,\n \"2018-06-19\": 1.91,\n \"2018-06-20\": 1.9,\n \"2018-06-21\": 1.9,\n \"2018-06-22\": 1.89,\n \"2018-06-25\": 1.9,\n \"2018-06-26\": 1.9,\n \"2018-06-27\": 1.89,\n \"2018-06-28\": 1.89,\n \"2018-06-29\": 1.89,\n \"2018-07-02\": 1.95,\n \"2018-07-03\": 1.94,\n \"2018-07-05\": 1.92,\n \"2018-07-06\": 1.93,\n \"2018-07-09\": 1.95,\n \"2018-07-10\": 1.95,\n \"2018-07-11\": 1.93,\n \"2018-07-12\": 1.94,\n \"2018-07-13\": 1.94,\n \"2018-07-16\": 1.98,\n \"2018-07-17\": 1.98,\n \"2018-07-18\": 1.96,\n \"2018-07-19\": 1.96,\n \"2018-07-20\": 1.95,\n \"2018-07-23\": 1.96,\n \"2018-07-24\": 1.98,\n \"2018-07-25\": 1.97,\n \"2018-07-26\": 1.95,\n \"2018-07-27\": 1.96,\n \"2018-07-30\": 2.01,\n \"2018-07-31\": 1.99,\n \"2018-08-01\": 1.99,\n \"2018-08-02\": 1.98,\n \"2018-08-03\": 1.97,\n \"2018-08-06\": 2.02,\n \"2018-08-07\": 2.02,\n \"2018-08-08\": 2.02,\n \"2018-08-09\": 2.02,\n \"2018-08-10\": 2.01,\n \"2018-08-13\": 2.03,\n \"2018-08-14\": 2.04,\n \"2018-08-15\": 2.03,\n \"2018-08-16\": 2.03,\n \"2018-08-17\": 2.01,\n \"2018-08-20\": 2.03,\n \"2018-08-21\": 2.04,\n \"2018-08-22\": 2.05,\n \"2018-08-23\": 2.04,\n \"2018-08-24\": 2.05,\n \"2018-08-27\": 2.08,\n \"2018-08-28\": 2.09,\n \"2018-08-29\": 2.09,\n \"2018-08-30\": 2.07,\n \"2018-08-31\": 2.07,\n \"2018-09-04\": 2.09,\n \"2018-09-05\": 2.1,\n \"2018-09-06\": 2.09,\n \"2018-09-07\": 2.1,\n \"2018-09-10\": 2.11,\n \"2018-09-11\": 2.11,\n \"2018-09-12\": 2.12,\n \"2018-09-13\": 2.11,\n \"2018-09-14\": 2.12,\n \"2018-09-17\": 2.13,\n \"2018-09-18\": 2.13,\n \"2018-09-19\": 2.12,\n \"2018-09-20\": 2.13,\n \"2018-09-21\": 2.14,\n \"2018-09-24\": 2.18,\n \"2018-09-25\": 2.17,\n \"2018-09-26\": 2.16,\n \"2018-09-27\": 2.14,\n \"2018-09-28\": 2.15,\n \"2018-10-01\": 2.19,\n \"2018-10-02\": 2.19,\n \"2018-10-03\": 2.19,\n \"2018-10-04\": 2.18,\n \"2018-10-05\": 2.18,\n \"2018-10-09\": 2.21,\n \"2018-10-10\": 2.23,\n \"2018-10-11\": 2.22,\n \"2018-10-12\": 2.23,\n \"2018-10-15\": 2.27,\n \"2018-10-16\": 2.26,\n \"2018-10-17\": 2.27,\n \"2018-10-18\": 2.27,\n \"2018-10-19\": 2.26,\n \"2018-10-22\": 2.3,\n \"2018-10-23\": 2.29,\n \"2018-10-24\": 2.29,\n \"2018-10-25\": 2.29,\n \"2018-10-26\": 2.28,\n \"2018-10-29\": 2.3,\n \"2018-10-30\": 2.29,\n \"2018-10-31\": 2.29,\n \"2018-11-01\": 2.27,\n \"2018-11-02\": 2.28,\n \"2018-11-05\": 2.32,\n \"2018-11-06\": 2.31,\n \"2018-11-07\": 2.32,\n \"2018-11-08\": 2.3,\n \"2018-11-09\": 2.31,\n \"2018-11-13\": 2.34,\n \"2018-11-14\": 2.33,\n \"2018-11-15\": 2.32,\n \"2018-11-16\": 2.31,\n \"2018-11-19\": 2.34,\n \"2018-11-20\": 2.34,\n \"2018-11-21\": 2.36,\n \"2018-11-23\": 2.36,\n \"2018-11-26\": 2.37,\n \"2018-11-27\": 2.36,\n \"2018-11-28\": 2.35,\n \"2018-11-29\": 2.32,\n \"2018-11-30\": 2.32,\n \"2018-12-03\": 2.34,\n \"2018-12-04\": 2.38,\n \"2018-12-06\": 2.36,\n \"2018-12-07\": 2.35,\n \"2018-12-10\": 2.37,\n \"2018-12-11\": 2.37,\n \"2018-12-12\": 2.39,\n \"2018-12-13\": 2.38,\n \"2018-12-14\": 2.37,\n \"2018-12-17\": 2.36,\n \"2018-12-18\": 2.34,\n \"2018-12-19\": 2.35,\n \"2018-12-20\": 2.34,\n \"2018-12-21\": 2.34,\n \"2018-12-24\": 2.41,\n \"2018-12-26\": 2.39,\n \"2018-12-27\": 2.36,\n \"2018-12-28\": 2.35,\n \"2018-12-31\": 2.4,\n \"2019-01-02\": 2.37,\n \"2019-01-03\": 2.36,\n \"2019-01-04\": 2.37,\n \"2019-01-07\": 2.41,\n \"2019-01-08\": 2.41,\n \"2019-01-09\": 2.4,\n \"2019-01-10\": 2.38,\n \"2019-01-11\": 2.38,\n \"2019-01-14\": 2.4,\n \"2019-01-15\": 2.4,\n \"2019-01-16\": 2.38,\n \"2019-01-17\": 2.37,\n \"2019-01-18\": 2.36,\n \"2019-01-22\": 2.38,\n \"2019-01-23\": 2.36,\n \"2019-01-24\": 2.32,\n \"2019-01-25\": 2.34,\n \"2019-01-28\": 2.37,\n \"2019-01-29\": 2.37,\n \"2019-01-30\": 2.37,\n \"2019-01-31\": 2.36,\n \"2019-02-01\": 2.35,\n \"2019-02-04\": 2.37,\n \"2019-02-05\": 2.37,\n \"2019-02-06\": 2.37,\n \"2019-02-07\": 2.37,\n \"2019-02-08\": 2.38,\n \"2019-02-11\": 2.4,\n \"2019-02-12\": 2.38,\n \"2019-02-13\": 2.39,\n \"2019-02-14\": 2.38,\n \"2019-02-15\": 2.38,\n \"2019-02-19\": 2.41,\n \"2019-02-20\": 2.4,\n \"2019-02-21\": 2.4,\n \"2019-02-22\": 2.41,\n \"2019-02-25\": 2.42,\n \"2019-02-26\": 2.4,\n \"2019-02-27\": 2.4,\n \"2019-02-28\": 2.4,\n \"2019-03-01\": 2.39,\n \"2019-03-04\": 2.41,\n \"2019-03-05\": 2.41,\n \"2019-03-06\": 2.41,\n \"2019-03-07\": 2.4,\n \"2019-03-08\": 2.41,\n \"2019-03-11\": 2.41,\n \"2019-03-12\": 2.41,\n \"2019-03-13\": 2.4,\n \"2019-03-14\": 2.4,\n \"2019-03-15\": 2.4,\n \"2019-03-18\": 2.39,\n \"2019-03-19\": 2.41,\n \"2019-03-20\": 2.42,\n \"2019-03-21\": 2.43,\n \"2019-03-22\": 2.41,\n \"2019-03-25\": 2.41,\n \"2019-03-26\": 2.41,\n \"2019-03-27\": 2.39,\n \"2019-03-28\": 2.38,\n \"2019-03-29\": 2.35,\n \"2019-04-01\": 2.38,\n \"2019-04-02\": 2.37,\n \"2019-04-03\": 2.39,\n \"2019-04-04\": 2.39,\n \"2019-04-05\": 2.39,\n \"2019-04-08\": 2.38,\n \"2019-04-09\": 2.37,\n \"2019-04-10\": 2.38,\n \"2019-04-11\": 2.38,\n \"2019-04-12\": 2.39,\n \"2019-04-15\": 2.38,\n \"2019-04-16\": 2.38,\n \"2019-04-17\": 2.39,\n \"2019-04-18\": 2.37,\n \"2019-04-22\": 2.39,\n \"2019-04-23\": 2.4,\n \"2019-04-24\": 2.39,\n \"2019-04-25\": 2.38,\n \"2019-04-26\": 2.37,\n \"2019-04-29\": 2.39,\n \"2019-04-30\": 2.38,\n \"2019-05-01\": 2.38,\n \"2019-05-02\": 2.41,\n \"2019-05-03\": 2.38,\n \"2019-05-06\": 2.39,\n \"2019-05-07\": 2.38,\n \"2019-05-08\": 2.38,\n \"2019-05-09\": 2.38,\n \"2019-05-10\": 2.38,\n \"2019-05-13\": 2.36,\n \"2019-05-14\": 2.36,\n \"2019-05-15\": 2.37,\n \"2019-05-16\": 2.35,\n \"2019-05-17\": 2.34,\n \"2019-05-20\": 2.34,\n \"2019-05-21\": 2.34,\n \"2019-05-22\": 2.33,\n \"2019-05-23\": 2.32,\n \"2019-05-24\": 2.3,\n \"2019-05-28\": 2.32,\n \"2019-05-29\": 2.32,\n \"2019-05-30\": 2.33,\n \"2019-05-31\": 2.3,\n \"2019-06-03\": 2.3,\n \"2019-06-04\": 2.3,\n \"2019-06-05\": 2.3,\n \"2019-06-06\": 2.28,\n \"2019-06-07\": 2.23,\n \"2019-06-10\": 2.24,\n \"2019-06-11\": 2.22,\n \"2019-06-12\": 2.19,\n \"2019-06-13\": 2.14,\n \"2019-06-14\": 2.15,\n \"2019-06-17\": 2.18,\n \"2019-06-18\": 2.17,\n \"2019-06-19\": 2.13,\n \"2019-06-20\": 2.09,\n \"2019-06-21\": 2.07,\n \"2019-06-24\": 2.08,\n \"2019-06-25\": 2.07,\n \"2019-06-26\": 2.1,\n \"2019-06-27\": 2.09,\n \"2019-06-28\": 2.08,\n \"2019-07-01\": 2.16,\n \"2019-07-02\": 2.15,\n \"2019-07-03\": 2.16,\n \"2019-07-05\": 2.18,\n \"2019-07-08\": 2.21,\n \"2019-07-09\": 2.21,\n \"2019-07-10\": 2.15,\n \"2019-07-11\": 2.12,\n \"2019-07-12\": 2.1,\n \"2019-07-15\": 2.11,\n \"2019-07-16\": 2.1,\n \"2019-07-17\": 2.09,\n \"2019-07-18\": 2.01,\n \"2019-07-19\": 2.02,\n \"2019-07-22\": 2.04,\n \"2019-07-23\": 2.02,\n \"2019-07-24\": 2.05,\n \"2019-07-25\": 2.06,\n \"2019-07-26\": 2.08,\n \"2019-07-29\": 2.07,\n \"2019-07-30\": 2.04,\n \"2019-07-31\": 2.04,\n \"2019-08-01\": 2.03,\n \"2019-08-02\": 2.02,\n \"2019-08-05\": 2.0,\n \"2019-08-06\": 2.01,\n \"2019-08-07\": 1.98,\n \"2019-08-08\": 1.98,\n \"2019-08-09\": 1.96,\n \"2019-08-12\": 1.96,\n \"2019-08-13\": 1.96,\n \"2019-08-14\": 1.92,\n \"2019-08-15\": 1.87,\n \"2019-08-16\": 1.83,\n \"2019-08-19\": 1.9,\n \"2019-08-20\": 1.9,\n \"2019-08-21\": 1.93,\n \"2019-08-22\": 1.96,\n \"2019-08-23\": 1.93,\n \"2019-08-26\": 1.96,\n \"2019-08-27\": 1.94,\n \"2019-08-28\": 1.95,\n \"2019-08-29\": 1.95,\n \"2019-08-30\": 1.95,\n \"2019-09-03\": 1.94,\n \"2019-09-04\": 1.93,\n \"2019-09-05\": 1.93,\n \"2019-09-06\": 1.92,\n \"2019-09-09\": 1.92,\n \"2019-09-10\": 1.91,\n \"2019-09-11\": 1.92,\n \"2019-09-12\": 1.91,\n \"2019-09-13\": 1.92,\n \"2019-09-16\": 1.95,\n \"2019-09-17\": 1.95,\n \"2019-09-18\": 1.91,\n \"2019-09-19\": 1.89,\n \"2019-09-20\": 1.87,\n \"2019-09-23\": 1.9,\n \"2019-09-24\": 1.88,\n \"2019-09-25\": 1.85,\n \"2019-09-26\": 1.79,\n \"2019-09-27\": 1.76,\n \"2019-09-30\": 1.84,\n \"2019-10-01\": 1.78,\n \"2019-10-02\": 1.75,\n \"2019-10-03\": 1.67,\n \"2019-10-04\": 1.68,\n \"2019-10-07\": 1.71,\n \"2019-10-08\": 1.68,\n \"2019-10-09\": 1.66,\n \"2019-10-10\": 1.65,\n \"2019-10-11\": 1.65,\n \"2019-10-15\": 1.64,\n \"2019-10-16\": 1.63,\n \"2019-10-17\": 1.63,\n \"2019-10-18\": 1.63,\n \"2019-10-21\": 1.64,\n \"2019-10-22\": 1.62,\n \"2019-10-23\": 1.62,\n \"2019-10-24\": 1.64,\n \"2019-10-25\": 1.63,\n \"2019-10-28\": 1.62,\n \"2019-10-29\": 1.6,\n \"2019-10-30\": 1.59,\n \"2019-10-31\": 1.51,\n \"2019-11-01\": 1.49,\n \"2019-11-04\": 1.5,\n \"2019-11-05\": 1.53,\n \"2019-11-06\": 1.53,\n \"2019-11-07\": 1.53,\n \"2019-11-08\": 1.52,\n \"2019-11-12\": 1.56,\n \"2019-11-13\": 1.54,\n \"2019-11-14\": 1.54,\n \"2019-11-15\": 1.54,\n \"2019-11-18\": 1.54,\n \"2019-11-19\": 1.54,\n \"2019-11-20\": 1.54,\n \"2019-11-21\": 1.55,\n \"2019-11-22\": 1.55,\n \"2019-11-25\": 1.58,\n \"2019-11-26\": 1.57,\n \"2019-11-27\": 1.59,\n \"2019-11-29\": 1.56,\n \"2019-12-02\": 1.57,\n \"2019-12-03\": 1.54,\n \"2019-12-04\": 1.52,\n \"2019-12-05\": 1.51,\n \"2019-12-06\": 1.5,\n \"2019-12-09\": 1.51,\n \"2019-12-10\": 1.53,\n \"2019-12-11\": 1.54,\n \"2019-12-12\": 1.53,\n \"2019-12-13\": 1.54,\n \"2019-12-16\": 1.54,\n \"2019-12-17\": 1.53,\n \"2019-12-18\": 1.53,\n \"2019-12-19\": 1.54,\n \"2019-12-20\": 1.55,\n \"2019-12-23\": 1.56,\n \"2019-12-24\": 1.55,\n \"2019-12-26\": 1.55,\n \"2019-12-27\": 1.54,\n \"2019-12-30\": 1.54,\n \"2019-12-31\": 1.52,\n \"2020-01-02\": 1.51,\n \"2020-01-03\": 1.49,\n \"2020-01-06\": 1.53,\n \"2020-01-07\": 1.51,\n \"2020-01-08\": 1.51,\n \"2020-01-09\": 1.51,\n \"2020-01-10\": 1.51,\n \"2020-01-13\": 1.54,\n \"2020-01-14\": 1.54,\n \"2020-01-15\": 1.54,\n \"2020-01-16\": 1.52,\n \"2020-01-17\": 1.53,\n \"2020-01-21\": 1.53,\n \"2020-01-22\": 1.52,\n \"2020-01-23\": 1.52,\n \"2020-01-24\": 1.51,\n \"2020-01-27\": 1.52,\n \"2020-01-28\": 1.54,\n \"2020-01-29\": 1.53,\n \"2020-01-30\": 1.54,\n \"2020-01-31\": 1.52,\n \"2020-02-03\": 1.54,\n \"2020-02-04\": 1.54,\n \"2020-02-05\": 1.54,\n \"2020-02-06\": 1.54,\n \"2020-02-07\": 1.53,\n \"2020-02-10\": 1.55,\n \"2020-02-11\": 1.54,\n \"2020-02-12\": 1.55,\n \"2020-02-13\": 1.56,\n \"2020-02-14\": 1.55,\n \"2020-02-18\": 1.55,\n \"2020-02-19\": 1.55,\n \"2020-02-20\": 1.55,\n \"2020-02-21\": 1.53,\n \"2020-02-24\": 1.5,\n \"2020-02-25\": 1.5,\n \"2020-02-26\": 1.5,\n \"2020-02-27\": 1.42,\n \"2020-02-28\": 1.25,\n \"2020-03-02\": 1.1,\n \"2020-03-03\": 0.93,\n \"2020-03-04\": 0.71,\n \"2020-03-05\": 0.61,\n \"2020-03-06\": 0.45,\n \"2020-03-09\": 0.32,\n \"2020-03-10\": 0.43,\n \"2020-03-11\": 0.41,\n \"2020-03-12\": 0.33,\n \"2020-03-13\": 0.27,\n \"2020-03-16\": 0.24,\n \"2020-03-17\": 0.19,\n \"2020-03-18\": 0.02,\n \"2020-03-19\": 0.04,\n \"2020-03-20\": 0.05,\n \"2020-03-23\": 0.02,\n \"2020-03-24\": 0.01,\n \"2020-03-25\": -0.04,\n \"2020-03-26\": -0.05,\n \"2020-03-27\": 0.03,\n \"2020-03-30\": 0.12,\n \"2020-03-31\": 0.11,\n \"2020-04-01\": 0.09,\n \"2020-04-02\": 0.09,\n \"2020-04-03\": 0.1,\n \"2020-04-06\": 0.15,\n \"2020-04-07\": 0.14,\n \"2020-04-08\": 0.22,\n \"2020-04-09\": 0.25,\n \"2020-04-13\": 0.26,\n \"2020-04-14\": 0.2,\n \"2020-04-15\": 0.14,\n \"2020-04-16\": 0.14,\n \"2020-04-17\": 0.12,\n \"2020-04-20\": 0.12,\n \"2020-04-21\": 0.11,\n \"2020-04-22\": 0.12,\n \"2020-04-23\": 0.11,\n \"2020-04-24\": 0.12,\n \"2020-04-27\": 0.12,\n \"2020-04-28\": 0.11,\n \"2020-04-29\": 0.1,\n \"2020-04-30\": 0.09,\n \"2020-05-01\": 0.12,\n \"2020-05-04\": 0.13,\n \"2020-05-05\": 0.13,\n \"2020-05-06\": 0.12,\n \"2020-05-07\": 0.11,\n \"2020-05-08\": 0.12,\n \"2020-05-11\": 0.12,\n \"2020-05-12\": 0.13,\n \"2020-05-13\": 0.13,\n \"2020-05-14\": 0.12,\n \"2020-05-15\": 0.12,\n \"2020-05-18\": 0.13,\n \"2020-05-19\": 0.13,\n \"2020-05-20\": 0.12,\n \"2020-05-21\": 0.12,\n \"2020-05-22\": 0.12,\n \"2020-05-26\": 0.14,\n \"2020-05-27\": 0.15,\n \"2020-05-28\": 0.15,\n \"2020-05-29\": 0.14,\n \"2020-06-01\": 0.14,\n \"2020-06-02\": 0.15,\n \"2020-06-03\": 0.16,\n \"2020-06-04\": 0.15,\n \"2020-06-05\": 0.15,\n \"2020-06-08\": 0.17,\n \"2020-06-09\": 0.19,\n \"2020-06-10\": 0.17,\n \"2020-06-11\": 0.17,\n \"2020-06-12\": 0.16,\n \"2020-06-15\": 0.18,\n \"2020-06-16\": 0.17,\n \"2020-06-17\": 0.17,\n \"2020-06-18\": 0.16,\n \"2020-06-19\": 0.15,\n \"2020-06-22\": 0.16,\n \"2020-06-23\": 0.16,\n \"2020-06-24\": 0.15,\n \"2020-06-25\": 0.16,\n \"2020-06-26\": 0.14,\n \"2020-06-29\": 0.14,\n \"2020-06-30\": 0.16,\n \"2020-07-01\": 0.14,\n \"2020-07-02\": 0.14,\n \"2020-07-06\": 0.15,\n \"2020-07-07\": 0.15,\n \"2020-07-08\": 0.15,\n \"2020-07-09\": 0.13,\n \"2020-07-10\": 0.13,\n \"2020-07-13\": 0.14,\n \"2020-07-14\": 0.15,\n \"2020-07-15\": 0.16,\n \"2020-07-16\": 0.11,\n \"2020-07-17\": 0.11,\n \"2020-07-20\": 0.13,\n \"2020-07-21\": 0.13,\n \"2020-07-22\": 0.13,\n \"2020-07-23\": 0.12,\n \"2020-07-24\": 0.11,\n \"2020-07-27\": 0.11,\n \"2020-07-28\": 0.11,\n \"2020-07-29\": 0.11,\n \"2020-07-30\": 0.09,\n \"2020-07-31\": 0.09,\n \"2020-08-03\": 0.1,\n \"2020-08-04\": 0.09,\n \"2020-08-05\": 0.1,\n \"2020-08-06\": 0.1,\n \"2020-08-07\": 0.1,\n \"2020-08-10\": 0.11,\n \"2020-08-11\": 0.11,\n \"2020-08-12\": 0.11,\n \"2020-08-13\": 0.1,\n \"2020-08-14\": 0.1,\n \"2020-08-17\": 0.1,\n \"2020-08-18\": 0.09,\n \"2020-08-19\": 0.11,\n \"2020-08-20\": 0.11,\n \"2020-08-21\": 0.1,\n \"2020-08-24\": 0.12,\n \"2020-08-25\": 0.11,\n \"2020-08-26\": 0.11,\n \"2020-08-27\": 0.11,\n \"2020-08-28\": 0.1,\n \"2020-08-31\": 0.11,\n \"2020-09-01\": 0.12,\n \"2020-09-02\": 0.12,\n \"2020-09-03\": 0.11,\n \"2020-09-04\": 0.11,\n \"2020-09-08\": 0.13,\n \"2020-09-09\": 0.12,\n \"2020-09-10\": 0.12,\n \"2020-09-11\": 0.11,\n \"2020-09-14\": 0.11,\n \"2020-09-15\": 0.11,\n \"2020-09-16\": 0.12,\n \"2020-09-17\": 0.09,\n \"2020-09-18\": 0.1,\n \"2020-09-21\": 0.1,\n \"2020-09-22\": 0.1,\n \"2020-09-23\": 0.11,\n \"2020-09-24\": 0.1,\n \"2020-09-25\": 0.1,\n \"2020-09-28\": 0.11,\n \"2020-09-29\": 0.09,\n \"2020-09-30\": 0.1,\n \"2020-10-01\": 0.09,\n \"2020-10-02\": 0.09,\n \"2020-10-05\": 0.1,\n \"2020-10-06\": 0.1,\n \"2020-10-07\": 0.1,\n \"2020-10-08\": 0.09,\n \"2020-10-09\": 0.1,\n \"2020-10-13\": 0.11,\n \"2020-10-14\": 0.12,\n \"2020-10-15\": 0.11,\n \"2020-10-16\": 0.11,\n \"2020-10-19\": 0.11,\n \"2020-10-20\": 0.1,\n \"2020-10-21\": 0.1,\n \"2020-10-22\": 0.09,\n \"2020-10-23\": 0.1,\n \"2020-10-26\": 0.11,\n \"2020-10-27\": 0.1,\n \"2020-10-28\": 0.1,\n \"2020-10-29\": 0.09,\n \"2020-10-30\": 0.09,\n \"2020-11-02\": 0.09,\n \"2020-11-03\": 0.1,\n \"2020-11-04\": 0.1,\n \"2020-11-05\": 0.1,\n \"2020-11-06\": 0.1,\n \"2020-11-09\": 0.11,\n \"2020-11-10\": 0.1,\n \"2020-11-12\": 0.1,\n \"2020-11-13\": 0.09,\n \"2020-11-16\": 0.09,\n \"2020-11-17\": 0.09,\n \"2020-11-18\": 0.09,\n \"2020-11-19\": 0.07,\n \"2020-11-20\": 0.07,\n \"2020-11-23\": 0.08,\n \"2020-11-24\": 0.09,\n \"2020-11-25\": 0.09,\n \"2020-11-27\": 0.09,\n \"2020-11-30\": 0.08,\n \"2020-12-01\": 0.09,\n \"2020-12-02\": 0.09,\n \"2020-12-03\": 0.08,\n \"2020-12-04\": 0.09,\n \"2020-12-07\": 0.08,\n \"2020-12-08\": 0.09,\n \"2020-12-09\": 0.08,\n \"2020-12-10\": 0.08,\n \"2020-12-11\": 0.08,\n \"2020-12-14\": 0.09,\n \"2020-12-15\": 0.08,\n \"2020-12-16\": 0.09,\n \"2020-12-17\": 0.08,\n \"2020-12-18\": 0.08,\n \"2020-12-21\": 0.09,\n \"2020-12-22\": 0.09,\n \"2020-12-23\": 0.09,\n \"2020-12-24\": 0.09,\n \"2020-12-28\": 0.11,\n \"2020-12-29\": 0.1,\n \"2020-12-30\": 0.08,\n \"2020-12-31\": 0.09,\n \"2021-01-04\": 0.09,\n \"2021-01-05\": 0.09,\n \"2021-01-06\": 0.09,\n \"2021-01-07\": 0.09,\n \"2021-01-08\": 0.08,\n \"2021-01-11\": 0.08,\n \"2021-01-12\": 0.09,\n \"2021-01-13\": 0.09,\n \"2021-01-14\": 0.09,\n \"2021-01-15\": 0.09,\n \"2021-01-19\": 0.09,\n \"2021-01-20\": 0.08,\n \"2021-01-21\": 0.09,\n \"2021-01-22\": 0.08,\n \"2021-01-25\": 0.09,\n \"2021-01-26\": 0.07,\n \"2021-01-27\": 0.08,\n \"2021-01-28\": 0.07,\n \"2021-01-29\": 0.06,\n \"2021-02-01\": 0.07,\n \"2021-02-02\": 0.07,\n \"2021-02-03\": 0.04,\n \"2021-02-04\": 0.04,\n \"2021-02-05\": 0.03,\n \"2021-02-08\": 0.05,\n \"2021-02-09\": 0.04,\n \"2021-02-10\": 0.05,\n \"2021-02-11\": 0.05,\n \"2021-02-12\": 0.04,\n \"2021-02-16\": 0.04,\n \"2021-02-17\": 0.04,\n \"2021-02-18\": 0.03,\n \"2021-02-19\": 0.04,\n \"2021-02-22\": 0.03,\n \"2021-02-23\": 0.04,\n \"2021-02-24\": 0.03,\n \"2021-02-25\": 0.04,\n \"2021-02-26\": 0.04,\n \"2021-03-01\": 0.05,\n \"2021-03-02\": 0.04,\n \"2021-03-03\": 0.05,\n \"2021-03-04\": 0.04,\n \"2021-03-05\": 0.04,\n \"2021-03-08\": 0.05,\n \"2021-03-09\": 0.05,\n \"2021-03-10\": 0.04,\n \"2021-03-11\": 0.04,\n \"2021-03-12\": 0.04,\n \"2021-03-15\": 0.04,\n \"2021-03-16\": 0.02,\n \"2021-03-17\": 0.02,\n \"2021-03-18\": 0.01,\n \"2021-03-19\": 0.01,\n \"2021-03-22\": 0.03,\n \"2021-03-23\": 0.01,\n \"2021-03-24\": 0.02,\n \"2021-03-25\": 0.02,\n \"2021-03-26\": 0.02,\n \"2021-03-29\": 0.03,\n \"2021-03-30\": 0.02,\n \"2021-03-31\": 0.03,\n \"2021-04-01\": 0.02,\n \"2021-04-02\": 0.02,\n \"2021-04-05\": 0.03,\n \"2021-04-06\": 0.02,\n \"2021-04-07\": 0.02,\n \"2021-04-08\": 0.01,\n \"2021-04-09\": 0.02,\n \"2021-04-12\": 0.02,\n \"2021-04-13\": 0.03,\n \"2021-04-14\": 0.02,\n \"2021-04-15\": 0.02,\n \"2021-04-16\": 0.02,\n \"2021-04-19\": 0.02,\n \"2021-04-20\": 0.03,\n \"2021-04-21\": 0.03,\n \"2021-04-22\": 0.03,\n \"2021-04-23\": 0.03,\n \"2021-04-26\": 0.03,\n \"2021-04-27\": 0.01,\n \"2021-04-28\": 0.01,\n \"2021-04-29\": 0.01,\n \"2021-04-30\": 0.01,\n \"2021-05-03\": 0.04,\n \"2021-05-04\": 0.02,\n \"2021-05-05\": 0.02,\n \"2021-05-06\": 0.02,\n \"2021-05-07\": 0.02,\n \"2021-05-10\": 0.02,\n \"2021-05-11\": 0.01,\n \"2021-05-12\": 0.02,\n \"2021-05-13\": 0.02,\n \"2021-05-14\": 0.01,\n \"2021-05-17\": 0.02,\n \"2021-05-18\": 0.02,\n \"2021-05-19\": 0.01,\n \"2021-05-20\": 0.01,\n \"2021-05-21\": 0.01,\n \"2021-05-24\": 0.02,\n \"2021-05-25\": 0.02,\n \"2021-05-26\": 0.02,\n \"2021-05-27\": 0.02,\n \"2021-05-28\": 0.01,\n \"2021-06-01\": 0.02,\n \"2021-06-02\": 0.02,\n \"2021-06-03\": 0.02,\n \"2021-06-04\": 0.02,\n \"2021-06-07\": 0.02,\n \"2021-06-08\": 0.02,\n \"2021-06-09\": 0.03,\n \"2021-06-10\": 0.03,\n \"2021-06-11\": 0.03,\n \"2021-06-14\": 0.03,\n \"2021-06-15\": 0.03,\n \"2021-06-16\": 0.04,\n \"2021-06-17\": 0.04,\n \"2021-06-18\": 0.05,\n \"2021-06-21\": 0.05,\n \"2021-06-22\": 0.04,\n \"2021-06-23\": 0.05,\n \"2021-06-24\": 0.05,\n \"2021-06-25\": 0.06,\n \"2021-06-28\": 0.05,\n \"2021-06-29\": 0.04,\n \"2021-06-30\": 0.05,\n \"2021-07-01\": 0.05,\n \"2021-07-02\": 0.05,\n \"2021-07-06\": 0.05,\n \"2021-07-07\": 0.05,\n \"2021-07-08\": 0.06,\n \"2021-07-09\": 0.06,\n \"2021-07-12\": 0.05,\n \"2021-07-13\": 0.05,\n \"2021-07-14\": 0.06,\n \"2021-07-15\": 0.05,\n \"2021-07-16\": 0.05,\n \"2021-07-19\": 0.05,\n \"2021-07-20\": 0.05,\n \"2021-07-21\": 0.05,\n \"2021-07-22\": 0.05,\n \"2021-07-23\": 0.05,\n \"2021-07-26\": 0.05,\n \"2021-07-27\": 0.05,\n \"2021-07-28\": 0.05,\n \"2021-07-29\": 0.06,\n \"2021-07-30\": 0.06,\n \"2021-08-02\": 0.05,\n \"2021-08-03\": 0.05,\n \"2021-08-04\": 0.05,\n \"2021-08-05\": 0.05,\n \"2021-08-06\": 0.06,\n \"2021-08-09\": 0.06,\n \"2021-08-10\": 0.05,\n \"2021-08-11\": 0.05,\n \"2021-08-12\": 0.06,\n \"2021-08-13\": 0.06,\n \"2021-08-16\": 0.06,\n \"2021-08-17\": 0.07,\n \"2021-08-18\": 0.07,\n \"2021-08-19\": 0.06,\n \"2021-08-20\": 0.05,\n \"2021-08-23\": 0.05,\n \"2021-08-24\": 0.05,\n \"2021-08-25\": 0.06,\n \"2021-08-26\": 0.05,\n \"2021-08-27\": 0.05,\n \"2021-08-30\": 0.05,\n \"2021-08-31\": 0.04,\n \"2021-09-01\": 0.05,\n \"2021-09-02\": 0.05,\n \"2021-09-03\": 0.05,\n \"2021-09-07\": 0.05,\n \"2021-09-08\": 0.05,\n \"2021-09-09\": 0.04,\n \"2021-09-10\": 0.05,\n \"2021-09-13\": 0.06,\n \"2021-09-14\": 0.04,\n \"2021-09-15\": 0.04,\n \"2021-09-16\": 0.04,\n \"2021-09-17\": 0.04,\n \"2021-09-20\": 0.04,\n \"2021-09-21\": 0.03,\n \"2021-09-22\": 0.03,\n \"2021-09-23\": 0.03,\n \"2021-09-24\": 0.03,\n \"2021-09-27\": 0.04,\n \"2021-09-28\": 0.04,\n \"2021-09-29\": 0.04,\n \"2021-09-30\": 0.04,\n \"2021-10-01\": 0.04,\n \"2021-10-04\": 0.04,\n \"2021-10-05\": 0.04,\n \"2021-10-06\": 0.04,\n \"2021-10-07\": 0.05,\n \"2021-10-08\": 0.05,\n \"2021-10-12\": 0.06,\n \"2021-10-13\": 0.05,\n \"2021-10-14\": 0.05,\n \"2021-10-15\": 0.05,\n \"2021-10-18\": 0.06,\n \"2021-10-19\": 0.05,\n \"2021-10-20\": 0.05,\n \"2021-10-21\": 0.06,\n \"2021-10-22\": 0.06,\n \"2021-10-25\": 0.06,\n \"2021-10-26\": 0.06,\n \"2021-10-27\": 0.06,\n \"2021-10-28\": 0.06,\n \"2021-10-29\": 0.05,\n \"2021-11-01\": 0.05,\n \"2021-11-02\": 0.05,\n \"2021-11-03\": 0.05,\n \"2021-11-04\": 0.04,\n \"2021-11-05\": 0.05,\n \"2021-11-08\": 0.06,\n \"2021-11-09\": 0.04,\n \"2021-11-10\": 0.05,\n \"2021-11-12\": 0.05,\n \"2021-11-15\": 0.05,\n \"2021-11-16\": 0.05,\n \"2021-11-17\": 0.05,\n \"2021-11-18\": 0.05,\n \"2021-11-19\": 0.05,\n \"2021-11-22\": 0.05,\n \"2021-11-23\": 0.06,\n \"2021-11-24\": 0.06,\n \"2021-11-26\": 0.06,\n \"2021-11-29\": 0.06,\n \"2021-11-30\": 0.05,\n \"2021-12-01\": 0.06,\n \"2021-12-02\": 0.05,\n \"2021-12-03\": 0.06,\n \"2021-12-06\": 0.06,\n \"2021-12-07\": 0.06,\n \"2021-12-08\": 0.07,\n \"2021-12-09\": 0.06,\n \"2021-12-10\": 0.06,\n \"2021-12-13\": 0.05,\n \"2021-12-14\": 0.05,\n \"2021-12-15\": 0.06,\n \"2021-12-16\": 0.05,\n \"2021-12-17\": 0.05,\n \"2021-12-20\": 0.07,\n \"2021-12-21\": 0.07,\n \"2021-12-22\": 0.08,\n \"2021-12-23\": 0.08,\n \"2021-12-27\": 0.06,\n \"2021-12-28\": 0.06,\n \"2021-12-29\": 0.05,\n \"2021-12-30\": 0.05,\n \"2021-12-31\": 0.06,\n \"2022-01-03\": 0.09,\n \"2022-01-04\": 0.08,\n \"2022-01-05\": 0.09,\n \"2022-01-06\": 0.1,\n \"2022-01-07\": 0.1,\n \"2022-01-10\": 0.13,\n \"2022-01-11\": 0.12,\n \"2022-01-12\": 0.12,\n \"2022-01-13\": 0.12,\n \"2022-01-14\": 0.13,\n \"2022-01-18\": 0.17,\n \"2022-01-19\": 0.17,\n \"2022-01-20\": 0.18,\n \"2022-01-21\": 0.17,\n \"2022-01-24\": 0.2,\n \"2022-01-25\": 0.2,\n \"2022-01-26\": 0.19,\n \"2022-01-27\": 0.2,\n \"2022-01-28\": 0.19,\n \"2022-01-31\": 0.24,\n \"2022-02-01\": 0.2,\n \"2022-02-02\": 0.2,\n \"2022-02-03\": 0.21,\n \"2022-02-04\": 0.23,\n \"2022-02-07\": 0.28,\n \"2022-02-08\": 0.27,\n \"2022-02-09\": 0.27,\n \"2022-02-10\": 0.41,\n \"2022-02-11\": 0.37,\n \"2022-02-14\": 0.45,\n \"2022-02-15\": 0.41,\n \"2022-02-16\": 0.39,\n \"2022-02-17\": 0.37,\n \"2022-02-18\": 0.35,\n \"2022-02-22\": 0.39,\n \"2022-02-23\": 0.36,\n \"2022-02-24\": 0.33,\n \"2022-02-25\": 0.33,\n \"2022-02-28\": 0.37,\n \"2022-03-01\": 0.32,\n \"2022-03-02\": 0.33,\n \"2022-03-03\": 0.37,\n \"2022-03-04\": 0.33,\n \"2022-03-07\": 0.38,\n \"2022-03-08\": 0.36,\n \"2022-03-09\": 0.38,\n \"2022-03-10\": 0.38,\n \"2022-03-11\": 0.39,\n \"2022-03-14\": 0.45,\n \"2022-03-15\": 0.46,\n \"2022-03-16\": 0.43,\n \"2022-03-17\": 0.4,\n \"2022-03-18\": 0.41,\n \"2022-03-21\": 0.55,\n \"2022-03-22\": 0.51,\n \"2022-03-23\": 0.5,\n \"2022-03-24\": 0.5,\n \"2022-03-25\": 0.53,\n \"2022-03-28\": 0.6,\n \"2022-03-29\": 0.56,\n \"2022-03-30\": 0.55,\n \"2022-03-31\": 0.51,\n \"2022-04-01\": 0.52,\n \"2022-04-04\": 0.67,\n \"2022-04-05\": 0.65,\n \"2022-04-06\": 0.67,\n \"2022-04-07\": 0.68,\n \"2022-04-08\": 0.69,\n \"2022-04-11\": 0.78,\n \"2022-04-12\": 0.74,\n \"2022-04-13\": 0.75,\n \"2022-04-14\": 0.78,\n \"2022-04-18\": 0.82,\n \"2022-04-19\": 0.82,\n \"2022-04-20\": 0.82,\n \"2022-04-21\": 0.82,\n \"2022-04-22\": 0.82,\n \"2022-04-25\": 0.93,\n \"2022-04-26\": 0.84,\n \"2022-04-27\": 0.82,\n \"2022-04-28\": 0.81,\n \"2022-04-29\": 0.83,\n \"2022-05-02\": 0.9,\n \"2022-05-03\": 0.9,\n \"2022-05-04\": 0.88,\n \"2022-05-05\": 0.84,\n \"2022-05-06\": 0.84,\n \"2022-05-09\": 0.92,\n \"2022-05-10\": 0.89,\n \"2022-05-11\": 0.9,\n \"2022-05-12\": 0.95,\n \"2022-05-13\": 1.01,\n \"2022-05-16\": 1.07,\n \"2022-05-17\": 1.06,\n \"2022-05-18\": 1.02,\n \"2022-05-19\": 1.04,\n \"2022-05-20\": 1.01,\n \"2022-05-23\": 1.07,\n \"2022-05-24\": 1.05,\n \"2022-05-25\": 1.05,\n \"2022-05-26\": 1.06,\n \"2022-05-27\": 1.06,\n \"2022-05-31\": 1.13,\n \"2022-06-01\": 1.12,\n \"2022-06-02\": 1.13,\n \"2022-06-03\": 1.17,\n \"2022-06-06\": 1.23,\n \"2022-06-07\": 1.24,\n \"2022-06-08\": 1.25,\n \"2022-06-09\": 1.26,\n \"2022-06-10\": 1.34,\n \"2022-06-13\": 1.69,\n \"2022-06-14\": 1.78,\n \"2022-06-15\": 1.69,\n \"2022-06-16\": 1.54,\n \"2022-06-17\": 1.58,\n \"2022-06-21\": 1.66,\n \"2022-06-22\": 1.57,\n \"2022-06-23\": 1.59,\n \"2022-06-24\": 1.66,\n \"2022-06-27\": 1.75,\n \"2022-06-28\": 1.75,\n \"2022-06-29\": 1.73,\n \"2022-06-30\": 1.66,\n \"2022-07-01\": 1.66,\n \"2022-07-05\": 1.86,\n \"2022-07-06\": 1.85,\n \"2022-07-07\": 1.89,\n \"2022-07-08\": 1.91,\n \"2022-07-11\": 2.13,\n \"2022-07-12\": 2.16,\n \"2022-07-13\": 2.33,\n \"2022-07-14\": 2.33,\n \"2022-07-15\": 2.29,\n \"2022-07-18\": 2.44,\n \"2022-07-19\": 2.46,\n \"2022-07-20\": 2.44,\n \"2022-07-21\": 2.4,\n \"2022-07-22\": 2.41,\n \"2022-07-25\": 2.55,\n \"2022-07-26\": 2.48,\n \"2022-07-27\": 2.37,\n \"2022-07-28\": 2.35,\n \"2022-07-29\": 2.34,\n \"2022-08-01\": 2.48,\n \"2022-08-02\": 2.48,\n \"2022-08-03\": 2.44,\n \"2022-08-04\": 2.41,\n \"2022-08-05\": 2.48,\n \"2022-08-08\": 2.57,\n \"2022-08-09\": 2.58,\n \"2022-08-10\": 2.56,\n \"2022-08-11\": 2.52,\n \"2022-08-12\": 2.53,\n \"2022-08-15\": 2.63,\n \"2022-08-16\": 2.61,\n \"2022-08-17\": 2.59,\n \"2022-08-18\": 2.61,\n \"2022-08-19\": 2.64,\n \"2022-08-22\": 2.74,\n \"2022-08-23\": 2.71,\n \"2022-08-24\": 2.73,\n \"2022-08-25\": 2.78,\n \"2022-08-26\": 2.78,\n \"2022-08-29\": 2.89,\n \"2022-08-30\": 2.88,\n \"2022-08-31\": 2.87,\n \"2022-09-01\": 2.88,\n \"2022-09-02\": 2.85,\n \"2022-09-06\": 2.96,\n \"2022-09-07\": 2.98,\n \"2022-09-08\": 2.97,\n \"2022-09-09\": 2.98,\n \"2022-09-12\": 3.09,\n \"2022-09-13\": 3.19,\n \"2022-09-14\": 3.14,\n \"2022-09-15\": 3.12,\n \"2022-09-16\": 3.1,\n \"2022-09-19\": 3.29,\n \"2022-09-20\": 3.26,\n \"2022-09-21\": 3.21,\n \"2022-09-22\": 3.19,\n \"2022-09-23\": 3.12,\n \"2022-09-26\": 3.3,\n \"2022-09-27\": 3.26,\n \"2022-09-28\": 3.29,\n \"2022-09-29\": 3.26,\n \"2022-09-30\": 3.22,\n \"2022-10-03\": 3.34,\n \"2022-10-04\": 3.32,\n \"2022-10-05\": 3.33,\n \"2022-10-06\": 3.32,\n \"2022-10-07\": 3.31,\n \"2022-10-11\": 3.53,\n \"2022-10-12\": 3.56,\n \"2022-10-13\": 3.64,\n \"2022-10-14\": 3.65,\n \"2022-10-17\": 3.82,\n \"2022-10-18\": 3.89,\n \"2022-10-19\": 3.91,\n \"2022-10-20\": 3.91,\n \"2022-10-21\": 3.9,\n \"2022-10-24\": 4.0,\n \"2022-10-25\": 3.97,\n \"2022-10-26\": 3.94,\n \"2022-10-27\": 3.95,\n \"2022-10-28\": 3.99,\n \"2022-10-31\": 4.06,\n \"2022-11-01\": 4.06,\n \"2022-11-02\": 4.04,\n \"2022-11-03\": 4.06,\n \"2022-11-04\": 4.02,\n \"2022-11-07\": 4.12,\n \"2022-11-08\": 4.1,\n \"2022-11-09\": 4.11,\n \"2022-11-10\": 4.09,\n \"2022-11-14\": 4.16,\n \"2022-11-15\": 4.14,\n \"2022-11-16\": 4.14,\n \"2022-11-17\": 4.13,\n \"2022-11-18\": 4.15,\n \"2022-11-21\": 4.23,\n \"2022-11-22\": 4.21,\n \"2022-11-23\": 4.21,\n \"2022-11-25\": 4.22,\n \"2022-11-28\": 4.3,\n \"2022-11-29\": 4.27,\n \"2022-11-30\": 4.27,\n \"2022-12-01\": 4.22,\n \"2022-12-02\": 4.22,\n \"2022-12-05\": 4.27,\n \"2022-12-06\": 4.27,\n \"2022-12-07\": 4.2,\n \"2022-12-08\": 4.17,\n \"2022-12-09\": 4.19,\n \"2022-12-12\": 4.29,\n \"2022-12-13\": 4.26,\n \"2022-12-14\": 4.23,\n \"2022-12-15\": 4.22,\n \"2022-12-16\": 4.2,\n \"2022-12-19\": 4.28,\n \"2022-12-20\": 4.25,\n \"2022-12-21\": 4.22,\n \"2022-12-22\": 4.24,\n \"2022-12-23\": 4.23,\n \"2022-12-27\": 4.35,\n \"2022-12-28\": 4.35,\n \"2022-12-29\": 4.34,\n \"2022-12-30\": 4.3,\n \"2023-01-03\": 4.4,\n \"2023-01-04\": 4.41,\n \"2023-01-05\": 4.51,\n \"2023-01-06\": 4.51,\n \"2023-01-09\": 4.55,\n \"2023-01-10\": 4.57,\n \"2023-01-11\": 4.57,\n \"2023-01-12\": 4.5,\n \"2023-01-13\": 4.51,\n \"2023-01-17\": 4.56,\n \"2023-01-18\": 4.54,\n \"2023-01-19\": 4.55,\n \"2023-01-20\": 4.57,\n \"2023-01-23\": 4.58,\n \"2023-01-24\": 4.57,\n \"2023-01-25\": 4.56,\n \"2023-01-26\": 4.55,\n \"2023-01-27\": 4.57,\n \"2023-01-30\": 4.59,\n \"2023-01-31\": 4.58,\n \"2023-02-01\": 4.54,\n \"2023-02-02\": 4.53,\n \"2023-02-03\": 4.57,\n \"2023-02-06\": 4.59,\n \"2023-02-07\": 4.59,\n \"2023-02-08\": 4.59,\n \"2023-02-09\": 4.64,\n \"2023-02-10\": 4.66,\n \"2023-02-13\": 4.68,\n \"2023-02-14\": 4.67,\n \"2023-02-15\": 4.66,\n \"2023-02-16\": 4.7,\n \"2023-02-17\": 4.7,\n \"2023-02-21\": 4.72,\n \"2023-02-22\": 4.71,\n \"2023-02-23\": 4.71,\n \"2023-02-24\": 4.72,\n \"2023-02-27\": 4.74,\n \"2023-02-28\": 4.72,\n \"2023-03-01\": 4.73,\n \"2023-03-02\": 4.74,\n \"2023-03-03\": 4.74,\n \"2023-03-06\": 4.76,\n \"2023-03-07\": 4.87,\n \"2023-03-08\": 4.89,\n \"2023-03-09\": 4.87,\n \"2023-03-10\": 4.83,\n \"2023-03-13\": 4.7,\n \"2023-03-14\": 4.71,\n \"2023-03-15\": 4.59,\n \"2023-03-16\": 4.57,\n \"2023-03-17\": 4.36,\n \"2023-03-20\": 4.65,\n \"2023-03-21\": 4.62,\n \"2023-03-22\": 4.63,\n \"2023-03-23\": 4.57,\n \"2023-03-24\": 4.57,\n \"2023-03-27\": 4.75,\n \"2023-03-28\": 4.64,\n \"2023-03-29\": 4.64,\n \"2023-03-30\": 4.8,\n \"2023-03-31\": 4.68,\n \"2023-04-03\": 4.77,\n \"2023-04-04\": 4.74,\n \"2023-04-05\": 4.72,\n \"2023-04-06\": 4.77,\n \"2023-04-07\": 4.81,\n \"2023-04-10\": 4.94,\n \"2023-04-11\": 4.89,\n \"2023-04-12\": 4.87,\n \"2023-04-13\": 4.95,\n \"2023-04-14\": 4.98,\n \"2023-04-17\": 5.06,\n \"2023-04-18\": 5.04,\n \"2023-04-19\": 5.01,\n \"2023-04-20\": 4.97,\n \"2023-04-21\": 4.98,\n \"2023-04-24\": 5.04,\n \"2023-04-25\": 4.97,\n \"2023-04-26\": 5.0,\n \"2023-04-27\": 5.03,\n \"2023-04-28\": 4.95,\n \"2023-05-01\": 5.1,\n \"2023-05-02\": 5.08,\n \"2023-05-03\": 5.09,\n \"2023-05-04\": 5.1,\n \"2023-05-05\": 5.1,\n \"2023-05-08\": 5.15,\n \"2023-05-09\": 5.13,\n \"2023-05-10\": 5.08,\n \"2023-05-11\": 5.04,\n \"2023-05-12\": 5.08,\n \"2023-05-15\": 5.06,\n \"2023-05-16\": 5.07,\n \"2023-05-17\": 5.1,\n \"2023-05-18\": 5.14,\n \"2023-05-19\": 5.12,\n \"2023-05-22\": 5.24,\n \"2023-05-23\": 5.18,\n \"2023-05-24\": 5.21,\n \"2023-05-25\": 5.21,\n \"2023-05-26\": 5.16,\n \"2023-05-30\": 5.28,\n \"2023-05-31\": 5.26,\n \"2023-06-01\": 5.24,\n \"2023-06-02\": 5.23,\n \"2023-06-05\": 5.2,\n \"2023-06-06\": 5.18,\n \"2023-06-07\": 5.16,\n \"2023-06-08\": 5.12,\n \"2023-06-09\": 5.11,\n \"2023-06-12\": 5.14,\n \"2023-06-13\": 5.11,\n \"2023-06-14\": 5.1,\n \"2023-06-15\": 5.07,\n \"2023-06-16\": 5.09,\n \"2023-06-20\": 5.14,\n \"2023-06-21\": 5.15,\n \"2023-06-22\": 5.15,\n \"2023-06-23\": 5.15,\n \"2023-06-26\": 5.24,\n \"2023-06-27\": 5.19,\n \"2023-06-28\": 5.18,\n \"2023-06-29\": 5.2,\n \"2023-06-30\": 5.17,\n \"2023-07-03\": 5.21,\n \"2023-07-05\": 5.21,\n \"2023-07-06\": 5.23,\n \"2023-07-07\": 5.22,\n \"2023-07-10\": 5.25,\n \"2023-07-11\": 5.25,\n \"2023-07-12\": 5.24,\n \"2023-07-13\": 5.24,\n \"2023-07-14\": 5.25,\n \"2023-07-17\": 5.26,\n \"2023-07-18\": 5.25,\n \"2023-07-19\": 5.26,\n \"2023-07-20\": 5.26,\n \"2023-07-21\": 5.27,\n \"2023-07-24\": 5.28,\n \"2023-07-25\": 5.28,\n \"2023-07-26\": 5.28,\n \"2023-07-27\": 5.28,\n \"2023-07-28\": 5.28,\n \"2023-07-31\": 5.28,\n \"2023-08-01\": 5.27,\n \"2023-08-02\": 5.27,\n \"2023-08-03\": 5.27,\n \"2023-08-04\": 5.28,\n \"2023-08-07\": 5.29,\n \"2023-08-08\": 5.3,\n \"2023-08-09\": 5.28,\n \"2023-08-10\": 5.28,\n \"2023-08-11\": 5.28,\n \"2023-08-14\": 5.29,\n \"2023-08-15\": 5.29,\n \"2023-08-16\": 5.29,\n \"2023-08-17\": 5.29,\n \"2023-08-18\": 5.28,\n \"2023-08-21\": 5.3,\n \"2023-08-22\": 5.3,\n \"2023-08-23\": 5.3,\n \"2023-08-24\": 5.31,\n \"2023-08-25\": 5.34,\n \"2023-08-28\": 5.34,\n \"2023-08-29\": 5.33,\n \"2023-08-30\": 5.32,\n \"2023-08-31\": 5.32,\n \"2023-09-01\": 5.3,\n \"2023-09-05\": 5.32,\n \"2023-09-06\": 5.31,\n \"2023-09-07\": 5.3,\n \"2023-09-08\": 5.31,\n \"2023-09-11\": 5.32,\n \"2023-09-12\": 5.32,\n \"2023-09-13\": 5.31,\n \"2023-09-14\": 5.31,\n \"2023-09-15\": 5.32,\n \"2023-09-18\": 5.31,\n \"2023-09-19\": 5.31,\n \"2023-09-20\": 5.33,\n \"2023-09-21\": 5.33,\n \"2023-09-22\": 5.32,\n \"2023-09-25\": 5.35,\n \"2023-09-26\": 5.34,\n \"2023-09-27\": 5.34,\n \"2023-09-28\": 5.32,\n \"2023-09-29\": 5.32,\n \"2023-10-02\": 5.35,\n \"2023-10-03\": 5.35,\n \"2023-10-04\": 5.34,\n \"2023-10-05\": 5.34,\n \"2023-10-06\": 5.36,\n \"2023-10-10\": 5.34,\n \"2023-10-11\": 5.34,\n \"2023-10-12\": 5.35,\n \"2023-10-13\": 5.35,\n \"2023-10-16\": 5.34,\n \"2023-10-17\": 5.35,\n \"2023-10-18\": 5.34,\n \"2023-10-19\": 5.33,\n \"2023-10-20\": 5.31,\n \"2023-10-23\": 5.32,\n \"2023-10-24\": 5.31,\n \"2023-10-25\": 5.32,\n \"2023-10-26\": 5.32,\n \"2023-10-27\": 5.32,\n \"2023-10-30\": 5.33,\n \"2023-10-31\": 5.33,\n \"2023-11-01\": 5.31,\n \"2023-11-02\": 5.28,\n \"2023-11-03\": 5.27,\n \"2023-11-06\": 5.29,\n \"2023-11-07\": 5.28,\n \"2023-11-08\": 5.28,\n \"2023-11-09\": 5.27,\n \"2023-11-10\": 5.26,\n \"2023-11-13\": 5.28,\n \"2023-11-14\": 5.26,\n \"2023-11-15\": 5.26,\n \"2023-11-16\": 5.25,\n \"2023-11-17\": 5.25,\n \"2023-11-20\": 5.27,\n \"2023-11-21\": 5.26,\n \"2023-11-22\": 5.27,\n \"2023-11-24\": 5.28,\n \"2023-11-27\": 5.28,\n \"2023-11-28\": 5.27,\n \"2023-11-29\": 5.25,\n \"2023-11-30\": 5.25,\n \"2023-12-01\": 5.23,\n \"2023-12-04\": 5.26,\n \"2023-12-05\": 5.25,\n \"2023-12-06\": 5.25,\n \"2023-12-07\": 5.24,\n \"2023-12-08\": 5.24,\n \"2023-12-11\": 5.26,\n \"2023-12-12\": 5.26,\n \"2023-12-13\": 5.24,\n \"2023-12-14\": 5.23,\n \"2023-12-15\": 5.24,\n \"2023-12-18\": 5.26,\n \"2023-12-19\": 5.23,\n \"2023-12-20\": 5.24,\n \"2023-12-21\": 5.22,\n \"2023-12-22\": 5.24,\n \"2023-12-26\": 5.25,\n \"2023-12-27\": 5.24,\n \"2023-12-28\": 5.25,\n \"2023-12-29\": 5.2,\n \"2024-01-02\": 5.22,\n \"2024-01-03\": 5.24,\n \"2024-01-04\": 5.24,\n \"2024-01-05\": 5.24,\n \"2024-01-08\": 5.25,\n \"2024-01-09\": 5.24,\n \"2024-01-10\": 5.23,\n \"2024-01-11\": 5.23,\n \"2024-01-12\": 5.22,\n \"2024-01-16\": 5.22,\n \"2024-01-17\": 5.24,\n \"2024-01-18\": 5.22,\n \"2024-01-19\": 5.22,\n \"2024-01-22\": 5.22,\n \"2024-01-23\": 5.21,\n \"2024-01-24\": 5.21,\n \"2024-01-25\": 5.21,\n \"2024-01-26\": 5.21,\n \"2024-01-29\": 5.22,\n \"2024-01-30\": 5.21,\n \"2024-01-31\": 5.22,\n \"2024-02-01\": 5.22,\n \"2024-02-02\": 5.23,\n \"2024-02-05\": 5.22,\n \"2024-02-06\": 5.23,\n \"2024-02-07\": 5.23,\n \"2024-02-08\": 5.23,\n \"2024-02-09\": 5.24,\n \"2024-02-12\": 5.23,\n \"2024-02-13\": 5.25,\n \"2024-02-14\": 5.23,\n \"2024-02-15\": 5.23,\n \"2024-02-16\": 5.24,\n \"2024-02-20\": 5.24,\n \"2024-02-21\": 5.24,\n \"2024-02-22\": 5.25,\n \"2024-02-23\": 5.26,\n \"2024-02-26\": 5.26,\n \"2024-02-27\": 5.25,\n \"2024-02-28\": 5.24,\n \"2024-02-29\": 5.25,\n \"2024-03-01\": 5.23,\n \"2024-03-04\": 5.24,\n \"2024-03-05\": 5.23,\n \"2024-03-06\": 5.24,\n \"2024-03-07\": 5.24,\n \"2024-03-08\": 5.24,\n \"2024-03-11\": 5.24,\n \"2024-03-12\": 5.25,\n \"2024-03-13\": 5.25,\n \"2024-03-14\": 5.25,\n \"2024-03-15\": 5.25,\n \"2024-03-18\": 5.25,\n \"2024-03-19\": 5.24,\n \"2024-03-20\": 5.24,\n \"2024-03-21\": 5.25,\n \"2024-03-22\": 5.24,\n \"2024-03-25\": 5.23,\n \"2024-03-26\": 5.22,\n \"2024-03-27\": 5.22,\n \"2024-03-28\": 5.23,\n \"2024-04-01\": 5.23,\n \"2024-04-02\": 5.22,\n \"2024-04-03\": 5.22,\n \"2024-04-04\": 5.21,\n \"2024-04-05\": 5.23,\n \"2024-04-08\": 5.23,\n \"2024-04-09\": 5.23,\n \"2024-04-10\": 5.25,\n \"2024-04-11\": 5.25,\n \"2024-04-12\": 5.25,\n \"2024-04-15\": 5.25,\n \"2024-04-16\": 5.25,\n \"2024-04-17\": 5.25,\n \"2024-04-18\": 5.25,\n \"2024-04-19\": 5.25,\n \"2024-04-22\": 5.22,\n \"2024-04-23\": 5.25,\n \"2024-04-24\": 5.26,\n \"2024-04-25\": 5.26,\n \"2024-04-26\": 5.25,\n \"2024-04-29\": 5.25,\n \"2024-04-30\": 5.25,\n \"2024-05-01\": 5.26,\n \"2024-05-02\": 5.25,\n \"2024-05-03\": 5.25,\n \"2024-05-06\": 5.25,\n \"2024-05-07\": 5.25,\n \"2024-05-08\": 5.25,\n \"2024-05-09\": 5.25,\n \"2024-05-10\": 5.26,\n \"2024-05-13\": 5.25,\n \"2024-05-14\": 5.24,\n \"2024-05-15\": 5.25,\n \"2024-05-16\": 5.25,\n \"2024-05-17\": 5.25,\n \"2024-05-20\": 5.25,\n \"2024-05-21\": 5.25,\n \"2024-05-22\": 5.25,\n \"2024-05-23\": 5.26,\n \"2024-05-24\": 5.26,\n \"2024-05-28\": 5.26,\n \"2024-05-29\": 5.26,\n \"2024-05-30\": 5.26,\n \"2024-05-31\": 5.25,\n \"2024-06-03\": 5.26,\n \"2024-06-04\": 5.25,\n \"2024-06-05\": 5.25,\n \"2024-06-06\": 5.25,\n \"2024-06-07\": 5.26,\n \"2024-06-10\": 5.25,\n \"2024-06-11\": 5.25,\n \"2024-06-12\": 5.25,\n \"2024-06-13\": 5.25,\n \"2024-06-14\": 5.25,\n \"2024-06-17\": 5.25,\n \"2024-06-18\": 5.24,\n \"2024-06-20\": 5.24,\n \"2024-06-21\": 5.23,\n \"2024-06-24\": 5.24,\n \"2024-06-25\": 5.23,\n \"2024-06-26\": 5.24,\n \"2024-06-27\": 5.23,\n \"2024-06-28\": 5.22,\n \"2024-07-01\": 5.24,\n \"2024-07-02\": 5.24,\n \"2024-07-03\": 5.24,\n \"2024-07-05\": 5.23,\n \"2024-07-08\": 5.23,\n \"2024-07-09\": 5.23,\n \"2024-07-10\": 5.23,\n \"2024-07-11\": 5.21,\n \"2024-07-12\": 5.21,\n \"2024-07-15\": 5.2,\n \"2024-07-16\": 5.2,\n \"2024-07-17\": 5.2,\n \"2024-07-18\": 5.21,\n \"2024-07-19\": 5.2,\n \"2024-07-22\": 5.19,\n \"2024-07-23\": 5.18,\n \"2024-07-24\": 5.18,\n \"2024-07-25\": 5.17,\n \"2024-07-26\": 5.16,\n \"2024-07-29\": 5.15,\n \"2024-07-30\": 5.14,\n \"2024-07-31\": 5.15,\n \"2024-08-01\": 5.12,\n \"2024-08-02\": 5.05,\n \"2024-08-05\": 5.09,\n \"2024-08-06\": 5.09,\n \"2024-08-07\": 5.09,\n \"2024-08-08\": 5.09,\n \"2024-08-09\": 5.09,\n \"2024-08-12\": 5.07,\n \"2024-08-13\": 5.06,\n \"2024-08-14\": 5.07,\n \"2024-08-15\": 5.09,\n \"2024-08-16\": 5.08,\n \"2024-08-19\": 5.06,\n \"2024-08-20\": 5.04,\n \"2024-08-21\": 5.02,\n \"2024-08-22\": 5.04,\n \"2024-08-23\": 5.01,\n \"2024-08-26\": 4.98,\n \"2024-08-27\": 4.98,\n \"2024-08-28\": 4.96,\n \"2024-08-29\": 4.98,\n \"2024-08-30\": 4.98,\n \"2024-09-03\": 4.97,\n \"2024-09-04\": 4.96,\n \"2024-09-05\": 4.94,\n \"2024-09-06\": 4.93,\n \"2024-09-09\": 4.89,\n \"2024-09-10\": 4.85,\n \"2024-09-11\": 4.89,\n \"2024-09-12\": 4.85,\n \"2024-09-13\": 4.78,\n \"2024-09-16\": 4.75,\n \"2024-09-17\": 4.75,\n \"2024-09-18\": 4.65,\n \"2024-09-19\": 4.61,\n \"2024-09-20\": 4.56,\n \"2024-09-23\": 4.53,\n \"2024-09-24\": 4.5,\n \"2024-09-25\": 4.51,\n \"2024-09-26\": 4.5,\n \"2024-09-27\": 4.5,\n \"2024-09-30\": 4.52,\n \"2024-10-01\": 4.5,\n \"2024-10-02\": 4.48,\n \"2024-10-03\": 4.48,\n \"2024-10-04\": 4.53,\n \"2024-10-07\": 4.55,\n \"2024-10-08\": 4.53,\n \"2024-10-09\": 4.54,\n \"2024-10-10\": 4.54,\n \"2024-10-11\": 4.53,\n \"2024-10-15\": 4.52,\n \"2024-10-16\": 4.51,\n \"2024-10-17\": 4.54,\n \"2024-10-18\": 4.53,\n \"2024-10-21\": 4.51,\n \"2024-10-22\": 4.51,\n \"2024-10-23\": 4.52,\n \"2024-10-24\": 4.5,\n \"2024-10-25\": 4.52,\n \"2024-10-28\": 4.49,\n \"2024-10-29\": 4.49,\n \"2024-10-30\": 4.47,\n \"2024-10-31\": 4.44,\n \"2024-11-01\": 4.41,\n \"2024-11-04\": 4.44,\n \"2024-11-05\": 4.43,\n \"2024-11-06\": 4.44,\n \"2024-11-07\": 4.43,\n \"2024-11-08\": 4.43,\n \"2024-11-12\": 4.43,\n \"2024-11-13\": 4.4,\n \"2024-11-14\": 4.41,\n \"2024-11-15\": 4.41,\n \"2024-11-18\": 4.42,\n \"2024-11-19\": 4.41,\n \"2024-11-20\": 4.42,\n \"2024-11-21\": 4.43,\n \"2024-11-22\": 4.43,\n \"2024-11-25\": 4.42,\n \"2024-11-26\": 4.4,\n \"2024-11-27\": 4.4,\n \"2024-11-29\": 4.39,\n \"2024-12-02\": 4.38,\n \"2024-12-03\": 4.36,\n \"2024-12-04\": 4.35,\n \"2024-12-05\": 4.34,\n \"2024-12-06\": 4.31,\n \"2024-12-09\": 4.3,\n \"2024-12-10\": 4.29,\n \"2024-12-11\": 4.26,\n \"2024-12-12\": 4.23,\n \"2024-12-13\": 4.23,\n \"2024-12-16\": 4.25,\n \"2024-12-17\": 4.26,\n \"2024-12-18\": 4.25,\n \"2024-12-19\": 4.23,\n \"2024-12-20\": 4.23,\n \"2024-12-23\": 4.24,\n \"2024-12-24\": 4.28,\n \"2024-12-26\": 4.24,\n \"2024-12-27\": 4.19,\n \"2024-12-30\": 4.23,\n \"2024-12-31\": 4.23,\n \"2025-01-02\": 4.22,\n \"2025-01-03\": 4.2,\n \"2025-01-06\": 4.21,\n \"2025-01-07\": 4.21,\n \"2025-01-08\": 4.21,\n \"2025-01-09\": 4.21,\n \"2025-01-10\": 4.22,\n \"2025-01-13\": 4.23,\n \"2025-01-14\": 4.22,\n \"2025-01-15\": 4.21,\n \"2025-01-16\": 4.21,\n \"2025-01-17\": 4.2,\n \"2025-01-21\": 4.22,\n \"2025-01-22\": 4.22,\n \"2025-01-23\": 4.22,\n \"2025-01-24\": 4.21,\n \"2025-01-27\": 4.2,\n \"2025-01-28\": 4.2,\n \"2025-01-29\": 4.2,\n \"2025-01-30\": 4.19,\n \"2025-01-31\": 4.2,\n \"2025-02-03\": 4.22,\n \"2025-02-04\": 4.22,\n \"2025-02-05\": 4.22,\n \"2025-02-06\": 4.22,\n \"2025-02-07\": 4.24,\n \"2025-02-10\": 4.23,\n \"2025-02-11\": 4.23,\n \"2025-02-12\": 4.23,\n \"2025-02-13\": 4.22,\n \"2025-02-14\": 4.22,\n \"2025-02-18\": 4.23,\n \"2025-02-19\": 4.22,\n \"2025-02-20\": 4.21,\n \"2025-02-21\": 4.21,\n \"2025-02-24\": 4.19,\n \"2025-02-25\": 4.19,\n \"2025-02-26\": 4.2,\n \"2025-02-27\": 4.2,\n \"2025-02-28\": 4.2,\n \"2025-03-03\": 4.21,\n \"2025-03-04\": 4.2,\n \"2025-03-05\": 4.21,\n \"2025-03-06\": 4.2,\n \"2025-03-07\": 4.2,\n \"2025-03-10\": 4.19,\n \"2025-03-11\": 4.2,\n \"2025-03-12\": 4.21,\n \"2025-03-13\": 4.2,\n \"2025-03-14\": 4.2,\n \"2025-03-17\": 4.2,\n \"2025-03-18\": 4.2,\n \"2025-03-19\": 4.2,\n \"2025-03-20\": 4.19,\n \"2025-03-21\": 4.19,\n \"2025-03-24\": 4.19,\n \"2025-03-25\": 4.19,\n \"2025-03-26\": 4.2,\n \"2025-03-27\": 4.2,\n \"2025-03-28\": 4.2,\n \"2025-03-31\": 4.21,\n \"2025-04-01\": 4.2,\n \"2025-04-02\": 4.21,\n \"2025-04-03\": 4.2,\n \"2025-04-04\": 4.17,\n \"2025-04-07\": 4.17,\n \"2025-04-08\": 4.19,\n \"2025-04-09\": 4.24,\n \"2025-04-10\": 4.22,\n \"2025-04-11\": 4.23,\n \"2025-04-14\": 4.22,\n \"2025-04-15\": 4.22,\n \"2025-04-16\": 4.21,\n \"2025-04-17\": 4.23,\n \"2025-04-21\": 4.22,\n \"2025-04-22\": 4.22,\n \"2025-04-23\": 4.22,\n \"2025-04-24\": 4.21,\n \"2025-04-25\": 4.21,\n \"2025-04-28\": 4.2,\n \"2025-04-29\": 4.2,\n \"2025-04-30\": 4.2,\n \"2025-05-01\": 4.2,\n \"2025-05-02\": 4.22,\n \"2025-05-05\": 4.22,\n \"2025-05-06\": 4.22,\n \"2025-05-07\": 4.22,\n \"2025-05-08\": 4.23,\n \"2025-05-09\": 4.22,\n \"2025-05-12\": 4.31,\n \"2025-05-13\": 4.29,\n \"2025-05-14\": 4.29,\n \"2025-05-15\": 4.27,\n \"2025-05-16\": 4.25,\n \"2025-05-19\": 4.28,\n \"2025-05-20\": 4.26,\n \"2025-05-21\": 4.24,\n \"2025-05-22\": 4.25,\n \"2025-05-23\": 4.24,\n \"2025-05-27\": 4.24,\n \"2025-05-28\": 4.24,\n \"2025-05-29\": 4.25,\n \"2025-05-30\": 4.25,\n \"2025-06-02\": 4.25,\n \"2025-06-03\": 4.24,\n \"2025-06-04\": 4.25,\n \"2025-06-05\": 4.25,\n \"2025-06-06\": 4.25,\n \"2025-06-09\": 4.25,\n \"2025-06-10\": 4.26,\n \"2025-06-11\": 4.26,\n \"2025-06-12\": 4.27,\n \"2025-06-13\": 4.26,\n \"2025-06-16\": 4.24,\n \"2025-06-17\": 4.23,\n \"2025-06-18\": 4.23,\n \"2025-06-20\": 4.21,\n \"2025-06-23\": 4.19,\n \"2025-06-24\": 4.19,\n \"2025-06-25\": 4.19,\n \"2025-06-26\": 4.21,\n \"2025-06-27\": 4.2,\n \"2025-06-30\": 4.24,\n \"2025-07-01\": 4.24,\n \"2025-07-02\": 4.24,\n \"2025-07-03\": 4.26,\n \"2025-07-07\": 4.26,\n \"2025-07-08\": 4.26,\n \"2025-07-09\": 4.26,\n \"2025-07-10\": 4.25,\n \"2025-07-11\": 4.25,\n \"2025-07-14\": 4.26,\n \"2025-07-15\": 4.25,\n \"2025-07-16\": 4.24,\n \"2025-07-17\": 4.24,\n \"2025-07-18\": 4.24,\n \"2025-07-21\": 4.24,\n \"2025-07-22\": 4.24,\n \"2025-07-23\": 4.25,\n \"2025-07-24\": 4.25,\n \"2025-07-25\": 4.25,\n \"2025-07-28\": 4.24,\n \"2025-07-29\": 4.24,\n \"2025-07-30\": 4.25,\n \"2025-07-31\": 4.24,\n \"2025-08-01\": 4.19,\n \"2025-08-04\": 4.16,\n \"2025-08-05\": 4.16,\n \"2025-08-06\": 4.14,\n \"2025-08-07\": 4.14,\n \"2025-08-08\": 4.14,\n \"2025-08-11\": 4.15,\n \"2025-08-12\": 4.14,\n \"2025-08-13\": 4.11,\n \"2025-08-14\": 4.12,\n \"2025-08-15\": 4.12,\n \"2025-08-18\": 4.14,\n \"2025-08-19\": 4.12,\n \"2025-08-20\": 4.12,\n \"2025-08-21\": 4.14,\n \"2025-08-22\": 4.1,\n \"2025-08-25\": 4.1,\n \"2025-08-26\": 4.1,\n \"2025-08-27\": 4.08,\n \"2025-08-28\": 4.08,\n \"2025-08-29\": 4.05,\n \"2025-09-02\": 4.05,\n \"2025-09-03\": 4.03,\n \"2025-09-04\": 4.01,\n \"2025-09-05\": 3.92,\n \"2025-09-08\": 3.95,\n \"2025-09-09\": 3.95,\n \"2025-09-10\": 3.94,\n \"2025-09-11\": 3.94,\n \"2025-09-12\": 3.94,\n \"2025-09-15\": 3.91,\n \"2025-09-16\": 3.9,\n \"2025-09-17\": 3.88,\n \"2025-09-18\": 3.89,\n \"2025-09-19\": 3.89,\n \"2025-09-22\": 3.86,\n \"2025-09-23\": 3.86,\n \"2025-09-24\": 3.87,\n \"2025-09-25\": 3.89,\n \"2025-09-26\": 3.87,\n \"2025-09-29\": 3.86,\n \"2025-09-30\": 3.86,\n \"2025-10-01\": 3.85,\n \"2025-10-02\": 3.86,\n \"2025-10-03\": 3.87,\n \"2025-10-06\": 3.86,\n \"2025-10-07\": 3.85,\n \"2025-10-08\": 3.85,\n \"2025-10-09\": 3.87,\n \"2025-10-10\": 3.86,\n \"2025-10-14\": 3.85,\n \"2025-10-15\": 3.87,\n \"2025-10-16\": 3.86,\n \"2025-10-17\": 3.84,\n \"2025-10-20\": 3.81,\n \"2025-10-21\": 3.8,\n \"2025-10-22\": 3.8,\n \"2025-10-23\": 3.8,\n \"2025-10-24\": 3.77,\n \"2025-10-27\": 3.73,\n \"2025-10-28\": 3.73,\n \"2025-10-29\": 3.77,\n \"2025-10-30\": 3.76,\n \"2025-10-31\": 3.73,\n \"2025-11-03\": 3.82,\n \"2025-11-04\": 3.8,\n \"2025-11-05\": 3.8,\n \"2025-11-06\": 3.77,\n \"2025-11-07\": 3.77,\n \"2025-11-10\": 3.79,\n \"2025-11-12\": 3.79,\n \"2025-11-13\": 3.8,\n \"2025-11-14\": 3.8,\n \"2025-11-17\": 3.8,\n \"2025-11-18\": 3.78,\n \"2025-11-19\": 3.79,\n \"2025-11-20\": 3.78,\n \"2025-11-21\": 3.75,\n \"2025-11-24\": 3.75,\n \"2025-11-25\": 3.74,\n \"2025-11-26\": 3.76,\n \"2025-11-28\": 3.73,\n \"2025-12-01\": 3.71,\n \"2025-12-02\": 3.68,\n \"2025-12-03\": 3.64,\n \"2025-12-04\": 3.63,\n \"2025-12-05\": 3.62,\n \"2025-12-08\": 3.64,\n \"2025-12-09\": 3.64,\n \"2025-12-10\": 3.6,\n \"2025-12-11\": 3.58,\n \"2025-12-12\": 3.54,\n \"2025-12-15\": 3.56,\n \"2025-12-16\": 3.56,\n \"2025-12-17\": 3.55,\n \"2025-12-18\": 3.53,\n \"2025-12-19\": 3.54,\n \"2025-12-22\": 3.56,\n \"2025-12-23\": 3.56,\n \"2025-12-24\": 3.6,\n \"2025-12-26\": 3.56,\n \"2025-12-29\": 3.57,\n \"2025-12-30\": 3.55,\n \"2025-12-31\": 3.57,\n // 2026\n \"2026-01-02\": 3.54,\n \"2026-01-05\": 3.54,\n \"2026-01-06\": 3.53,\n \"2026-01-07\": 3.52,\n \"2026-01-08\": 3.52,\n \"2026-01-09\": 3.52,\n \"2026-01-12\": 3.56,\n \"2026-01-13\": 3.57,\n \"2026-01-14\": 3.57,\n \"2026-01-15\": 3.57,\n \"2026-01-16\": 3.57,\n \"2026-01-20\": 3.59,\n \"2026-01-21\": 3.59,\n \"2026-01-22\": 3.6,\n \"2026-01-23\": 3.59,\n \"2026-01-26\": 3.59,\n \"2026-01-27\": 3.58,\n \"2026-01-28\": 3.59,\n \"2026-01-29\": 3.59,\n \"2026-01-30\": 3.58,\n \"2026-02-02\": 3.6,\n \"2026-02-03\": 3.6,\n \"2026-02-04\": 3.6,\n \"2026-02-05\": 3.59,\n \"2026-02-06\": 3.6,\n \"2026-02-09\": 3.6,\n \"2026-02-10\": 3.6,\n \"2026-02-11\": 3.61,\n \"2026-02-12\": 3.61,\n \"2026-02-13\": 3.6,\n \"2026-02-17\": 3.61,\n \"2026-02-18\": 3.61,\n \"2026-02-19\": 3.61,\n \"2026-02-20\": 3.6,\n \"2026-02-23\": 3.6,\n \"2026-02-24\": 3.6,\n \"2026-02-25\": 3.6,\n \"2026-02-26\": 3.6,\n \"2026-02-27\": 3.59,\n \"2026-03-02\": 3.61,\n \"2026-03-03\": 3.6,\n \"2026-03-04\": 3.6,\n \"2026-03-05\": 3.59,\n \"2026-03-06\": 3.58,\n \"2026-03-09\": 3.61,\n \"2026-03-10\": 3.6,\n \"2026-03-11\": 3.61,\n \"2026-03-12\": 3.61,\n \"2026-03-13\": 3.61,\n \"2026-03-16\": 3.61,\n \"2026-03-17\": 3.61,\n \"2026-03-18\": 3.62,\n \"2026-03-19\": 3.62,\n \"2026-03-20\": 3.63,\n \"2026-03-23\": 3.63,\n \"2026-03-24\": 3.63,\n \"2026-03-25\": 3.63,\n \"2026-03-26\": 3.63,\n \"2026-03-27\": 3.62,\n \"2026-03-30\": 3.62,\n \"2026-03-31\": 3.61,\n \"2026-04-01\": 3.61,\n \"2026-04-02\": 3.61,\n \"2026-04-03\": 3.62,\n \"2026-04-06\": 3.64,\n \"2026-04-07\": 3.62,\n \"2026-04-08\": 3.61,\n \"2026-04-09\": 3.6,\n \"2026-04-10\": 3.6,\n \"2026-04-13\": 3.62,\n \"2026-04-14\": 3.62,\n \"2026-04-15\": 3.62,\n \"2026-04-16\": 3.62,\n \"2026-04-17\": 3.61,\n \"2026-04-20\": 3.62,\n \"2026-04-21\": 3.6,\n \"2026-04-22\": 3.6,\n \"2026-04-23\": 3.6,\n \"2026-04-24\": 3.6,\n \"2026-04-27\": 3.6,\n \"2026-04-28\": 3.6,\n \"2026-04-29\": 3.6,\n \"2026-04-30\": 3.59,\n \"2026-05-01\": 3.59,\n \"2026-05-04\": 3.61,\n \"2026-05-05\": 3.61,\n \"2026-05-06\": 3.61,\n \"2026-05-07\": 3.61,\n \"2026-05-08\": 3.6,\n \"2026-05-11\": 3.61,\n \"2026-05-12\": 3.61,\n \"2026-05-13\": 3.61,\n \"2026-05-14\": 3.6,\n \"2026-05-15\": 3.6,\n \"2026-05-18\": 3.6,\n \"2026-05-19\": 3.59,\n \"2026-05-20\": 3.57,\n \"2026-05-21\": 3.59,\n \"2026-05-22\": 3.59,\n \"2026-05-26\": 3.6,\n \"2026-05-27\": 3.59,\n \"2026-05-28\": 3.6,\n \"2026-05-29\": 3.6,\n \"2026-06-01\": 3.63,\n \"2026-06-02\": 3.63,\n \"2026-06-03\": 3.63,\n \"2026-06-04\": 3.63,\n \"2026-06-05\": 3.63,\n \"2026-06-08\": 3.65,\n \"2026-06-09\": 3.64,\n \"2026-06-10\": 3.64,\n \"2026-06-11\": 3.63,\n \"2026-06-12\": 3.63,\n \"2026-06-15\": 3.64,\n \"2026-06-16\": 3.64,\n \"2026-06-17\": 3.68,\n \"2026-06-18\": 3.67,\n \"2026-06-22\": 3.7,\n \"2026-06-23\": 3.7,\n \"2026-06-24\": 3.7,\n \"2026-06-25\": 3.69,\n \"2026-06-26\": 3.67,\n \"2026-06-29\": 3.74,\n \"2026-06-30\": 3.74,\n \"2026-07-01\": 3.71,\n \"2026-07-02\": 3.68,\n \"2026-07-06\": 3.74,\n \"2026-07-07\": 3.73,\n \"2026-07-08\": 3.73,\n \"2026-07-09\": 3.69,\n \"2026-07-10\": 3.71,\n \"2026-07-13\": 3.76,\n \"2026-07-14\": 3.71,\n \"2026-07-15\": 3.7,\n \"2026-07-16\": 3.7,\n \"2026-07-17\": 3.71,\n \"2026-07-20\": 3.73,\n \"2026-07-21\": 3.74,\n \"2026-07-22\": 3.75,\n \"2026-07-23\": 3.81,\n \"2026-07-24\": 3.81,\n \"2026-07-27\": 3.82,\n \"2026-07-28\": 3.77,\n \"2026-07-29\": 3.7,\n \"2026-07-30\": 3.69,\n \"2026-07-31\": 3.69,\n \"2026-08-03\": 3.75,\n \"2026-08-04\": 3.74,\n \"2026-08-05\": 3.74,\n \"2026-08-06\": 3.74,\n \"2026-08-07\": 3.72,\n \"2026-08-10\": 3.74,\n \"2026-08-11\": 3.74,\n \"2026-08-12\": 3.72,\n \"2026-08-13\": 3.71,\n \"2026-08-14\": 3.71,\n \"2026-08-17\": 3.72,\n \"2026-08-18\": 3.71,\n \"2026-08-19\": 3.71,\n \"2026-08-20\": 3.71,\n \"2026-08-21\": 3.72,\n \"2026-08-24\": 3.72,\n \"2026-08-25\": 3.71,\n \"2026-08-26\": 3.7,\n \"2026-08-27\": 3.69,\n \"2026-08-28\": 3.74,\n \"2026-08-31\": 3.78,\n \"2026-09-01\": 3.78,\n \"2026-09-02\": 3.78,\n \"2026-09-03\": 3.75,\n \"2026-09-04\": 3.77,\n \"2026-09-08\": 3.8,\n \"2026-09-09\": 3.81,\n \"2026-09-10\": 3.86,\n \"2026-09-11\": 3.92,\n \"2026-09-14\": 3.97,\n \"2026-09-15\": 3.97,\n \"2026-09-16\": 3.99,\n \"2026-09-17\": 3.97,\n \"2026-09-18\": 3.99,\n \"2026-09-21\": 4.02,\n \"2026-09-22\": 4.01,\n \"2026-09-23\": 4.04,\n \"2026-09-24\": 4.08,\n \"2026-09-25\": 4.08,\n \"2026-09-28\": 4.1,\n \"2026-09-29\": 4.07,\n \"2026-09-30\": 4.03,\n \"2026-10-01\": 4,\n \"2026-10-02\": 4.01,\n \"2026-10-05\": 4.05,\n \"2026-10-06\": 4.04,\n};\n","/**\n * Historical SOFR Overnight Rates\n *\n * Source: Federal Reserve Bank of New York / FRED (SOFR series).\n * Rates are stored as annual percentages (e.g., 3.60 = 3.60% annual).\n *\n * This is the rate series used when computing option greeks under the\n * SOFR + q=0 convention. Distinct from treasury-rates.ts, which holds\n * 3-month T-bill yields used for portfolio Sharpe/Sortino calculations.\n *\n * SOFR is not published on US bank holidays — those rows are absent and the\n * lookup falls back to the most recent prior trading day's rate.\n *\n * To update the bundled SOFR and DTB3 together from the published rates file,\n * run `node scripts/rates.mjs seed` during a reviewed release.\n */\n\nexport const SOFR_RATES: Record<string, number> = {\n \"2022-01-03\": 0.05,\n \"2022-01-04\": 0.05,\n \"2022-01-05\": 0.05,\n \"2022-01-06\": 0.05,\n \"2022-01-07\": 0.05,\n \"2022-01-10\": 0.05,\n \"2022-01-11\": 0.05,\n \"2022-01-12\": 0.05,\n \"2022-01-13\": 0.05,\n \"2022-01-14\": 0.05,\n \"2022-01-18\": 0.05,\n \"2022-01-19\": 0.05,\n \"2022-01-20\": 0.04,\n \"2022-01-21\": 0.05,\n \"2022-01-24\": 0.04,\n \"2022-01-25\": 0.05,\n \"2022-01-26\": 0.04,\n \"2022-01-27\": 0.04,\n \"2022-01-28\": 0.05,\n \"2022-01-31\": 0.05,\n \"2022-02-01\": 0.05,\n \"2022-02-02\": 0.05,\n \"2022-02-03\": 0.05,\n \"2022-02-04\": 0.05,\n \"2022-02-07\": 0.05,\n \"2022-02-08\": 0.05,\n \"2022-02-09\": 0.04,\n \"2022-02-10\": 0.05,\n \"2022-02-11\": 0.05,\n \"2022-02-14\": 0.05,\n \"2022-02-15\": 0.05,\n \"2022-02-16\": 0.05,\n \"2022-02-17\": 0.05,\n \"2022-02-18\": 0.05,\n \"2022-02-22\": 0.05,\n \"2022-02-23\": 0.05,\n \"2022-02-24\": 0.05,\n \"2022-02-25\": 0.05,\n \"2022-02-28\": 0.05,\n \"2022-03-01\": 0.05,\n \"2022-03-02\": 0.05,\n \"2022-03-03\": 0.05,\n \"2022-03-04\": 0.05,\n \"2022-03-07\": 0.05,\n \"2022-03-08\": 0.05,\n \"2022-03-09\": 0.05,\n \"2022-03-10\": 0.05,\n \"2022-03-11\": 0.05,\n \"2022-03-14\": 0.05,\n \"2022-03-15\": 0.05,\n \"2022-03-16\": 0.05,\n \"2022-03-17\": 0.3,\n \"2022-03-18\": 0.3,\n \"2022-03-21\": 0.29,\n \"2022-03-22\": 0.28,\n \"2022-03-23\": 0.27,\n \"2022-03-24\": 0.27,\n \"2022-03-25\": 0.28,\n \"2022-03-28\": 0.28,\n \"2022-03-29\": 0.28,\n \"2022-03-30\": 0.27,\n \"2022-03-31\": 0.29,\n \"2022-04-01\": 0.3,\n \"2022-04-04\": 0.3,\n \"2022-04-05\": 0.3,\n \"2022-04-06\": 0.3,\n \"2022-04-07\": 0.3,\n \"2022-04-08\": 0.3,\n \"2022-04-11\": 0.3,\n \"2022-04-12\": 0.29,\n \"2022-04-13\": 0.29,\n \"2022-04-14\": 0.29,\n \"2022-04-18\": 0.29,\n \"2022-04-19\": 0.28,\n \"2022-04-20\": 0.27,\n \"2022-04-21\": 0.26,\n \"2022-04-22\": 0.27,\n \"2022-04-25\": 0.27,\n \"2022-04-26\": 0.27,\n \"2022-04-27\": 0.28,\n \"2022-04-28\": 0.28,\n \"2022-04-29\": 0.28,\n \"2022-05-02\": 0.3,\n \"2022-05-03\": 0.3,\n \"2022-05-04\": 0.3,\n \"2022-05-05\": 0.79,\n \"2022-05-06\": 0.78,\n \"2022-05-09\": 0.78,\n \"2022-05-10\": 0.78,\n \"2022-05-11\": 0.78,\n \"2022-05-12\": 0.79,\n \"2022-05-13\": 0.79,\n \"2022-05-16\": 0.8,\n \"2022-05-17\": 0.8,\n \"2022-05-18\": 0.79,\n \"2022-05-19\": 0.79,\n \"2022-05-20\": 0.78,\n \"2022-05-23\": 0.78,\n \"2022-05-24\": 0.78,\n \"2022-05-25\": 0.78,\n \"2022-05-26\": 0.78,\n \"2022-05-27\": 0.78,\n \"2022-05-31\": 0.79,\n \"2022-06-01\": 0.8,\n \"2022-06-02\": 0.79,\n \"2022-06-03\": 0.78,\n \"2022-06-06\": 0.78,\n \"2022-06-07\": 0.77,\n \"2022-06-08\": 0.76,\n \"2022-06-09\": 0.75,\n \"2022-06-10\": 0.75,\n \"2022-06-13\": 0.73,\n \"2022-06-14\": 0.69,\n \"2022-06-15\": 0.7,\n \"2022-06-16\": 1.45,\n \"2022-06-17\": 1.45,\n \"2022-06-21\": 1.45,\n \"2022-06-22\": 1.45,\n \"2022-06-23\": 1.44,\n \"2022-06-24\": 1.46,\n \"2022-06-27\": 1.5,\n \"2022-06-28\": 1.52,\n \"2022-06-29\": 1.51,\n \"2022-06-30\": 1.5,\n \"2022-07-01\": 1.52,\n \"2022-07-05\": 1.54,\n \"2022-07-06\": 1.54,\n \"2022-07-07\": 1.54,\n \"2022-07-08\": 1.53,\n \"2022-07-11\": 1.53,\n \"2022-07-12\": 1.54,\n \"2022-07-13\": 1.53,\n \"2022-07-14\": 1.53,\n \"2022-07-15\": 1.54,\n \"2022-07-18\": 1.54,\n \"2022-07-19\": 1.54,\n \"2022-07-20\": 1.53,\n \"2022-07-21\": 1.53,\n \"2022-07-22\": 1.52,\n \"2022-07-25\": 1.53,\n \"2022-07-26\": 1.53,\n \"2022-07-27\": 1.53,\n \"2022-07-28\": 2.28,\n \"2022-07-29\": 2.27,\n \"2022-08-01\": 2.28,\n \"2022-08-02\": 2.3,\n \"2022-08-03\": 2.29,\n \"2022-08-04\": 2.29,\n \"2022-08-05\": 2.28,\n \"2022-08-08\": 2.28,\n \"2022-08-09\": 2.29,\n \"2022-08-10\": 2.28,\n \"2022-08-11\": 2.28,\n \"2022-08-12\": 2.28,\n \"2022-08-15\": 2.29,\n \"2022-08-16\": 2.29,\n \"2022-08-17\": 2.29,\n \"2022-08-18\": 2.28,\n \"2022-08-19\": 2.28,\n \"2022-08-22\": 2.28,\n \"2022-08-23\": 2.27,\n \"2022-08-24\": 2.27,\n \"2022-08-25\": 2.28,\n \"2022-08-26\": 2.28,\n \"2022-08-29\": 2.28,\n \"2022-08-30\": 2.29,\n \"2022-08-31\": 2.29,\n \"2022-09-01\": 2.29,\n \"2022-09-02\": 2.29,\n \"2022-09-06\": 2.29,\n \"2022-09-07\": 2.28,\n \"2022-09-08\": 2.28,\n \"2022-09-09\": 2.28,\n \"2022-09-12\": 2.28,\n \"2022-09-13\": 2.28,\n \"2022-09-14\": 2.27,\n \"2022-09-15\": 2.28,\n \"2022-09-16\": 2.27,\n \"2022-09-19\": 2.27,\n \"2022-09-20\": 2.26,\n \"2022-09-21\": 2.25,\n \"2022-09-22\": 2.99,\n \"2022-09-23\": 2.99,\n \"2022-09-26\": 2.99,\n \"2022-09-27\": 2.98,\n \"2022-09-28\": 2.98,\n \"2022-09-29\": 2.96,\n \"2022-09-30\": 2.98,\n \"2022-10-03\": 3.0,\n \"2022-10-04\": 3.04,\n \"2022-10-05\": 3.04,\n \"2022-10-06\": 3.05,\n \"2022-10-07\": 3.05,\n \"2022-10-11\": 3.05,\n \"2022-10-12\": 3.04,\n \"2022-10-13\": 3.04,\n \"2022-10-14\": 3.04,\n \"2022-10-17\": 3.05,\n \"2022-10-18\": 3.04,\n \"2022-10-19\": 3.04,\n \"2022-10-20\": 3.03,\n \"2022-10-21\": 3.02,\n \"2022-10-24\": 3.01,\n \"2022-10-25\": 3.02,\n \"2022-10-26\": 3.03,\n \"2022-10-27\": 3.04,\n \"2022-10-28\": 3.05,\n \"2022-10-31\": 3.05,\n \"2022-11-01\": 3.05,\n \"2022-11-02\": 3.05,\n \"2022-11-03\": 3.8,\n \"2022-11-04\": 3.8,\n \"2022-11-07\": 3.78,\n \"2022-11-08\": 3.78,\n \"2022-11-09\": 3.78,\n \"2022-11-10\": 3.78,\n \"2022-11-14\": 3.79,\n \"2022-11-15\": 3.8,\n \"2022-11-16\": 3.81,\n \"2022-11-17\": 3.8,\n \"2022-11-18\": 3.8,\n \"2022-11-21\": 3.8,\n \"2022-11-22\": 3.8,\n \"2022-11-23\": 3.79,\n \"2022-11-25\": 3.8,\n \"2022-11-28\": 3.8,\n \"2022-11-29\": 3.81,\n \"2022-11-30\": 3.82,\n \"2022-12-01\": 3.82,\n \"2022-12-02\": 3.81,\n \"2022-12-05\": 3.81,\n \"2022-12-06\": 3.8,\n \"2022-12-07\": 3.8,\n \"2022-12-08\": 3.8,\n \"2022-12-09\": 3.8,\n \"2022-12-12\": 3.8,\n \"2022-12-13\": 3.8,\n \"2022-12-14\": 3.8,\n \"2022-12-15\": 4.32,\n \"2022-12-16\": 4.32,\n \"2022-12-19\": 4.3,\n \"2022-12-20\": 4.3,\n \"2022-12-21\": 4.3,\n \"2022-12-22\": 4.3,\n \"2022-12-23\": 4.3,\n \"2022-12-27\": 4.3,\n \"2022-12-28\": 4.3,\n \"2022-12-29\": 4.3,\n \"2022-12-30\": 4.3,\n \"2023-01-03\": 4.31,\n \"2023-01-04\": 4.3,\n \"2023-01-05\": 4.31,\n \"2023-01-06\": 4.31,\n \"2023-01-09\": 4.31,\n \"2023-01-10\": 4.31,\n \"2023-01-11\": 4.3,\n \"2023-01-12\": 4.3,\n \"2023-01-13\": 4.3,\n \"2023-01-17\": 4.31,\n \"2023-01-18\": 4.3,\n \"2023-01-19\": 4.31,\n \"2023-01-20\": 4.3,\n \"2023-01-23\": 4.3,\n \"2023-01-24\": 4.3,\n \"2023-01-25\": 4.31,\n \"2023-01-26\": 4.3,\n \"2023-01-27\": 4.3,\n \"2023-01-30\": 4.3,\n \"2023-01-31\": 4.31,\n \"2023-02-01\": 4.31,\n \"2023-02-02\": 4.56,\n \"2023-02-03\": 4.55,\n \"2023-02-06\": 4.55,\n \"2023-02-07\": 4.55,\n \"2023-02-08\": 4.55,\n \"2023-02-09\": 4.55,\n \"2023-02-10\": 4.55,\n \"2023-02-13\": 4.55,\n \"2023-02-14\": 4.55,\n \"2023-02-15\": 4.55,\n \"2023-02-16\": 4.55,\n \"2023-02-17\": 4.55,\n \"2023-02-21\": 4.55,\n \"2023-02-22\": 4.55,\n \"2023-02-23\": 4.55,\n \"2023-02-24\": 4.55,\n \"2023-02-27\": 4.55,\n \"2023-02-28\": 4.55,\n \"2023-03-01\": 4.55,\n \"2023-03-02\": 4.55,\n \"2023-03-03\": 4.55,\n \"2023-03-06\": 4.55,\n \"2023-03-07\": 4.55,\n \"2023-03-08\": 4.55,\n \"2023-03-09\": 4.55,\n \"2023-03-10\": 4.55,\n \"2023-03-13\": 4.55,\n \"2023-03-14\": 4.55,\n \"2023-03-15\": 4.58,\n \"2023-03-16\": 4.57,\n \"2023-03-17\": 4.55,\n \"2023-03-20\": 4.55,\n \"2023-03-21\": 4.55,\n \"2023-03-22\": 4.55,\n \"2023-03-23\": 4.8,\n \"2023-03-24\": 4.8,\n \"2023-03-27\": 4.81,\n \"2023-03-28\": 4.84,\n \"2023-03-29\": 4.83,\n \"2023-03-30\": 4.82,\n \"2023-03-31\": 4.87,\n \"2023-04-03\": 4.84,\n \"2023-04-04\": 4.83,\n \"2023-04-05\": 4.81,\n \"2023-04-06\": 4.81,\n \"2023-04-10\": 4.81,\n \"2023-04-11\": 4.8,\n \"2023-04-12\": 4.8,\n \"2023-04-13\": 4.8,\n \"2023-04-14\": 4.8,\n \"2023-04-17\": 4.8,\n \"2023-04-18\": 4.8,\n \"2023-04-19\": 4.8,\n \"2023-04-20\": 4.8,\n \"2023-04-21\": 4.8,\n \"2023-04-24\": 4.8,\n \"2023-04-25\": 4.8,\n \"2023-04-26\": 4.8,\n \"2023-04-27\": 4.81,\n \"2023-04-28\": 4.81,\n \"2023-05-01\": 4.81,\n \"2023-05-02\": 4.81,\n \"2023-05-03\": 4.81,\n \"2023-05-04\": 5.06,\n \"2023-05-05\": 5.06,\n \"2023-05-08\": 5.06,\n \"2023-05-09\": 5.06,\n \"2023-05-10\": 5.06,\n \"2023-05-11\": 5.05,\n \"2023-05-12\": 5.05,\n \"2023-05-15\": 5.06,\n \"2023-05-16\": 5.05,\n \"2023-05-17\": 5.05,\n \"2023-05-18\": 5.05,\n \"2023-05-19\": 5.05,\n \"2023-05-22\": 5.05,\n \"2023-05-23\": 5.05,\n \"2023-05-24\": 5.05,\n \"2023-05-25\": 5.06,\n \"2023-05-26\": 5.06,\n \"2023-05-30\": 5.06,\n \"2023-05-31\": 5.08,\n \"2023-06-01\": 5.08,\n \"2023-06-02\": 5.07,\n \"2023-06-05\": 5.06,\n \"2023-06-06\": 5.05,\n \"2023-06-07\": 5.05,\n \"2023-06-08\": 5.05,\n \"2023-06-09\": 5.05,\n \"2023-06-12\": 5.05,\n \"2023-06-13\": 5.05,\n \"2023-06-14\": 5.05,\n \"2023-06-15\": 5.06,\n \"2023-06-16\": 5.05,\n \"2023-06-20\": 5.05,\n \"2023-06-21\": 5.05,\n \"2023-06-22\": 5.05,\n \"2023-06-23\": 5.05,\n \"2023-06-26\": 5.05,\n \"2023-06-27\": 5.05,\n \"2023-06-28\": 5.06,\n \"2023-06-29\": 5.06,\n \"2023-06-30\": 5.09,\n \"2023-07-03\": 5.06,\n \"2023-07-05\": 5.06,\n \"2023-07-06\": 5.06,\n \"2023-07-07\": 5.06,\n \"2023-07-10\": 5.06,\n \"2023-07-11\": 5.06,\n \"2023-07-12\": 5.05,\n \"2023-07-13\": 5.06,\n \"2023-07-14\": 5.05,\n \"2023-07-17\": 5.06,\n \"2023-07-18\": 5.06,\n \"2023-07-19\": 5.05,\n \"2023-07-20\": 5.06,\n \"2023-07-21\": 5.05,\n \"2023-07-24\": 5.05,\n \"2023-07-25\": 5.06,\n \"2023-07-26\": 5.06,\n \"2023-07-27\": 5.31,\n \"2023-07-28\": 5.3,\n \"2023-07-31\": 5.31,\n \"2023-08-01\": 5.31,\n \"2023-08-02\": 5.3,\n \"2023-08-03\": 5.3,\n \"2023-08-04\": 5.3,\n \"2023-08-07\": 5.3,\n \"2023-08-08\": 5.3,\n \"2023-08-09\": 5.3,\n \"2023-08-10\": 5.3,\n \"2023-08-11\": 5.3,\n \"2023-08-14\": 5.3,\n \"2023-08-15\": 5.3,\n \"2023-08-16\": 5.3,\n \"2023-08-17\": 5.3,\n \"2023-08-18\": 5.3,\n \"2023-08-21\": 5.3,\n \"2023-08-22\": 5.3,\n \"2023-08-23\": 5.3,\n \"2023-08-24\": 5.3,\n \"2023-08-25\": 5.3,\n \"2023-08-28\": 5.3,\n \"2023-08-29\": 5.3,\n \"2023-08-30\": 5.3,\n \"2023-08-31\": 5.31,\n \"2023-09-01\": 5.31,\n \"2023-09-05\": 5.31,\n \"2023-09-06\": 5.3,\n \"2023-09-07\": 5.31,\n \"2023-09-08\": 5.3,\n \"2023-09-11\": 5.3,\n \"2023-09-12\": 5.3,\n \"2023-09-13\": 5.3,\n \"2023-09-14\": 5.3,\n \"2023-09-15\": 5.31,\n \"2023-09-18\": 5.31,\n \"2023-09-19\": 5.31,\n \"2023-09-20\": 5.3,\n \"2023-09-21\": 5.3,\n \"2023-09-22\": 5.3,\n \"2023-09-25\": 5.31,\n \"2023-09-26\": 5.31,\n \"2023-09-27\": 5.32,\n \"2023-09-28\": 5.31,\n \"2023-09-29\": 5.31,\n \"2023-10-02\": 5.32,\n \"2023-10-03\": 5.33,\n \"2023-10-04\": 5.32,\n \"2023-10-05\": 5.32,\n \"2023-10-06\": 5.31,\n \"2023-10-10\": 5.31,\n \"2023-10-11\": 5.31,\n \"2023-10-12\": 5.31,\n \"2023-10-13\": 5.31,\n \"2023-10-16\": 5.31,\n \"2023-10-17\": 5.31,\n \"2023-10-18\": 5.3,\n \"2023-10-19\": 5.3,\n \"2023-10-20\": 5.3,\n \"2023-10-23\": 5.3,\n \"2023-10-24\": 5.3,\n \"2023-10-25\": 5.3,\n \"2023-10-26\": 5.31,\n \"2023-10-27\": 5.31,\n \"2023-10-30\": 5.31,\n \"2023-10-31\": 5.35,\n \"2023-11-01\": 5.32,\n \"2023-11-02\": 5.33,\n \"2023-11-03\": 5.32,\n \"2023-11-06\": 5.32,\n \"2023-11-07\": 5.32,\n \"2023-11-08\": 5.32,\n \"2023-11-09\": 5.32,\n \"2023-11-10\": 5.32,\n \"2023-11-13\": 5.32,\n \"2023-11-14\": 5.32,\n \"2023-11-15\": 5.32,\n \"2023-11-16\": 5.32,\n \"2023-11-17\": 5.32,\n \"2023-11-20\": 5.31,\n \"2023-11-21\": 5.31,\n \"2023-11-22\": 5.31,\n \"2023-11-24\": 5.32,\n \"2023-11-27\": 5.32,\n \"2023-11-28\": 5.32,\n \"2023-11-29\": 5.31,\n \"2023-11-30\": 5.33,\n \"2023-12-01\": 5.39,\n \"2023-12-04\": 5.37,\n \"2023-12-05\": 5.33,\n \"2023-12-06\": 5.32,\n \"2023-12-07\": 5.32,\n \"2023-12-08\": 5.32,\n \"2023-12-11\": 5.32,\n \"2023-12-12\": 5.31,\n \"2023-12-13\": 5.31,\n \"2023-12-14\": 5.31,\n \"2023-12-15\": 5.32,\n \"2023-12-18\": 5.32,\n \"2023-12-19\": 5.31,\n \"2023-12-20\": 5.31,\n \"2023-12-21\": 5.31,\n \"2023-12-22\": 5.32,\n \"2023-12-26\": 5.35,\n \"2023-12-27\": 5.39,\n \"2023-12-28\": 5.4,\n \"2023-12-29\": 5.38,\n \"2024-01-02\": 5.4,\n \"2024-01-03\": 5.39,\n \"2024-01-04\": 5.32,\n \"2024-01-05\": 5.31,\n \"2024-01-08\": 5.31,\n \"2024-01-09\": 5.31,\n \"2024-01-10\": 5.31,\n \"2024-01-11\": 5.31,\n \"2024-01-12\": 5.31,\n \"2024-01-16\": 5.32,\n \"2024-01-17\": 5.32,\n \"2024-01-18\": 5.31,\n \"2024-01-19\": 5.31,\n \"2024-01-22\": 5.31,\n \"2024-01-23\": 5.31,\n \"2024-01-24\": 5.31,\n \"2024-01-25\": 5.32,\n \"2024-01-26\": 5.32,\n \"2024-01-29\": 5.31,\n \"2024-01-30\": 5.31,\n \"2024-01-31\": 5.32,\n \"2024-02-01\": 5.32,\n \"2024-02-02\": 5.32,\n \"2024-02-05\": 5.31,\n \"2024-02-06\": 5.31,\n \"2024-02-07\": 5.31,\n \"2024-02-08\": 5.31,\n \"2024-02-09\": 5.31,\n \"2024-02-12\": 5.31,\n \"2024-02-13\": 5.31,\n \"2024-02-14\": 5.3,\n \"2024-02-15\": 5.31,\n \"2024-02-16\": 5.3,\n \"2024-02-20\": 5.3,\n \"2024-02-21\": 5.3,\n \"2024-02-22\": 5.3,\n \"2024-02-23\": 5.31,\n \"2024-02-26\": 5.31,\n \"2024-02-27\": 5.31,\n \"2024-02-28\": 5.31,\n \"2024-02-29\": 5.32,\n \"2024-03-01\": 5.31,\n \"2024-03-04\": 5.31,\n \"2024-03-05\": 5.31,\n \"2024-03-06\": 5.31,\n \"2024-03-07\": 5.31,\n \"2024-03-08\": 5.31,\n \"2024-03-11\": 5.31,\n \"2024-03-12\": 5.31,\n \"2024-03-13\": 5.31,\n \"2024-03-14\": 5.31,\n \"2024-03-15\": 5.31,\n \"2024-03-18\": 5.31,\n \"2024-03-19\": 5.31,\n \"2024-03-20\": 5.31,\n \"2024-03-21\": 5.31,\n \"2024-03-22\": 5.31,\n \"2024-03-25\": 5.31,\n \"2024-03-26\": 5.32,\n \"2024-03-27\": 5.33,\n \"2024-03-28\": 5.34,\n \"2024-04-01\": 5.35,\n \"2024-04-02\": 5.34,\n \"2024-04-03\": 5.32,\n \"2024-04-04\": 5.32,\n \"2024-04-05\": 5.32,\n \"2024-04-08\": 5.31,\n \"2024-04-09\": 5.31,\n \"2024-04-10\": 5.31,\n \"2024-04-11\": 5.31,\n \"2024-04-12\": 5.31,\n \"2024-04-15\": 5.32,\n \"2024-04-16\": 5.31,\n \"2024-04-17\": 5.31,\n \"2024-04-18\": 5.3,\n \"2024-04-19\": 5.31,\n \"2024-04-22\": 5.31,\n \"2024-04-23\": 5.31,\n \"2024-04-24\": 5.31,\n \"2024-04-25\": 5.31,\n \"2024-04-26\": 5.32,\n \"2024-04-29\": 5.32,\n \"2024-04-30\": 5.34,\n \"2024-05-01\": 5.32,\n \"2024-05-02\": 5.31,\n \"2024-05-03\": 5.31,\n \"2024-05-06\": 5.31,\n \"2024-05-07\": 5.31,\n \"2024-05-08\": 5.31,\n \"2024-05-09\": 5.31,\n \"2024-05-10\": 5.31,\n \"2024-05-13\": 5.31,\n \"2024-05-14\": 5.31,\n \"2024-05-15\": 5.31,\n \"2024-05-16\": 5.31,\n \"2024-05-17\": 5.31,\n \"2024-05-20\": 5.31,\n \"2024-05-21\": 5.31,\n \"2024-05-22\": 5.31,\n \"2024-05-23\": 5.31,\n \"2024-05-24\": 5.32,\n \"2024-05-28\": 5.32,\n \"2024-05-29\": 5.33,\n \"2024-05-30\": 5.33,\n \"2024-05-31\": 5.34,\n \"2024-06-03\": 5.35,\n \"2024-06-04\": 5.33,\n \"2024-06-05\": 5.33,\n \"2024-06-06\": 5.33,\n \"2024-06-07\": 5.33,\n \"2024-06-10\": 5.32,\n \"2024-06-11\": 5.32,\n \"2024-06-12\": 5.31,\n \"2024-06-13\": 5.31,\n \"2024-06-14\": 5.31,\n \"2024-06-17\": 5.33,\n \"2024-06-18\": 5.33,\n \"2024-06-20\": 5.32,\n \"2024-06-21\": 5.31,\n \"2024-06-24\": 5.31,\n \"2024-06-25\": 5.33,\n \"2024-06-26\": 5.34,\n \"2024-06-27\": 5.34,\n \"2024-06-28\": 5.33,\n \"2024-07-01\": 5.4,\n \"2024-07-02\": 5.35,\n \"2024-07-03\": 5.33,\n \"2024-07-05\": 5.32,\n \"2024-07-08\": 5.32,\n \"2024-07-09\": 5.34,\n \"2024-07-10\": 5.34,\n \"2024-07-11\": 5.34,\n \"2024-07-12\": 5.34,\n \"2024-07-15\": 5.34,\n \"2024-07-16\": 5.35,\n \"2024-07-17\": 5.35,\n \"2024-07-18\": 5.34,\n \"2024-07-19\": 5.34,\n \"2024-07-22\": 5.33,\n \"2024-07-23\": 5.34,\n \"2024-07-24\": 5.34,\n \"2024-07-25\": 5.35,\n \"2024-07-26\": 5.35,\n \"2024-07-29\": 5.33,\n \"2024-07-30\": 5.33,\n \"2024-07-31\": 5.38,\n \"2024-08-01\": 5.35,\n \"2024-08-02\": 5.35,\n \"2024-08-05\": 5.32,\n \"2024-08-06\": 5.33,\n \"2024-08-07\": 5.33,\n \"2024-08-08\": 5.34,\n \"2024-08-09\": 5.34,\n \"2024-08-12\": 5.34,\n \"2024-08-13\": 5.34,\n \"2024-08-14\": 5.33,\n \"2024-08-15\": 5.35,\n \"2024-08-16\": 5.32,\n \"2024-08-19\": 5.32,\n \"2024-08-20\": 5.32,\n \"2024-08-21\": 5.31,\n \"2024-08-22\": 5.31,\n \"2024-08-23\": 5.33,\n \"2024-08-26\": 5.34,\n \"2024-08-27\": 5.35,\n \"2024-08-28\": 5.35,\n \"2024-08-29\": 5.33,\n \"2024-08-30\": 5.32,\n \"2024-09-03\": 5.34,\n \"2024-09-04\": 5.35,\n \"2024-09-05\": 5.35,\n \"2024-09-06\": 5.34,\n \"2024-09-09\": 5.34,\n \"2024-09-10\": 5.33,\n \"2024-09-11\": 5.32,\n \"2024-09-12\": 5.33,\n \"2024-09-13\": 5.33,\n \"2024-09-16\": 5.38,\n \"2024-09-17\": 5.38,\n \"2024-09-18\": 5.33,\n \"2024-09-19\": 4.82,\n \"2024-09-20\": 4.83,\n \"2024-09-23\": 4.83,\n \"2024-09-24\": 4.84,\n \"2024-09-25\": 4.84,\n \"2024-09-26\": 4.83,\n \"2024-09-27\": 4.84,\n \"2024-09-30\": 4.96,\n \"2024-10-01\": 5.05,\n \"2024-10-02\": 4.92,\n \"2024-10-03\": 4.85,\n \"2024-10-04\": 4.83,\n \"2024-10-07\": 4.83,\n \"2024-10-08\": 4.84,\n \"2024-10-09\": 4.83,\n \"2024-10-10\": 4.82,\n \"2024-10-11\": 4.81,\n \"2024-10-15\": 4.86,\n \"2024-10-16\": 4.86,\n \"2024-10-17\": 4.85,\n \"2024-10-18\": 4.84,\n \"2024-10-21\": 4.82,\n \"2024-10-22\": 4.83,\n \"2024-10-23\": 4.83,\n \"2024-10-24\": 4.83,\n \"2024-10-25\": 4.83,\n \"2024-10-28\": 4.82,\n \"2024-10-29\": 4.82,\n \"2024-10-30\": 4.81,\n \"2024-10-31\": 4.9,\n \"2024-11-01\": 4.86,\n \"2024-11-04\": 4.82,\n \"2024-11-05\": 4.82,\n \"2024-11-06\": 4.81,\n \"2024-11-07\": 4.82,\n \"2024-11-08\": 4.6,\n \"2024-11-12\": 4.6,\n \"2024-11-13\": 4.59,\n \"2024-11-14\": 4.58,\n \"2024-11-15\": 4.57,\n \"2024-11-18\": 4.57,\n \"2024-11-19\": 4.57,\n \"2024-11-20\": 4.56,\n \"2024-11-21\": 4.57,\n \"2024-11-22\": 4.57,\n \"2024-11-25\": 4.58,\n \"2024-11-26\": 4.58,\n \"2024-11-27\": 4.57,\n \"2024-11-29\": 4.59,\n \"2024-12-02\": 4.64,\n \"2024-12-03\": 4.64,\n \"2024-12-04\": 4.59,\n \"2024-12-05\": 4.59,\n \"2024-12-06\": 4.6,\n \"2024-12-09\": 4.63,\n \"2024-12-10\": 4.64,\n \"2024-12-11\": 4.62,\n \"2024-12-12\": 4.62,\n \"2024-12-13\": 4.6,\n \"2024-12-16\": 4.65,\n \"2024-12-17\": 4.62,\n \"2024-12-18\": 4.57,\n \"2024-12-19\": 4.3,\n \"2024-12-20\": 4.3,\n \"2024-12-23\": 4.31,\n \"2024-12-24\": 4.4,\n \"2024-12-26\": 4.53,\n \"2024-12-27\": 4.46,\n \"2024-12-30\": 4.37,\n \"2024-12-31\": 4.49,\n \"2025-01-02\": 4.4,\n \"2025-01-03\": 4.31,\n \"2025-01-06\": 4.27,\n \"2025-01-07\": 4.27,\n \"2025-01-08\": 4.29,\n \"2025-01-09\": 4.3,\n \"2025-01-10\": 4.3,\n \"2025-01-13\": 4.29,\n \"2025-01-14\": 4.28,\n \"2025-01-15\": 4.28,\n \"2025-01-16\": 4.29,\n \"2025-01-17\": 4.29,\n \"2025-01-21\": 4.29,\n \"2025-01-22\": 4.3,\n \"2025-01-23\": 4.35,\n \"2025-01-24\": 4.34,\n \"2025-01-27\": 4.34,\n \"2025-01-28\": 4.35,\n \"2025-01-29\": 4.35,\n \"2025-01-30\": 4.36,\n \"2025-01-31\": 4.38,\n \"2025-02-03\": 4.35,\n \"2025-02-04\": 4.33,\n \"2025-02-05\": 4.33,\n \"2025-02-06\": 4.36,\n \"2025-02-07\": 4.35,\n \"2025-02-10\": 4.35,\n \"2025-02-11\": 4.34,\n \"2025-02-12\": 4.32,\n \"2025-02-13\": 4.33,\n \"2025-02-14\": 4.33,\n \"2025-02-18\": 4.37,\n \"2025-02-19\": 4.35,\n \"2025-02-20\": 4.33,\n \"2025-02-21\": 4.34,\n \"2025-02-24\": 4.34,\n \"2025-02-25\": 4.33,\n \"2025-02-26\": 4.33,\n \"2025-02-27\": 4.36,\n \"2025-02-28\": 4.39,\n \"2025-03-03\": 4.33,\n \"2025-03-04\": 4.33,\n \"2025-03-05\": 4.34,\n \"2025-03-06\": 4.35,\n \"2025-03-07\": 4.34,\n \"2025-03-10\": 4.33,\n \"2025-03-11\": 4.32,\n \"2025-03-12\": 4.31,\n \"2025-03-13\": 4.3,\n \"2025-03-14\": 4.3,\n \"2025-03-17\": 4.32,\n \"2025-03-18\": 4.31,\n \"2025-03-19\": 4.29,\n \"2025-03-20\": 4.29,\n \"2025-03-21\": 4.3,\n \"2025-03-24\": 4.31,\n \"2025-03-25\": 4.33,\n \"2025-03-26\": 4.35,\n \"2025-03-27\": 4.36,\n \"2025-03-28\": 4.34,\n \"2025-03-31\": 4.41,\n \"2025-04-01\": 4.39,\n \"2025-04-02\": 4.37,\n \"2025-04-03\": 4.39,\n \"2025-04-04\": 4.35,\n \"2025-04-07\": 4.33,\n \"2025-04-08\": 4.4,\n \"2025-04-09\": 4.42,\n \"2025-04-10\": 4.37,\n \"2025-04-11\": 4.33,\n \"2025-04-14\": 4.33,\n \"2025-04-15\": 4.36,\n \"2025-04-16\": 4.31,\n \"2025-04-17\": 4.32,\n \"2025-04-21\": 4.32,\n \"2025-04-22\": 4.3,\n \"2025-04-23\": 4.28,\n \"2025-04-24\": 4.29,\n \"2025-04-25\": 4.33,\n \"2025-04-28\": 4.36,\n \"2025-04-29\": 4.36,\n \"2025-04-30\": 4.41,\n \"2025-05-01\": 4.39,\n \"2025-05-02\": 4.36,\n \"2025-05-05\": 4.33,\n \"2025-05-06\": 4.32,\n \"2025-05-07\": 4.3,\n \"2025-05-08\": 4.29,\n \"2025-05-09\": 4.28,\n \"2025-05-12\": 4.28,\n \"2025-05-13\": 4.3,\n \"2025-05-14\": 4.29,\n \"2025-05-15\": 4.31,\n \"2025-05-16\": 4.3,\n \"2025-05-19\": 4.29,\n \"2025-05-20\": 4.27,\n \"2025-05-21\": 4.26,\n \"2025-05-22\": 4.26,\n \"2025-05-23\": 4.26,\n \"2025-05-27\": 4.31,\n \"2025-05-28\": 4.33,\n \"2025-05-29\": 4.33,\n \"2025-05-30\": 4.35,\n \"2025-06-02\": 4.35,\n \"2025-06-03\": 4.32,\n \"2025-06-04\": 4.28,\n \"2025-06-05\": 4.29,\n \"2025-06-06\": 4.29,\n \"2025-06-09\": 4.29,\n \"2025-06-10\": 4.28,\n \"2025-06-11\": 4.28,\n \"2025-06-12\": 4.28,\n \"2025-06-13\": 4.28,\n \"2025-06-16\": 4.32,\n \"2025-06-17\": 4.31,\n \"2025-06-18\": 4.28,\n \"2025-06-20\": 4.29,\n \"2025-06-23\": 4.29,\n \"2025-06-24\": 4.3,\n \"2025-06-25\": 4.36,\n \"2025-06-26\": 4.4,\n \"2025-06-27\": 4.39,\n \"2025-06-30\": 4.45,\n \"2025-07-01\": 4.44,\n \"2025-07-02\": 4.4,\n \"2025-07-03\": 4.35,\n \"2025-07-07\": 4.33,\n \"2025-07-08\": 4.34,\n \"2025-07-09\": 4.32,\n \"2025-07-10\": 4.31,\n \"2025-07-11\": 4.31,\n \"2025-07-14\": 4.33,\n \"2025-07-15\": 4.37,\n \"2025-07-16\": 4.34,\n \"2025-07-17\": 4.34,\n \"2025-07-18\": 4.3,\n \"2025-07-21\": 4.28,\n \"2025-07-22\": 4.28,\n \"2025-07-23\": 4.28,\n \"2025-07-24\": 4.3,\n \"2025-07-25\": 4.36,\n \"2025-07-28\": 4.36,\n \"2025-07-29\": 4.36,\n \"2025-07-30\": 4.32,\n \"2025-07-31\": 4.39,\n \"2025-08-01\": 4.34,\n \"2025-08-04\": 4.33,\n \"2025-08-05\": 4.34,\n \"2025-08-06\": 4.34,\n \"2025-08-07\": 4.35,\n \"2025-08-08\": 4.35,\n \"2025-08-11\": 4.34,\n \"2025-08-12\": 4.36,\n \"2025-08-13\": 4.33,\n \"2025-08-14\": 4.34,\n \"2025-08-15\": 4.36,\n \"2025-08-18\": 4.34,\n \"2025-08-19\": 4.33,\n \"2025-08-20\": 4.31,\n \"2025-08-21\": 4.32,\n \"2025-08-22\": 4.36,\n \"2025-08-25\": 4.37,\n \"2025-08-26\": 4.38,\n \"2025-08-27\": 4.36,\n \"2025-08-28\": 4.34,\n \"2025-08-29\": 4.34,\n \"2025-09-02\": 4.39,\n \"2025-09-03\": 4.39,\n \"2025-09-04\": 4.41,\n \"2025-09-05\": 4.42,\n \"2025-09-08\": 4.4,\n \"2025-09-09\": 4.4,\n \"2025-09-10\": 4.39,\n \"2025-09-11\": 4.41,\n \"2025-09-12\": 4.42,\n \"2025-09-15\": 4.51,\n \"2025-09-16\": 4.39,\n \"2025-09-17\": 4.38,\n \"2025-09-18\": 4.14,\n \"2025-09-19\": 4.14,\n \"2025-09-22\": 4.14,\n \"2025-09-23\": 4.12,\n \"2025-09-24\": 4.13,\n \"2025-09-25\": 4.18,\n \"2025-09-26\": 4.16,\n \"2025-09-29\": 4.13,\n \"2025-09-30\": 4.24,\n \"2025-10-01\": 4.2,\n \"2025-10-02\": 4.2,\n \"2025-10-03\": 4.18,\n \"2025-10-06\": 4.15,\n \"2025-10-07\": 4.14,\n \"2025-10-08\": 4.12,\n \"2025-10-09\": 4.13,\n \"2025-10-10\": 4.15,\n \"2025-10-14\": 4.19,\n \"2025-10-15\": 4.29,\n \"2025-10-16\": 4.3,\n \"2025-10-17\": 4.18,\n \"2025-10-20\": 4.16,\n \"2025-10-21\": 4.23,\n \"2025-10-22\": 4.21,\n \"2025-10-23\": 4.24,\n \"2025-10-24\": 4.24,\n \"2025-10-27\": 4.27,\n \"2025-10-28\": 4.31,\n \"2025-10-29\": 4.27,\n \"2025-10-30\": 4.04,\n \"2025-10-31\": 4.22,\n \"2025-11-03\": 4.13,\n \"2025-11-04\": 4.0,\n \"2025-11-05\": 3.91,\n \"2025-11-06\": 3.92,\n \"2025-11-07\": 3.93,\n \"2025-11-10\": 3.95,\n \"2025-11-12\": 3.98,\n \"2025-11-13\": 4.0,\n \"2025-11-14\": 3.95,\n \"2025-11-17\": 4.0,\n \"2025-11-18\": 3.94,\n \"2025-11-19\": 3.91,\n \"2025-11-20\": 3.91,\n \"2025-11-21\": 3.93,\n \"2025-11-24\": 3.96,\n \"2025-11-25\": 4.01,\n \"2025-11-26\": 4.05,\n \"2025-11-28\": 4.12,\n \"2025-12-01\": 4.12,\n \"2025-12-02\": 4.01,\n \"2025-12-03\": 3.95,\n \"2025-12-04\": 3.92,\n \"2025-12-05\": 3.93,\n \"2025-12-08\": 3.95,\n \"2025-12-09\": 3.93,\n \"2025-12-10\": 3.9,\n \"2025-12-11\": 3.66,\n \"2025-12-12\": 3.67,\n \"2025-12-15\": 3.75,\n \"2025-12-16\": 3.69,\n \"2025-12-17\": 3.69,\n \"2025-12-18\": 3.66,\n \"2025-12-19\": 3.66,\n \"2025-12-22\": 3.68,\n \"2025-12-23\": 3.66,\n \"2025-12-24\": 3.66,\n \"2025-12-26\": 3.76,\n \"2025-12-29\": 3.77,\n \"2025-12-30\": 3.71,\n \"2025-12-31\": 3.87,\n \"2026-01-02\": 3.75,\n \"2026-01-05\": 3.7,\n \"2026-01-06\": 3.66,\n \"2026-01-07\": 3.65,\n \"2026-01-08\": 3.64,\n \"2026-01-09\": 3.64,\n \"2026-01-12\": 3.64,\n \"2026-01-13\": 3.65,\n \"2026-01-14\": 3.64,\n \"2026-01-15\": 3.66,\n \"2026-01-16\": 3.65,\n \"2026-01-20\": 3.64,\n \"2026-01-21\": 3.63,\n \"2026-01-22\": 3.64,\n \"2026-01-23\": 3.65,\n \"2026-01-26\": 3.66,\n \"2026-01-27\": 3.66,\n \"2026-01-28\": 3.64,\n \"2026-01-29\": 3.65,\n \"2026-01-30\": 3.68,\n \"2026-02-02\": 3.69,\n \"2026-02-03\": 3.69,\n \"2026-02-04\": 3.65,\n \"2026-02-05\": 3.65,\n \"2026-02-06\": 3.64,\n \"2026-02-09\": 3.63,\n \"2026-02-10\": 3.65,\n \"2026-02-11\": 3.65,\n \"2026-02-12\": 3.65,\n \"2026-02-13\": 3.66,\n \"2026-02-17\": 3.71,\n \"2026-02-18\": 3.73,\n \"2026-02-19\": 3.67,\n \"2026-02-20\": 3.66,\n \"2026-02-23\": 3.66,\n \"2026-02-24\": 3.67,\n \"2026-02-25\": 3.67,\n \"2026-02-26\": 3.67,\n \"2026-02-27\": 3.68,\n \"2026-03-02\": 3.71,\n \"2026-03-03\": 3.7,\n \"2026-03-04\": 3.67,\n \"2026-03-05\": 3.66,\n \"2026-03-06\": 3.65,\n \"2026-03-09\": 3.65,\n \"2026-03-10\": 3.64,\n \"2026-03-11\": 3.64,\n \"2026-03-12\": 3.65,\n \"2026-03-13\": 3.65,\n \"2026-03-16\": 3.7,\n \"2026-03-17\": 3.65,\n \"2026-03-18\": 3.62,\n \"2026-03-19\": 3.62,\n \"2026-03-20\": 3.62,\n \"2026-03-23\": 3.62,\n \"2026-03-24\": 3.63,\n \"2026-03-25\": 3.64,\n \"2026-03-26\": 3.65,\n \"2026-03-27\": 3.63,\n \"2026-03-30\": 3.63,\n \"2026-03-31\": 3.68,\n \"2026-04-01\": 3.65,\n \"2026-04-02\": 3.66,\n \"2026-04-06\": 3.65,\n \"2026-04-07\": 3.62,\n \"2026-04-08\": 3.59,\n \"2026-04-09\": 3.57,\n \"2026-04-10\": 3.61,\n \"2026-04-13\": 3.63,\n \"2026-04-14\": 3.66,\n \"2026-04-15\": 3.72,\n \"2026-04-16\": 3.67,\n \"2026-04-17\": 3.65,\n \"2026-04-20\": 3.63,\n \"2026-04-21\": 3.63,\n \"2026-04-22\": 3.64,\n \"2026-04-23\": 3.65,\n \"2026-04-24\": 3.66,\n \"2026-04-27\": 3.66,\n \"2026-04-28\": 3.64,\n \"2026-04-29\": 3.63,\n \"2026-04-30\": 3.66,\n \"2026-05-01\": 3.64,\n \"2026-05-04\": 3.63,\n \"2026-05-05\": 3.62,\n \"2026-05-06\": 3.61,\n \"2026-05-07\": 3.6,\n \"2026-05-08\": 3.6,\n \"2026-05-11\": 3.6,\n \"2026-05-12\": 3.6,\n \"2026-05-13\": 3.59,\n \"2026-05-14\": 3.56,\n \"2026-05-15\": 3.55,\n \"2026-05-18\": 3.53,\n \"2026-05-19\": 3.51,\n \"2026-05-20\": 3.5,\n \"2026-05-21\": 3.51,\n \"2026-05-22\": 3.55,\n \"2026-05-26\": 3.63,\n \"2026-05-27\": 3.63,\n \"2026-05-28\": 3.62,\n \"2026-05-29\": 3.63,\n \"2026-06-01\": 3.65,\n \"2026-06-02\": 3.63,\n \"2026-06-03\": 3.61,\n \"2026-06-04\": 3.62,\n \"2026-06-05\": 3.63,\n \"2026-06-08\": 3.63,\n \"2026-06-09\": 3.6,\n \"2026-06-10\": 3.59,\n \"2026-06-11\": 3.6,\n \"2026-06-12\": 3.65,\n \"2026-06-15\": 3.69,\n \"2026-06-16\": 3.63,\n \"2026-06-17\": 3.63,\n \"2026-06-18\": 3.62,\n \"2026-06-22\": 3.61,\n \"2026-06-23\": 3.62,\n \"2026-06-24\": 3.62,\n \"2026-06-25\": 3.64,\n \"2026-06-26\": 3.62,\n \"2026-06-29\": 3.62,\n \"2026-06-30\": 3.68,\n \"2026-07-01\": 3.66,\n \"2026-07-02\": 3.64,\n \"2026-07-06\": 3.63,\n \"2026-07-07\": 3.62,\n \"2026-07-08\": 3.58,\n \"2026-07-09\": 3.53,\n \"2026-07-10\": 3.55,\n \"2026-07-13\": 3.6,\n \"2026-07-14\": 3.63,\n \"2026-07-15\": 3.64,\n \"2026-07-16\": 3.62,\n \"2026-07-17\": 3.59,\n \"2026-07-20\": 3.57,\n \"2026-07-21\": 3.61,\n \"2026-07-22\": 3.62,\n \"2026-07-23\": 3.64,\n \"2026-07-24\": 3.64,\n \"2026-07-27\": 3.64,\n \"2026-07-28\": 3.65,\n \"2026-07-29\": 3.65,\n \"2026-07-30\": 3.65,\n \"2026-07-31\": 3.66,\n \"2026-08-03\": 3.65,\n \"2026-08-04\": 3.66,\n \"2026-08-05\": 3.64,\n \"2026-08-06\": 3.65,\n \"2026-08-07\": 3.62,\n \"2026-08-10\": 3.63,\n \"2026-08-11\": 3.64,\n \"2026-08-12\": 3.62,\n \"2026-08-13\": 3.62,\n \"2026-08-14\": 3.62,\n \"2026-08-17\": 3.66,\n \"2026-08-18\": 3.65,\n \"2026-08-19\": 3.62,\n \"2026-08-20\": 3.63,\n \"2026-08-21\": 3.65,\n \"2026-08-24\": 3.65,\n \"2026-08-25\": 3.66,\n \"2026-08-26\": 3.64,\n \"2026-08-27\": 3.64,\n \"2026-08-28\": 3.65,\n \"2026-08-31\": 3.68,\n \"2026-09-01\": 3.66,\n \"2026-09-02\": 3.65,\n \"2026-09-03\": 3.66,\n \"2026-09-04\": 3.65,\n \"2026-09-08\": 3.64,\n \"2026-09-09\": 3.64,\n \"2026-09-10\": 3.62,\n \"2026-09-11\": 3.62,\n \"2026-09-14\": 3.62,\n \"2026-09-15\": 3.64,\n \"2026-09-16\": 3.62,\n \"2026-09-17\": 3.85,\n \"2026-09-18\": 3.85,\n \"2026-09-21\": 3.85,\n \"2026-09-22\": 3.87,\n \"2026-09-23\": 3.87,\n \"2026-09-24\": 3.88,\n \"2026-09-25\": 3.9,\n \"2026-09-28\": 3.9,\n \"2026-09-29\": 3.88,\n \"2026-09-30\": 3.9,\n \"2026-10-01\": 3.87,\n \"2026-10-02\": 3.88,\n \"2026-10-05\": 3.89,\n \"2026-10-06\": 3.9,\n \"2026-10-07\": 3.88,\n};\n","import { z } from \"zod\";\nimport { SOFR_RATES } from \"../data/sofr-rates.ts\";\nimport { TREASURY_RATES } from \"../data/treasury-rates.ts\";\n\nexport const PUBLISHED_RATES_URL =\n \"https://raw.githubusercontent.com/tradeblocks-org/tradeblocks/rates-data/rates.json\";\n\nconst SeriesSchema = z.object({\n unit: z.literal(\"annual-percent\"),\n firstDate: z.string(),\n lastDate: z.string(),\n rates: z.record(z.string(), z.number()),\n});\nconst PublishedRatesSchema = z.object({\n schemaVersion: z.literal(1),\n source: z.literal(\"Federal Reserve Economic Data (FRED), Federal Reserve Bank of St. Louis\"),\n fetchedAt: z.iso.datetime(),\n series: z.object({ DTB3: SeriesSchema, SOFR: SeriesSchema }),\n});\nexport type PublishedRates = z.infer<typeof PublishedRatesSchema>;\n\nfunction validateSeries(\n name: \"DTB3\" | \"SOFR\",\n series: PublishedRates[\"series\"][\"DTB3\"],\n bundled: Record<string, number>,\n): void {\n const keys = Object.keys(series.rates);\n if (!keys.length || series.firstDate !== keys[0] || series.lastDate !== keys.at(-1)) {\n throw new Error(`Invalid published ${name} date range`);\n }\n let previous = \"\";\n for (const date of keys) {\n const rate = series.rates[date];\n const timestamp = Date.parse(`${date}T00:00:00Z`);\n if (\n !/^\\d{4}-\\d{2}-\\d{2}$/.test(date) ||\n !Number.isFinite(timestamp) ||\n new Date(timestamp).toISOString().slice(0, 10) !== date ||\n date <= previous ||\n !Number.isFinite(rate) ||\n !Number.isSafeInteger(Math.round(rate * 100)) ||\n Math.round(rate * 100) / 100 !== rate\n ) {\n throw new Error(`Invalid published ${name} observation: ${date}`);\n }\n previous = date;\n }\n for (const [date, rate] of Object.entries(bundled)) {\n if (series.rates[date] !== rate) {\n throw new Error(`Published ${name} disagrees with bundled rate on ${date}`);\n }\n }\n}\n\nexport function validatePublishedRates(input: unknown): PublishedRates {\n const parsed = PublishedRatesSchema.parse(input);\n validateSeries(\"DTB3\", parsed.series.DTB3, TREASURY_RATES);\n validateSeries(\"SOFR\", parsed.series.SOFR, SOFR_RATES);\n return parsed;\n}\n","/**\n * Risk-Free Rate Lookup Utility\n *\n * Provides date-based lookup for 3-month Treasury bill rates,\n * used as the risk-free rate in Sharpe/Sortino ratio calculations.\n *\n * Data source: FRED DTB3 series (Federal Reserve Economic Data)\n * Rates are stored as annual percentages (e.g., 4.32 = 4.32% annual)\n */\n\nimport { TREASURY_RATES } from \"../data/treasury-rates.ts\";\nimport { SOFR_RATES } from \"../data/sofr-rates.ts\";\nimport { validatePublishedRates } from \"./published-rates.ts\";\n\ninterface ActiveRates {\n treasury: Readonly<Record<string, number>>;\n sofr: Readonly<Record<string, number>>;\n treasuryKeys: string[] | null;\n sofrKeys: string[] | null;\n}\n\n// MCP dist can inline the library in multiple chunks; one realm must still use one rate source.\nconst slot = globalThis as typeof globalThis & { __tradeblocksActiveRates?: ActiveRates };\nconst active = (slot.__tradeblocksActiveRates ??= {\n treasury: TREASURY_RATES,\n sofr: SOFR_RATES,\n treasuryKeys: null,\n sofrKeys: null,\n});\n\n/** Install a validated published superset for both series; invalid input leaves the active rates unchanged. */\nexport function setPublishedRates(input: unknown): void {\n const published = validatePublishedRates(input);\n active.treasury = published.series.DTB3.rates;\n active.sofr = published.series.SOFR.rates;\n active.treasuryKeys = null;\n active.sofrKeys = null;\n}\n\n/** Restore exactly the bundled series (for offline mode or an invalid remote file). */\nexport function clearPublishedRates(): void {\n active.treasury = TREASURY_RATES;\n active.sofr = SOFR_RATES;\n active.treasuryKeys = null;\n active.sofrKeys = null;\n}\n\nexport function getEffectiveRateDate(series: \"DTB3\" | \"SOFR\"): string {\n const keys = series === \"DTB3\" ? getSortedKeys() : getSortedSofrKeys();\n return keys[keys.length - 1];\n}\n\nexport type RateResolution = \"exact\" | \"prior\" | \"clamped-earliest\" | \"stale-after-latest\";\n\nexport interface ResolvedRateByKey {\n requestedDate: string;\n effectiveDate: string;\n /** Integer hundredths of one percentage point (for example 3.60% = 360). */\n annualRateBasisPoints: number;\n resolution: RateResolution;\n}\n\n/**\n * Get all rate date keys sorted in ascending order\n */\nfunction getSortedKeys(): string[] {\n if (!active.treasuryKeys) {\n active.treasuryKeys = Object.keys(active.treasury).sort();\n }\n return active.treasuryKeys;\n}\n\n/**\n * Format a Date object to YYYY-MM-DD string key\n * Uses the date's local values (not UTC) to match US Eastern timezone handling\n */\nexport function formatDateToKey(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Parse a YYYY-MM-DD string to a Date object\n * Creates date in local timezone (matching project convention for US Eastern time)\n */\nfunction parseKeyToDate(key: string): Date {\n const [year, month, day] = key.split(\"-\").map(Number);\n return new Date(year, month - 1, day);\n}\n\n/**\n * Get the risk-free rate (3-month T-bill rate) for a given date.\n *\n * Lookup behavior:\n * - If exact date exists in data, returns that rate\n * - If date is a weekend/holiday (no data), returns most recent prior trading day's rate\n * - If date is before data range, returns earliest available rate\n * - If date is after data range, returns latest available rate\n *\n * @param date - The date to look up the rate for\n * @returns Annual risk-free rate as a percentage (e.g., 4.32 for 4.32%)\n */\nexport function getRiskFreeRate(date: Date): number {\n const keys = getSortedKeys();\n const dateKey = formatDateToKey(date);\n\n // Direct lookup first (most common case for trading days)\n if (active.treasury[dateKey] !== undefined) {\n return active.treasury[dateKey];\n }\n\n // Date is before our data range - return earliest rate\n if (dateKey < keys[0]) {\n return active.treasury[keys[0]];\n }\n\n // Date is after our data range - return latest rate\n if (dateKey > keys[keys.length - 1]) {\n return active.treasury[keys[keys.length - 1]];\n }\n\n // Date is within range but not found (weekend/holiday)\n // Binary search to find the nearest prior trading day\n let left = 0;\n let right = keys.length - 1;\n\n while (left < right) {\n const mid = Math.floor((left + right + 1) / 2);\n if (keys[mid] <= dateKey) {\n left = mid;\n } else {\n right = mid - 1;\n }\n }\n\n // Return the rate from the most recent prior trading day\n return active.treasury[keys[left]];\n}\n\nfunction getSortedSofrKeys(): string[] {\n if (!active.sofrKeys) {\n active.sofrKeys = Object.keys(active.sofr).sort();\n }\n return active.sofrKeys;\n}\n\nfunction resolveRateByKey(\n rates: Readonly<Record<string, number>>,\n keys: readonly string[],\n requestedDate: string,\n): ResolvedRateByKey {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(requestedDate)) {\n throw new TypeError(`Rate date must be YYYY-MM-DD: ${JSON.stringify(requestedDate)}`);\n }\n let effectiveDate: string;\n let resolution: RateResolution;\n if (rates[requestedDate] !== undefined) {\n effectiveDate = requestedDate;\n resolution = \"exact\";\n } else if (requestedDate < keys[0]) {\n effectiveDate = keys[0];\n resolution = \"clamped-earliest\";\n } else if (requestedDate > keys[keys.length - 1]) {\n effectiveDate = keys[keys.length - 1];\n resolution = \"stale-after-latest\";\n } else {\n let left = 0;\n let right = keys.length - 1;\n while (left < right) {\n const mid = Math.floor((left + right + 1) / 2);\n if (keys[mid] <= requestedDate) left = mid;\n else right = mid - 1;\n }\n effectiveDate = keys[left];\n resolution = \"prior\";\n }\n const annualRateBasisPoints = Math.round(rates[effectiveDate] * 100);\n if (\n !Number.isSafeInteger(annualRateBasisPoints) ||\n annualRateBasisPoints / 100 !== rates[effectiveDate]\n ) {\n throw new Error(`Rate table value is not exact to one basis point: ${effectiveDate}`);\n }\n return { requestedDate, effectiveDate, annualRateBasisPoints, resolution };\n}\n\n/** Resolve SOFR with explicit prior-day and stale-tail semantics. */\nexport function resolveSofrRateByKey(dateKey: string): ResolvedRateByKey {\n return resolveRateByKey(active.sofr, getSortedSofrKeys(), dateKey);\n}\n\n/** Resolve the 3-month Treasury rate with explicit prior-day and stale-tail semantics. */\nexport function resolveTreasuryRateByKey(dateKey: string): ResolvedRateByKey {\n return resolveRateByKey(active.treasury, getSortedKeys(), dateKey);\n}\n\n/**\n * Get the SOFR overnight rate for a date specified as a YYYY-MM-DD string key.\n *\n * Behavior mirrors getRiskFreeRateByKey: exact lookup, then nearest prior\n * trading day via binary search, with edge-clamping to the available range.\n *\n * Use this when computing option greeks under the SOFR + q=0 convention.\n * Use getRiskFreeRateByKey instead for portfolio Sharpe/Sortino calculations.\n *\n * @param dateKey - The date as YYYY-MM-DD string\n * @returns Annual SOFR rate as a percentage (e.g., 3.60 for 3.60%)\n */\nexport function getSofrRateByKey(dateKey: string): number {\n return resolveSofrRateByKey(dateKey).annualRateBasisPoints / 100;\n}\n\n/**\n * Get the earliest date that has rate data available.\n *\n * @returns Date object for the first available rate date\n */\nexport function getEarliestRateDate(): Date {\n const keys = getSortedKeys();\n return parseKeyToDate(keys[0]);\n}\n\n/**\n * Get the latest date that has rate data available.\n *\n * @returns Date object for the last available rate date\n */\nexport function getLatestRateDate(): Date {\n const keys = getSortedKeys();\n return parseKeyToDate(keys[keys.length - 1]);\n}\n\n/**\n * Get the date range of available rate data.\n *\n * @returns Object with start and end dates\n */\nexport function getRateDataRange(): { start: Date; end: Date } {\n return {\n start: getEarliestRateDate(),\n end: getLatestRateDate(),\n };\n}\n\n/**\n * Get the total number of rate entries in the dataset.\n * Useful for data validation and reporting.\n *\n * @returns Number of daily rate entries\n */\nexport function getRateEntryCount(): number {\n return getSortedKeys().length;\n}\n\n/**\n * Get the risk-free rate for a date specified as a YYYY-MM-DD string key.\n * Avoids Date parsing issues by working directly with string keys.\n *\n * @param dateKey - The date as YYYY-MM-DD string\n * @returns Annual risk-free rate as a percentage (e.g., 4.32 for 4.32%)\n */\nexport function getRiskFreeRateByKey(dateKey: string): number {\n return resolveTreasuryRateByKey(dateKey).annualRateBasisPoints / 100;\n}\n","/**\n * Performance Snapshot Cache\n *\n * Caches pre-calculated performance snapshots in IndexedDB\n * to avoid expensive recalculation on every page load.\n */\n\nimport type { PortfolioStats } from \"../models/portfolio-stats.ts\";\nimport type { Trade } from \"../models/trade.ts\";\nimport type { DailyLogEntry } from \"../models/daily-log.ts\";\nimport type { SnapshotChartData } from \"../services/performance-snapshot.ts\";\nimport type { MFEMAEDataPoint } from \"../calculations/mfe-mae.ts\";\nimport { promisifyRequest, STORES, withReadTransaction, withWriteTransaction } from \"./index.ts\";\nimport { getEffectiveRateDate } from \"../utils/risk-free-rate.ts\";\nimport {\n DATED_ROW_DAY_FIELDS,\n decodeCalendarDays,\n encodeCalendarDays,\n type StoredCalendarDays,\n TRADE_DAY_FIELDS,\n type TradeDayField,\n} from \"./calendar-days.ts\";\n\n/**\n * Cache entry for performance snapshot\n */\ninterface PerformanceSnapshotCache {\n id: string; // Format: `performance_snapshot_v4_${blockId}`\n blockId: string;\n calculationType: \"performance_snapshot\";\n portfolioStats: PortfolioStats;\n chartData: Omit<SnapshotChartData, \"mfeMaeData\"> & {\n mfeMaeData: StoredCalendarDays<MFEMAEDataPoint, \"date\">[];\n };\n filteredTrades: StoredCalendarDays<Trade, TradeDayField>[];\n filteredDailyLogs: StoredCalendarDays<DailyLogEntry, \"date\">[];\n calculatedAt: Date;\n riskFreeRatesThrough: string;\n}\n\n/**\n * Public interface for cached snapshot data\n */\nexport interface CachedPerformanceSnapshot {\n portfolioStats: PortfolioStats;\n chartData: SnapshotChartData;\n filteredTrades: Trade[];\n filteredDailyLogs: DailyLogEntry[];\n calculatedAt: Date;\n}\n\n/**\n * Generate the cache ID for a block\n */\nfunction getCacheId(blockId: string): string {\n return `performance_snapshot_v4_${blockId}`;\n}\n\n/**\n * Store pre-calculated performance snapshot for a block\n */\nexport async function storePerformanceSnapshotCache(\n blockId: string,\n snapshot: {\n portfolioStats: PortfolioStats;\n chartData: SnapshotChartData;\n filteredTrades: Trade[];\n filteredDailyLogs: DailyLogEntry[];\n },\n): Promise<void> {\n const cacheEntry: PerformanceSnapshotCache = {\n id: getCacheId(blockId),\n blockId,\n calculationType: \"performance_snapshot\",\n portfolioStats: snapshot.portfolioStats,\n chartData: {\n ...snapshot.chartData,\n mfeMaeData: snapshot.chartData.mfeMaeData.map((point) =>\n encodeCalendarDays(point, DATED_ROW_DAY_FIELDS),\n ),\n },\n filteredTrades: snapshot.filteredTrades.map((trade) =>\n encodeCalendarDays(trade, TRADE_DAY_FIELDS),\n ),\n filteredDailyLogs: snapshot.filteredDailyLogs.map((log) =>\n encodeCalendarDays(log, DATED_ROW_DAY_FIELDS),\n ),\n calculatedAt: new Date(),\n riskFreeRatesThrough: getEffectiveRateDate(\"DTB3\"),\n };\n\n await withWriteTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n await promisifyRequest(store.put(cacheEntry));\n });\n}\n\n/**\n * Get cached performance snapshot for a block\n * Returns null if cache doesn't exist\n */\nexport async function getPerformanceSnapshotCache(\n blockId: string,\n): Promise<CachedPerformanceSnapshot | null> {\n return withReadTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n const cacheId = getCacheId(blockId);\n const result = await promisifyRequest(store.get(cacheId));\n\n if (!result || result.calculationType !== \"performance_snapshot\") {\n return null;\n }\n\n const cache = result as PerformanceSnapshotCache;\n if (cache.riskFreeRatesThrough !== getEffectiveRateDate(\"DTB3\")) return null;\n\n return {\n portfolioStats: cache.portfolioStats,\n chartData: {\n ...cache.chartData,\n mfeMaeData: cache.chartData.mfeMaeData.map((point) =>\n decodeCalendarDays<MFEMAEDataPoint, \"date\">(point, DATED_ROW_DAY_FIELDS),\n ),\n },\n filteredTrades: cache.filteredTrades.map((trade) =>\n decodeCalendarDays<Trade, TradeDayField>(trade, TRADE_DAY_FIELDS),\n ),\n filteredDailyLogs: cache.filteredDailyLogs.map((log) =>\n decodeCalendarDays<DailyLogEntry, \"date\">(log, DATED_ROW_DAY_FIELDS),\n ),\n calculatedAt: new Date(cache.calculatedAt),\n };\n });\n}\n\n/**\n * Delete cached performance snapshot for a block\n */\nexport async function deletePerformanceSnapshotCache(blockId: string): Promise<void> {\n await withWriteTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n const cacheId = getCacheId(blockId);\n\n // Check if entry exists before trying to delete\n const existing = await promisifyRequest(store.get(cacheId));\n if (existing) {\n await promisifyRequest(store.delete(cacheId));\n }\n });\n}\n\n/**\n * Check if performance snapshot cache exists for a block\n */\nexport async function hasPerformanceSnapshotCache(blockId: string): Promise<boolean> {\n return withReadTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n const cacheId = getCacheId(blockId);\n const result = await promisifyRequest(store.get(cacheId));\n return result?.calculationType === \"performance_snapshot\";\n });\n}\n","/**\n * Trades Store - CRUD operations for trade data\n */\n\nimport type { Trade } from \"../models/trade.ts\";\nimport { combineAllLegGroups, type CombinedTrade } from \"../utils/combine-leg-groups.ts\";\nimport {\n INDEXES,\n promisifyRequest,\n STORES,\n withReadTransaction,\n withWriteTransaction,\n} from \"./index.ts\";\nimport {\n deleteCombinedTradesCache,\n getCombinedTradesCache,\n storeCombinedTradesCache,\n} from \"./combined-trades-cache.ts\";\nimport { deletePerformanceSnapshotCache } from \"./performance-snapshot-cache.ts\";\nimport { clearUnverifiedCalendarDays } from \"./blocks-store.ts\";\nimport {\n decodeCalendarDays,\n encodeCalendarDay,\n encodeCalendarDays,\n type StoredCalendarDays,\n TRADE_DAY_FIELDS,\n type TradeDayField,\n} from \"./calendar-days.ts\";\n\n// Track in-flight combined cache writes to avoid redundant work when multiple callers miss the cache simultaneously.\nconst combinedCacheInflight = new Map<string, Promise<void>>();\n\n/**\n * Extended trade with block association\n */\nexport interface StoredTrade extends Trade {\n blockId: string;\n id?: number; // Auto-generated by IndexedDB\n}\n\ntype PersistedTrade = StoredCalendarDays<StoredTrade, TradeDayField>;\n\nconst fromPersisted = (trades: PersistedTrade[]): StoredTrade[] =>\n trades.map((trade) => decodeCalendarDays<StoredTrade, TradeDayField>(trade, TRADE_DAY_FIELDS));\n\n/**\n * Add trades for a block (batch operation)\n */\nexport async function addTrades(blockId: string, trades: Trade[]): Promise<void> {\n if (trades.length === 0) return;\n\n await withWriteTransaction(STORES.TRADES, async (transaction) => {\n const store = transaction.objectStore(STORES.TRADES);\n\n // Use Promise.all for better performance with large datasets\n const promises = trades.map((trade) =>\n promisifyRequest(store.add(encodeCalendarDays({ ...trade, blockId }, TRADE_DAY_FIELDS))),\n );\n\n await Promise.all(promises);\n });\n\n // Invalidate caches since trades changed\n await deleteCombinedTradesCache(blockId);\n await deletePerformanceSnapshotCache(blockId);\n}\n\n/**\n * Get all trades for a block\n */\nexport async function getTradesByBlock(blockId: string): Promise<StoredTrade[]> {\n return withReadTransaction(STORES.TRADES, async (transaction) => {\n const store = transaction.objectStore(STORES.TRADES);\n const index = store.index(INDEXES.TRADES_BY_BLOCK);\n const result: PersistedTrade[] = await promisifyRequest(index.getAll(blockId));\n\n // Chronological order: `YYYY-MM-DD` days sort as text, then by time opened.\n result.sort((a, b) => {\n if (a.dateOpened !== b.dateOpened) return a.dateOpened < b.dateOpened ? -1 : 1;\n return a.timeOpened.localeCompare(b.timeOpened);\n });\n return fromPersisted(result);\n });\n}\n\n/**\n * Get all trades for a block with optional leg group combining\n *\n * Uses cached combined trades when available for better performance.\n * Falls back to on-demand calculation if cache is missing.\n *\n * @param blockId - Block ID to fetch trades for\n * @param options.combineLegGroups - Whether to combine trades with same entry timestamp\n * @param options.skipCache - Force recalculation (bypass cache)\n * @returns Array of trades (combined or raw)\n */\nexport async function getTradesByBlockWithOptions(\n blockId: string,\n options: { combineLegGroups?: boolean; skipCache?: boolean } = {},\n): Promise<(StoredTrade | (CombinedTrade & { blockId: string }))[]> {\n // If combining is enabled, check cache FIRST before fetching raw trades\n // This avoids the expensive raw trade fetch when we have cached data\n if (options.combineLegGroups && !options.skipCache) {\n const cachedTrades = await getCombinedTradesCache(blockId);\n if (cachedTrades) {\n // Add blockId back to cached trades\n return cachedTrades.map((trade) => ({ ...trade, blockId }));\n }\n }\n\n // Fetch raw trades (only if not combining, or cache miss)\n const trades = await getTradesByBlock(blockId);\n\n if (!options.combineLegGroups) {\n return trades;\n }\n\n // Cache miss: calculate combined trades on-demand\n const tradesWithoutBlockId = trades.map((storedTrade) => {\n const { blockId: _ignored, ...trade } = storedTrade;\n void _ignored;\n return trade as Trade;\n });\n const combined = combineAllLegGroups(tradesWithoutBlockId);\n\n queueCombinedTradesCache(blockId, combined);\n\n // Add blockId back to combined trades\n return combined.map((trade) => ({ ...trade, blockId }));\n}\n\nfunction queueCombinedTradesCache(blockId: string, combinedTrades: CombinedTrade[]) {\n if (combinedCacheInflight.has(blockId)) {\n return;\n }\n\n const task = storeCombinedTradesCache(blockId, combinedTrades)\n .catch((err) => {\n console.warn(\"Failed to cache combined trades:\", err);\n })\n .finally(() => {\n combinedCacheInflight.delete(blockId);\n });\n\n combinedCacheInflight.set(blockId, task);\n}\n\n/**\n * Get trades opened on the calendar days from `startDate` through `endDate` (inclusive)\n */\nexport async function getTradesByDateRange(\n blockId: string,\n startDate: Date,\n endDate: Date,\n): Promise<StoredTrade[]> {\n return withReadTransaction(STORES.TRADES, async (transaction) => {\n const store = transaction.objectStore(STORES.TRADES);\n const index = store.index(\"composite_block_date\");\n\n const range = IDBKeyRange.bound(\n [blockId, encodeCalendarDay(startDate)],\n [blockId, encodeCalendarDay(endDate)],\n );\n return fromPersisted(await promisifyRequest(index.getAll(range)));\n });\n}\n\n/**\n * Get trades by strategy for a block\n */\nexport async function getTradesByStrategy(\n blockId: string,\n strategy: string,\n): Promise<StoredTrade[]> {\n return withReadTransaction(STORES.TRADES, async (transaction) => {\n const store = transaction.objectStore(STORES.TRADES);\n const blockIndex = store.index(INDEXES.TRADES_BY_BLOCK);\n const blockTrades: PersistedTrade[] = await promisifyRequest(blockIndex.getAll(blockId));\n\n // Filter by strategy (IndexedDB doesn't support compound queries easily)\n return fromPersisted(blockTrades.filter((trade) => trade.strategy === strategy));\n });\n}\n\n/**\n * Get unique strategies for a block\n */\nexport async function getStrategiesByBlock(blockId: string): Promise<string[]> {\n const trades = await getTradesByBlock(blockId);\n const strategies = new Set(trades.map((trade) => trade.strategy));\n return Array.from(strategies).sort();\n}\n\n/**\n * Get trade count by block\n */\nexport async function getTradeCountByBlock(blockId: string): Promise<number> {\n return withReadTransaction(STORES.TRADES, async (transaction) => {\n const store = transaction.objectStore(STORES.TRADES);\n const index = store.index(INDEXES.TRADES_BY_BLOCK);\n const result = await promisifyRequest(index.count(blockId));\n return result;\n });\n}\n\n/**\n * Delete all trades for a block\n */\nexport async function deleteTradesByBlock(blockId: string): Promise<void> {\n await withWriteTransaction([STORES.TRADES, STORES.BLOCKS], async (transaction) => {\n const store = transaction.objectStore(STORES.TRADES);\n const index = store.index(INDEXES.TRADES_BY_BLOCK);\n const request = index.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n request.onerror = () => reject(request.error);\n });\n await clearUnverifiedCalendarDays(transaction, blockId, STORES.TRADES);\n });\n\n // Invalidate caches since trades changed\n await deleteCombinedTradesCache(blockId);\n await deletePerformanceSnapshotCache(blockId);\n}\n\n/**\n * Update trades for a block (replace all)\n */\nexport async function updateTradesForBlock(blockId: string, trades: Trade[]): Promise<void> {\n await withWriteTransaction([STORES.TRADES, STORES.BLOCKS], async (transaction) => {\n // First delete existing trades\n const store = transaction.objectStore(STORES.TRADES);\n const index = store.index(INDEXES.TRADES_BY_BLOCK);\n const deleteRequest = index.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n deleteRequest.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n deleteRequest.onerror = () => reject(deleteRequest.error);\n });\n\n // Then add new trades\n const promises = trades.map((trade) =>\n promisifyRequest(store.add(encodeCalendarDays({ ...trade, blockId }, TRADE_DAY_FIELDS))),\n );\n\n await Promise.all(promises);\n await clearUnverifiedCalendarDays(transaction, blockId, STORES.TRADES);\n });\n\n // Invalidate caches since trades changed\n await deleteCombinedTradesCache(blockId);\n await deletePerformanceSnapshotCache(blockId);\n}\n\n/**\n * Get trade statistics for a block (aggregated)\n */\nexport async function getTradeStatistics(blockId: string): Promise<{\n totalTrades: number;\n totalPl: number;\n winningTrades: number;\n losingTrades: number;\n totalCommissions: number;\n dateRange: { start: Date | null; end: Date | null };\n strategies: string[];\n}> {\n const trades = await getTradesByBlock(blockId);\n\n if (trades.length === 0) {\n return {\n totalTrades: 0,\n totalPl: 0,\n winningTrades: 0,\n losingTrades: 0,\n totalCommissions: 0,\n dateRange: { start: null, end: null },\n strategies: [],\n };\n }\n\n const totalTrades = trades.length;\n const totalPl = trades.reduce((sum, trade) => sum + trade.pl, 0);\n const winningTrades = trades.filter((trade) => trade.pl > 0).length;\n const losingTrades = trades.filter((trade) => trade.pl < 0).length;\n const totalCommissions = trades.reduce(\n (sum, trade) => sum + trade.openingCommissionsFees + trade.closingCommissionsFees,\n 0,\n );\n\n // Get date range\n const dates = trades.map((trade) => new Date(trade.dateOpened));\n const start = new Date(Math.min(...dates.map((d) => d.getTime())));\n const end = new Date(Math.max(...dates.map((d) => d.getTime())));\n\n // Get unique strategies\n const strategies = Array.from(new Set(trades.map((trade) => trade.strategy))).sort();\n\n return {\n totalTrades,\n totalPl,\n winningTrades,\n losingTrades,\n totalCommissions,\n dateRange: { start, end },\n strategies,\n };\n}\n\n/**\n * Search trades by text (strategy, legs, reason for close)\n */\nexport async function searchTrades(blockId: string, query: string): Promise<StoredTrade[]> {\n const trades = await getTradesByBlock(blockId);\n const lowerQuery = query.toLowerCase();\n\n return trades.filter(\n (trade) =>\n trade.strategy.toLowerCase().includes(lowerQuery) ||\n trade.legs.toLowerCase().includes(lowerQuery) ||\n (trade.reasonForClose && trade.reasonForClose.toLowerCase().includes(lowerQuery)),\n );\n}\n\n/**\n * Get trades with pagination\n */\nexport async function getTradesPage(\n blockId: string,\n offset: number,\n limit: number,\n): Promise<{ trades: StoredTrade[]; total: number }> {\n const allTrades = await getTradesByBlock(blockId);\n const total = allTrades.length;\n const trades = allTrades.slice(offset, offset + limit);\n\n return { trades, total };\n}\n","import type { Trade } from \"../models/trade.ts\";\n\nexport const MIN_TRADES_PER_YEAR = 10;\nconst MS_PER_DAY = 1000 * 60 * 60 * 24;\n\n/**\n * Estimate annual trade frequency from a sample of trades.\n *\n * Ensures realistic pacing for strategy-filtered simulations where the global\n * portfolio frequency would otherwise overstate the number of opportunities.\n */\nexport function estimateTradesPerYear(sampleTrades: Trade[], fallback: number): number {\n if (sampleTrades.length < 2) {\n return Math.max(MIN_TRADES_PER_YEAR, fallback);\n }\n\n const sortedTrades = [...sampleTrades].sort(\n (a, b) => a.dateOpened.getTime() - b.dateOpened.getTime(),\n );\n\n const firstDate = sortedTrades[0].dateOpened;\n const lastDate = sortedTrades[sortedTrades.length - 1].dateOpened;\n const daysElapsed = (lastDate.getTime() - firstDate.getTime()) / MS_PER_DAY;\n\n if (daysElapsed <= 0) {\n return Math.max(MIN_TRADES_PER_YEAR, fallback);\n }\n\n const yearsElapsed = daysElapsed / 365.25;\n if (yearsElapsed < 0.01) {\n return Math.max(MIN_TRADES_PER_YEAR, fallback);\n }\n\n const computed = Math.round(sampleTrades.length / yearsElapsed);\n return Math.max(MIN_TRADES_PER_YEAR, computed);\n}\n","/**\n * Static Dataset Matcher\n *\n * Matches trades to static dataset rows based on configurable matching strategies.\n * Used for correlating trades with market data (VIX, SPX, etc.) at trade entry time.\n */\n\nimport type { Trade } from \"../models/trade.ts\";\nimport type {\n StaticDataset,\n StaticDatasetRow,\n MatchStrategy,\n DatasetMatchResult,\n DatasetMatchStats,\n} from \"../models/static-dataset.ts\";\n\n/** Refuse incomplete timing declarations rather than silently omitting a user field. */\nexport function validateDatasetTiming(dataset: StaticDataset, hasDateOnly: boolean): void {\n if (dataset.knownBy !== undefined && !/^([01]\\d|2[0-3]):[0-5]\\d$/.test(dataset.knownBy)) {\n throw new Error(\"Known-by time must be HH:mm Eastern Time\");\n }\n for (const column of Object.keys(dataset.columnTiming ?? {})) {\n if (!dataset.columns.includes(column)) throw new Error(`Unknown dataset column: ${column}`);\n }\n for (const column of dataset.columns) {\n const timing = dataset.columnTiming?.[column];\n if (timing !== \"open\" && timing !== \"close\")\n throw new Error(`Declare open or close timing for ${column}`);\n if (hasDateOnly && timing === \"open\" && !dataset.knownBy) {\n throw new Error(`Date-only open column ${column} requires a known-by time (ET)`);\n }\n }\n}\n\n/** Date-only close is available from the following calendar day, never on D. */\nexport function getDatasetValueAvailableAt(\n dataset: StaticDataset,\n row: Pick<StaticDatasetRow, \"timestamp\" | \"dateOnly\">,\n column: string,\n): Date {\n if (!dataset.columns.includes(column)) throw new Error(`Unknown dataset column: ${column}`);\n if (dataset.timingMode !== \"declared\") return new Date(row.timestamp);\n const timing = dataset.columnTiming?.[column];\n if (timing !== \"close\" && timing !== \"open\")\n throw new Error(`Declare open or close timing for ${column}`);\n if (!(row.dateOnly ?? dataset.dateOnly)) return new Date(row.timestamp);\n const day = getDateOnly(new Date(row.timestamp));\n if (timing === \"open\") {\n if (!dataset.knownBy || !/^([01]\\d|2[0-3]):[0-5]\\d$/.test(dataset.knownBy)) {\n throw new Error(`Date-only open column ${column} requires a known-by time (ET)`);\n }\n return combineDateAndTime(new Date(`${day}T00:00:00Z`), dataset.knownBy);\n }\n const next = new Date(`${day}T00:00:00Z`);\n next.setUTCDate(next.getUTCDate() + 1);\n return combineDateAndTime(next, \"00:00\");\n}\n\n// Dataset metadata and row arrays are immutable snapshots; timing edits replace metadata.\ntype AvailabilityIndex = Array<{ row: StaticDatasetRow; time: number }>;\nconst availabilityIndexes = new WeakMap<\n StaticDataset,\n WeakMap<StaticDatasetRow[], Map<string, AvailabilityIndex>>\n>();\n\n/** Pure causal join, shared by browser analysis and server dataset consumers. */\nexport function resolveDatasetColumnAtTime(\n dataset: StaticDataset,\n rows: StaticDatasetRow[],\n column: string,\n entryTime: Date,\n): { value: number | string; row: StaticDatasetRow; availableAt: Date } | null {\n if (!dataset.columns.includes(column)) throw new Error(`Unknown dataset column: ${column}`);\n let rowIndexes = availabilityIndexes.get(dataset);\n if (!rowIndexes) {\n rowIndexes = new WeakMap();\n availabilityIndexes.set(dataset, rowIndexes);\n }\n let columns = rowIndexes.get(rows);\n if (!columns) {\n columns = new Map();\n rowIndexes.set(rows, columns);\n }\n let index = columns.get(column);\n if (!index) {\n index = rows\n .filter((row) => {\n const value = row.values[column];\n return (\n value !== undefined &&\n value !== null &&\n (typeof value !== \"string\" || value.trim() !== \"\")\n );\n })\n .map((row) => ({\n row,\n time: getDatasetValueAvailableAt(dataset, row, column).getTime(),\n }))\n .sort((a, b) => a.time - b.time);\n columns.set(column, index);\n }\n let left = 0;\n let right = index.length;\n const time = entryTime.getTime();\n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n if (index[mid].time <= time) left = mid + 1;\n else right = mid;\n }\n if (!left) return null;\n const match = index[left - 1];\n return { value: match.row.values[column], row: match.row, availableAt: new Date(match.time) };\n}\n\nfunction matchDatasetValues(\n trade: Trade,\n dataset: StaticDataset,\n rows: StaticDatasetRow[],\n): StaticDatasetRow | null {\n if (dataset.timingMode !== \"declared\") {\n return matchTradeToDataset(trade, rows, dataset.matchStrategy);\n }\n const entry = combineDateAndTime(trade.dateOpened, trade.timeOpened);\n const values: Record<string, number | string> = {};\n let source: StaticDatasetRow | null = null;\n for (const column of dataset.columns) {\n const match = resolveDatasetColumnAtTime(dataset, rows, column, entry);\n if (!match) continue;\n values[column] = match.value;\n source = match.row;\n }\n return source ? { ...source, values } : null;\n}\n/**\n * Combine trade date and time into a single timestamp\n *\n * IMPORTANT: Trade dates from CSV parsing are stored as UTC midnight (e.g., 2025-03-18T00:00:00Z)\n * because JavaScript parses YYYY-MM-DD format as UTC. The time string is in Eastern Time\n * (US market time from the trading platform).\n *\n * This function handles both:\n * 1. UTC midnight dates (from ISO string parsing) - uses UTC methods to extract calendar date\n * 2. Local midnight dates (from new Date(y,m,d)) - uses local methods to extract calendar date\n *\n * We then create the timestamp treating the time as Eastern Time, ensuring matching works\n * correctly regardless of the user's local timezone.\n */\nexport function combineDateAndTime(dateOpened: Date, timeOpened: string): Date {\n const d = new Date(dateOpened);\n\n // Determine if this is a UTC midnight date (from ISO string parsing)\n // or a local midnight date (from new Date(y,m,d))\n const isUtcMidnight =\n d.getUTCHours() === 0 &&\n d.getUTCMinutes() === 0 &&\n d.getUTCSeconds() === 0 &&\n d.getUTCMilliseconds() === 0;\n\n // Extract calendar date using appropriate methods based on how date was created\n let year: number;\n let month: number;\n let day: number;\n\n if (isUtcMidnight) {\n // Date was created from ISO string (e.g., new Date('2025-03-18'))\n // Use UTC methods to get the calendar date\n year = d.getUTCFullYear();\n month = d.getUTCMonth();\n day = d.getUTCDate();\n } else {\n // Date was created from components (e.g., new Date(2024, 0, 15))\n // Use local methods to get the calendar date\n year = d.getFullYear();\n month = d.getMonth();\n day = d.getDate();\n }\n\n // Parse time string (HH:mm:ss or H:mm:ss)\n let hours = 0;\n let minutes = 0;\n let seconds = 0;\n\n const timeParts = timeOpened.split(\":\");\n if (timeParts.length >= 2) {\n hours = parseInt(timeParts[0], 10) || 0;\n minutes = parseInt(timeParts[1], 10) || 0;\n seconds = timeParts.length > 2 ? parseInt(timeParts[2], 10) || 0 : 0;\n }\n\n // Create the timestamp in UTC, treating the input time as Eastern Time\n // Eastern Time is UTC-5 (EST) or UTC-4 (EDT)\n const utcDate = Date.UTC(year, month, day, hours, minutes, seconds, 0);\n\n // Get the Eastern Time offset for this date (handles DST correctly)\n const testDate = new Date(utcDate);\n const etOffset = getEasternTimeOffset(testDate);\n\n // Convert Eastern Time to UTC by subtracting the offset\n // (offset is negative for west of UTC, so we subtract)\n return new Date(utcDate - etOffset * 60 * 1000);\n}\n\n/**\n * Get the Eastern Time offset in minutes for a given date\n * Returns the offset from UTC in minutes (e.g., -300 for EST, -240 for EDT)\n */\nfunction getEasternTimeOffset(date: Date): number {\n // Use Intl to get the actual offset for America/New_York\n // This correctly handles DST transitions\n const formatter = new Intl.DateTimeFormat(\"en-US\", {\n timeZone: \"America/New_York\",\n timeZoneName: \"shortOffset\",\n });\n const parts = formatter.formatToParts(date);\n const tzPart = parts.find((p) => p.type === \"timeZoneName\");\n\n if (tzPart) {\n // Parse offset like \"GMT-5\" or \"GMT-4\"\n const match = tzPart.value.match(/GMT([+-]\\d+)/);\n if (match) {\n return parseInt(match[1], 10) * 60;\n }\n }\n\n // Fallback: assume EST (-5 hours = -300 minutes)\n return -300;\n}\n\n/**\n * Match a single trade to a dataset row using the specified strategy\n */\nexport function matchTradeToDataset(\n trade: Trade,\n rows: StaticDatasetRow[],\n strategy: MatchStrategy,\n): StaticDatasetRow | null {\n if (rows.length === 0) {\n return null;\n }\n\n const tradeTimestamp = combineDateAndTime(trade.dateOpened, trade.timeOpened);\n const tradeTime = tradeTimestamp.getTime();\n\n switch (strategy) {\n case \"exact\":\n return matchExact(rows, tradeTime);\n\n case \"same-day\":\n return matchSameDay(rows, tradeTimestamp);\n\n case \"nearest-before\":\n return matchNearestBefore(rows, tradeTime);\n\n case \"nearest-after\":\n return matchNearestAfter(rows, tradeTime);\n\n case \"nearest\":\n return matchNearest(rows, tradeTime);\n\n default:\n return null;\n }\n}\n\n/**\n * Get the date-only portion of a timestamp as YYYY-MM-DD string in Eastern Time\n * This ensures we're comparing calendar dates in the trading timezone\n */\nfunction getDateOnly(date: Date): string {\n // Format the date in Eastern Time to get the correct calendar date\n const formatter = new Intl.DateTimeFormat(\"en-CA\", {\n timeZone: \"America/New_York\",\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n });\n return formatter.format(date); // Returns YYYY-MM-DD format\n}\n\n/**\n * Find a row that matches the same calendar day as the trade\n * Uses binary search for efficiency\n */\nfunction matchSameDay(rows: StaticDatasetRow[], tradeTimestamp: Date): StaticDatasetRow | null {\n const tradeDateStr = getDateOnly(tradeTimestamp);\n\n // Binary search to find any row on the same day\n let left = 0;\n let right = rows.length - 1;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const rowDateStr = getDateOnly(new Date(rows[mid].timestamp));\n\n if (rowDateStr === tradeDateStr) {\n return rows[mid];\n } else if (rowDateStr < tradeDateStr) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n return null;\n}\n\n/**\n * Find an exact timestamp match\n */\nfunction matchExact(rows: StaticDatasetRow[], tradeTime: number): StaticDatasetRow | null {\n // Use binary search for efficiency\n let left = 0;\n let right = rows.length - 1;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const rowTime = new Date(rows[mid].timestamp).getTime();\n\n if (rowTime === tradeTime) {\n return rows[mid];\n } else if (rowTime < tradeTime) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n return null;\n}\n\n/**\n * Find the nearest row at or before the trade time\n */\nfunction matchNearestBefore(rows: StaticDatasetRow[], tradeTime: number): StaticDatasetRow | null {\n // Binary search for the rightmost element <= tradeTime\n let left = 0;\n let right = rows.length - 1;\n let result: StaticDatasetRow | null = null;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const rowTime = new Date(rows[mid].timestamp).getTime();\n\n if (rowTime <= tradeTime) {\n result = rows[mid];\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n return result;\n}\n\n/**\n * Find the nearest row at or after the trade time\n */\nfunction matchNearestAfter(rows: StaticDatasetRow[], tradeTime: number): StaticDatasetRow | null {\n // Binary search for the leftmost element >= tradeTime\n let left = 0;\n let right = rows.length - 1;\n let result: StaticDatasetRow | null = null;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const rowTime = new Date(rows[mid].timestamp).getTime();\n\n if (rowTime >= tradeTime) {\n result = rows[mid];\n right = mid - 1;\n } else {\n left = mid + 1;\n }\n }\n\n return result;\n}\n\n/**\n * Find the nearest row by absolute time difference\n * Constrained to the same calendar day (in Eastern Time) to prevent\n * matching to data from days away when trade is outside dataset range\n */\nfunction matchNearest(rows: StaticDatasetRow[], tradeTime: number): StaticDatasetRow | null {\n // Find candidates using binary search\n const before = matchNearestBefore(rows, tradeTime);\n const after = matchNearestAfter(rows, tradeTime);\n\n if (!before && !after) {\n return null;\n }\n\n // Get the trade's calendar date in Eastern Time\n const tradeDateStr = getDateOnly(new Date(tradeTime));\n\n // Filter candidates to same day only\n const beforeSameDay =\n before && getDateOnly(new Date(before.timestamp)) === tradeDateStr ? before : null;\n const afterSameDay =\n after && getDateOnly(new Date(after.timestamp)) === tradeDateStr ? after : null;\n\n if (!beforeSameDay && !afterSameDay) {\n return null;\n }\n\n if (!beforeSameDay) {\n return afterSameDay;\n }\n\n if (!afterSameDay) {\n return beforeSameDay;\n }\n\n // Compare distances\n const beforeDiff = Math.abs(tradeTime - new Date(beforeSameDay.timestamp).getTime());\n const afterDiff = Math.abs(new Date(afterSameDay.timestamp).getTime() - tradeTime);\n\n return beforeDiff <= afterDiff ? beforeSameDay : afterSameDay;\n}\n\n/**\n * Match a trade to a dataset and return detailed result\n */\nexport function matchTradeToDatasetWithDetails(\n trade: Trade,\n dataset: StaticDataset,\n rows: StaticDatasetRow[],\n): DatasetMatchResult {\n const tradeTimestamp = combineDateAndTime(trade.dateOpened, trade.timeOpened);\n const matchedRow = matchDatasetValues(trade, dataset, rows);\n\n let matchedTimestamp: Date | null = null;\n let timeDifferenceMs: number | null = null;\n\n if (matchedRow) {\n matchedTimestamp = new Date(matchedRow.timestamp);\n timeDifferenceMs = matchedTimestamp.getTime() - tradeTimestamp.getTime();\n }\n\n return {\n datasetId: dataset.id,\n datasetName: dataset.name,\n matchedRow,\n matchedTimestamp,\n timeDifferenceMs,\n };\n}\n\n/**\n * Match multiple trades to a dataset and return all results\n */\nexport function matchTradesToDataset(\n trades: Trade[],\n dataset: StaticDataset,\n rows: StaticDatasetRow[],\n): DatasetMatchResult[] {\n return trades.map((trade) => matchTradeToDatasetWithDetails(trade, dataset, rows));\n}\n\n/**\n * Calculate match statistics for preview display\n */\nexport function calculateMatchStats(\n trades: Trade[],\n dataset: StaticDataset,\n rows: StaticDatasetRow[],\n): DatasetMatchStats {\n const totalTrades = trades.length;\n\n if (totalTrades === 0 || rows.length === 0) {\n return {\n totalTrades,\n matchedTrades: 0,\n outsideDateRange: 0,\n matchPercentage: 0,\n };\n }\n\n const datasetStart = new Date(dataset.dateRange.start).getTime();\n // Extend end date to end-of-day (23:59:59.999 Eastern) so trades during the final day match\n // Get the date in Eastern Time, then calculate end-of-day in that timezone\n const endDate = new Date(dataset.dateRange.end);\n const endDateStr = getDateOnly(endDate); // Gets YYYY-MM-DD in Eastern Time\n const [year, month, day] = endDateStr.split(\"-\").map(Number);\n // Create 23:59:59.999 in Eastern Time\n const endOfDayUtc = Date.UTC(year, month - 1, day, 23, 59, 59, 999);\n // Convert from Eastern to UTC\n const etOffset = getEasternTimeOffset(new Date(endOfDayUtc));\n const datasetEnd = endOfDayUtc - etOffset * 60 * 1000;\n\n let matchedTrades = 0;\n let outsideDateRange = 0;\n\n for (const trade of trades) {\n const tradeTimestamp = combineDateAndTime(trade.dateOpened, trade.timeOpened);\n const tradeTime = tradeTimestamp.getTime();\n\n // Causal carry-forward can legitimately match after the last source date.\n if (tradeTime < datasetStart || (dataset.timingMode !== \"declared\" && tradeTime > datasetEnd)) {\n outsideDateRange++;\n continue;\n }\n\n // Try to match\n const match = matchDatasetValues(trade, dataset, rows);\n if (match) {\n matchedTrades++;\n }\n }\n\n const matchPercentage =\n totalTrades > 0 ? Math.round((matchedTrades / totalTrades) * 1000) / 10 : 0;\n\n return {\n totalTrades,\n matchedTrades,\n outsideDateRange,\n matchPercentage,\n };\n}\n\n/**\n * Get matched values for a trade from all available datasets\n * Returns a map of datasetName -> columnName -> value\n */\nexport function getMatchedValuesForTrade(\n trade: Trade,\n datasets: Array<{ dataset: StaticDataset; rows: StaticDatasetRow[] }>,\n): Record<string, Record<string, number | string>> {\n const result: Record<string, Record<string, number | string>> = {};\n\n for (const { dataset, rows } of datasets) {\n const matchedRow = matchDatasetValues(trade, dataset, rows);\n\n if (matchedRow) {\n result[dataset.name] = { ...matchedRow.values };\n }\n }\n\n return result;\n}\n\n/**\n * Get a specific value from matched datasets for a trade\n * Field format: \"datasetName.columnName\" (e.g., \"vix.close\")\n */\nexport function getMatchedFieldValue(\n trade: Trade,\n field: string,\n datasets: Array<{ dataset: StaticDataset; rows: StaticDatasetRow[] }>,\n): number | string | null {\n const dotIndex = field.indexOf(\".\");\n if (dotIndex === -1) {\n return null;\n }\n\n const datasetName = field.substring(0, dotIndex);\n const columnName = field.substring(dotIndex + 1);\n\n const datasetInfo = datasets.find((d) => d.dataset.name === datasetName);\n if (!datasetInfo) {\n return null;\n }\n\n if (!datasetInfo.dataset.columns.includes(columnName)) {\n return null;\n }\n const matchedRow = matchDatasetValues(trade, datasetInfo.dataset, datasetInfo.rows);\n if (!matchedRow) {\n return null;\n }\n\n const value = matchedRow.values[columnName];\n return value !== undefined ? value : null;\n}\n\n/**\n * Format time difference for display\n */\nexport function formatTimeDifference(diffMs: number | null): string {\n if (diffMs === null) {\n return \"No match\";\n }\n\n const absDiff = Math.abs(diffMs);\n const sign = diffMs < 0 ? \"-\" : \"+\";\n\n if (absDiff < 1000) {\n return \"Exact match\";\n }\n\n if (absDiff < 60000) {\n const seconds = Math.round(absDiff / 1000);\n return `${sign}${seconds}s`;\n }\n\n if (absDiff < 3600000) {\n const minutes = Math.round(absDiff / 60000);\n return `${sign}${minutes}m`;\n }\n\n if (absDiff < 86400000) {\n const hours = Math.round(absDiff / 3600000);\n return `${sign}${hours}h`;\n }\n\n const days = Math.round(absDiff / 86400000);\n return `${sign}${days}d`;\n}\n","/**\n * IndexedDB Database Service for TradeBlocks\n *\n * Manages the client-side database for storing blocks, trades, and daily logs.\n * Uses a versioned schema with migration support.\n */\n\nimport type { ProcessedBlock } from \"../models/block.ts\";\nimport {\n DATED_ROW_DAY_FIELDS,\n encodeCalendarDay,\n isDate,\n recoverCalendarDay,\n TRADE_DAY_FIELDS,\n} from \"./calendar-days.ts\";\n\n// Database configuration\nexport const DB_NAME = \"TradeBlocksDB\";\nexport const DB_VERSION = 7;\n\n// Object store names\nexport const STORES = {\n BLOCKS: \"blocks\",\n TRADES: \"trades\",\n DAILY_LOGS: \"dailyLogs\",\n CALCULATIONS: \"calculations\",\n REPORTING_LOGS: \"reportingLogs\",\n WALK_FORWARD: \"walkForwardAnalyses\",\n STATIC_DATASETS: \"staticDatasets\",\n STATIC_DATASET_ROWS: \"staticDatasetRows\",\n PUBLISHED_RATES: \"publishedRates\",\n} as const;\n\n// Index names\nexport const INDEXES = {\n TRADES_BY_BLOCK: \"blockId\",\n TRADES_BY_DATE: \"dateOpened\",\n TRADES_BY_STRATEGY: \"strategy\",\n DAILY_LOGS_BY_BLOCK: \"blockId\",\n DAILY_LOGS_BY_DATE: \"date\",\n CALCULATIONS_BY_BLOCK: \"blockId\",\n REPORTING_LOGS_BY_BLOCK: \"blockId\",\n REPORTING_LOGS_BY_STRATEGY: \"strategy\",\n WALK_FORWARD_BY_BLOCK: \"blockId\",\n STATIC_DATASET_ROWS_BY_DATASET: \"datasetId\",\n STATIC_DATASET_ROWS_BY_TIMESTAMP: \"timestamp\",\n} as const;\n\n/**\n * Database instance singleton\n */\nlet dbInstance: IDBDatabase | null = null;\n\ntype UnverifiedCalendarDays = NonNullable<ProcessedBlock[\"unverifiedCalendarDays\"]>;\n\n/** Calculation caches whose rows carry calendar days; rebuilt from the upgraded records. */\nconst DATED_CALCULATION_TYPES: Record<string, true> = {\n combined_trades: true,\n enriched_trades: true,\n performance_snapshot: true,\n};\n\n/**\n * v5 divided \"cents\"-tagged premiums by 100, then applied its option-multiplier heuristic to\n * every record. Rescale each premium so existing blocks keep the totals v5 displayed.\n */\nfunction rescaleLegacyPremium(trade: Record<string, unknown>): boolean {\n let changed = Object.hasOwn(trade, \"premiumPrecision\");\n if (typeof trade.premium === \"number\" && isFinite(trade.premium)) {\n const cents = trade.premiumPrecision === \"cents\";\n const count =\n typeof trade.numContracts === \"number\" && isFinite(trade.numContracts)\n ? Math.abs(trade.numContracts)\n : 0;\n const contracts = count > 0 ? count : 1;\n const total = (Math.abs(trade.premium) / (cents ? 100 : 1)) * contracts;\n const margin =\n typeof trade.marginReq === \"number\" && isFinite(trade.marginReq)\n ? Math.abs(trade.marginReq)\n : 0;\n const multiplied =\n isFinite(total) &&\n total > 0 &&\n (margin > 0 ? total / margin > 0 && total / margin < 0.5 : total < 5000);\n if (cents && !multiplied) {\n trade.premium /= 100;\n changed = true;\n } else if (!cents && multiplied) {\n trade.premium *= 100;\n changed = true;\n }\n }\n if (changed) delete trade.premiumPrecision;\n return changed;\n}\n\n/**\n * The CSV cell each reporting-log day was parsed from. Option Omega strategy logs write\n * `Date Opened` with a time (`2025-05-30T10:15:40.546199`); the importer parsed that as an\n * instant, but the cell's `YYYY-MM-DD` prefix is the exact day. Rows imported since v3.2.0 keep\n * their cells in `sourceFields`.\n */\nconst REPORTING_SOURCE_CELLS: Record<string, string> = {\n dateOpened: \"Date Opened\",\n dateClosed: \"Date Closed\",\n};\n\n/**\n * A day with an optional clock time (hours 00-23) and no time zone. A cell with `Z` or an offset\n * was read as that instant, so its prefix is not necessarily the day the user saw; `T24:00` was\n * read as the next day's midnight.\n */\nconst ZONELESS_SOURCE_DAY =\n /^(\\d{4}-\\d{2}-\\d{2})(?:[T ](?:[01]?\\d|2[0-3]):\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?$/;\n\n/** A cell with a time after its day, or any clock time: the instant parsed from it is no midnight. */\nconst TIMED_SOURCE_CELL = /^\\d{4}-\\d{2}-\\d{2}[T ]|\\d:\\d{2}/;\n\n/**\n * What a saved source cell proves about its day: the exact day of a zone-less cell naming a real\n * day (`2025-02-30` is none); `\"timed\"` for any other cell that carried a time, since its stored\n * instant is known not to be a midnight; otherwise `undefined` (no cell, or a whole-day cell\n * that names no real day).\n */\nfunction sourceCellDay(cell: unknown): string | \"timed\" | undefined {\n if (typeof cell !== \"string\") return undefined;\n const text = cell.trim();\n const day = ZONELESS_SOURCE_DAY.exec(text)?.[1];\n const parsed = day ? new Date(`${day}T00:00:00Z`) : undefined;\n if (day && parsed && !Number.isNaN(parsed.getTime()) && parsed.toISOString().startsWith(day)) {\n return day;\n }\n return TIMED_SOURCE_CELL.test(text) ? \"timed\" : undefined;\n}\n\n/**\n * Rewrite pre-v7 `Date` calendar days as `YYYY-MM-DD`. The day comes from the record's saved\n * zone-less source cell when it has one; a saved cell that carried a time but proves no day leaves\n * the day unproven; otherwise the day comes from `recoverCalendarDay`. An unproven day keeps the\n * local day this browser shows and is returned in `unproven`. Strings are skipped, so a repeated\n * pass changes nothing.\n */\nfunction storeCalendarDays(\n record: Record<string, unknown>,\n fields: readonly string[],\n sourceCells: Record<string, string> = {},\n): { changed: boolean; unproven: number } {\n const source = record.sourceFields as Record<string, unknown> | undefined;\n let changed = false;\n let unproven = 0;\n for (const field of fields) {\n const value = record[field];\n if (!isDate(value)) continue;\n const fromCell = sourceCellDay(sourceCells[field] ? source?.[sourceCells[field]] : undefined);\n const day = fromCell === \"timed\" ? null : (fromCell ?? recoverCalendarDay(value));\n if (day === null) unproven++;\n record[field] = day ?? encodeCalendarDay(value);\n changed = true;\n }\n return { changed, unproven };\n}\n\n/**\n * Upgrade existing records in the version-change transaction: one cursor pass per store, since two\n * cursors updating the same record would overwrite each other. Blocks are visited after the data\n * stores so they can record their unverified-day counts. Any failure aborts the transaction, which\n * leaves the database at its previous version.\n */\nfunction upgradeStoredRecords(transaction: IDBTransaction, oldVersion: number): void {\n const unverified = new Map<string, UnverifiedCalendarDays>();\n\n const eachRecord = (\n storeName: string,\n visit: (cursor: IDBCursorWithValue) => void,\n done?: () => void,\n ) => {\n const request = transaction.objectStore(storeName).openCursor();\n request.onsuccess = () => {\n try {\n const cursor = request.result;\n if (!cursor) {\n done?.();\n return;\n }\n visit(cursor);\n cursor.continue();\n } catch (error) {\n console.error(`IndexedDB upgrade of ${storeName} failed:`, error);\n transaction.abort();\n }\n };\n };\n\n const migrateCollection = (\n storeName: typeof STORES.TRADES | typeof STORES.DAILY_LOGS | typeof STORES.REPORTING_LOGS,\n fields: readonly string[],\n done: () => void,\n ) =>\n eachRecord(\n storeName,\n (cursor) => {\n const record = cursor.value;\n const premiumChanged =\n storeName === STORES.TRADES && oldVersion < 6 && rescaleLegacyPremium(record);\n const days = storeCalendarDays(\n record,\n fields,\n storeName === STORES.REPORTING_LOGS ? REPORTING_SOURCE_CELLS : undefined,\n );\n if (days.unproven > 0) {\n const blockId = String(record.blockId);\n const counts = unverified.get(blockId) ?? {};\n counts[storeName] = (counts[storeName] ?? 0) + days.unproven;\n unverified.set(blockId, counts);\n }\n if (premiumChanged || days.changed) cursor.update(record);\n },\n done,\n );\n\n let pendingCollections = 3;\n const collectionDone = () => {\n pendingCollections--;\n if (pendingCollections > 0) return;\n eachRecord(STORES.BLOCKS, (cursor) => {\n const block = cursor.value;\n // The block's date range copies its trades' dates; it adds no count of its own.\n const changed = block.dateRange\n ? storeCalendarDays(block.dateRange, [\"start\", \"end\"]).changed\n : false;\n const counts = unverified.get(block.id);\n if (counts) block.unverifiedCalendarDays = counts;\n if (changed || counts) cursor.update(block);\n });\n };\n migrateCollection(STORES.TRADES, TRADE_DAY_FIELDS, collectionDone);\n migrateCollection(STORES.DAILY_LOGS, DATED_ROW_DAY_FIELDS, collectionDone);\n migrateCollection(STORES.REPORTING_LOGS, TRADE_DAY_FIELDS, collectionDone);\n\n eachRecord(STORES.CALCULATIONS, (cursor) => {\n if (Object.hasOwn(DATED_CALCULATION_TYPES, cursor.value.calculationType)) cursor.delete();\n });\n}\n\n/**\n * Initialize the IndexedDB database\n */\nexport async function initializeDatabase(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n if (dbInstance) {\n resolve(dbInstance);\n return;\n }\n\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onerror = () => {\n reject(new Error(`Failed to open database: ${request.error?.message}`));\n };\n\n request.onsuccess = () => {\n dbInstance = request.result;\n resolve(dbInstance);\n };\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n const transaction = (event.target as IDBOpenDBRequest).transaction!;\n\n // Create blocks store\n if (!db.objectStoreNames.contains(STORES.BLOCKS)) {\n const blocksStore = db.createObjectStore(STORES.BLOCKS, {\n keyPath: \"id\",\n });\n blocksStore.createIndex(\"name\", \"name\", { unique: false });\n blocksStore.createIndex(\"isActive\", \"isActive\", { unique: false });\n blocksStore.createIndex(\"created\", \"created\", { unique: false });\n blocksStore.createIndex(\"lastModified\", \"lastModified\", {\n unique: false,\n });\n }\n\n // Create trades store\n if (!db.objectStoreNames.contains(STORES.TRADES)) {\n const tradesStore = db.createObjectStore(STORES.TRADES, {\n autoIncrement: true,\n });\n tradesStore.createIndex(INDEXES.TRADES_BY_BLOCK, \"blockId\", {\n unique: false,\n });\n tradesStore.createIndex(INDEXES.TRADES_BY_DATE, \"dateOpened\", {\n unique: false,\n });\n tradesStore.createIndex(INDEXES.TRADES_BY_STRATEGY, \"strategy\", {\n unique: false,\n });\n tradesStore.createIndex(\"pl\", \"pl\", { unique: false });\n tradesStore.createIndex(\"composite_block_date\", [\"blockId\", \"dateOpened\"], {\n unique: false,\n });\n }\n\n // Create daily logs store\n if (!db.objectStoreNames.contains(STORES.DAILY_LOGS)) {\n const dailyLogsStore = db.createObjectStore(STORES.DAILY_LOGS, {\n autoIncrement: true,\n });\n dailyLogsStore.createIndex(INDEXES.DAILY_LOGS_BY_BLOCK, \"blockId\", {\n unique: false,\n });\n dailyLogsStore.createIndex(INDEXES.DAILY_LOGS_BY_DATE, \"date\", {\n unique: false,\n });\n dailyLogsStore.createIndex(\"composite_block_date\", [\"blockId\", \"date\"], { unique: false });\n }\n\n // Create reporting logs store\n if (!db.objectStoreNames.contains(STORES.REPORTING_LOGS)) {\n const reportingStore = db.createObjectStore(STORES.REPORTING_LOGS, {\n autoIncrement: true,\n });\n reportingStore.createIndex(INDEXES.REPORTING_LOGS_BY_BLOCK, \"blockId\", {\n unique: false,\n });\n reportingStore.createIndex(INDEXES.REPORTING_LOGS_BY_STRATEGY, \"strategy\", {\n unique: false,\n });\n reportingStore.createIndex(\"composite_block_date\", [\"blockId\", \"dateOpened\"], {\n unique: false,\n });\n }\n\n // Create calculations store (for cached computations)\n if (!db.objectStoreNames.contains(STORES.CALCULATIONS)) {\n const calculationsStore = db.createObjectStore(STORES.CALCULATIONS, {\n keyPath: \"id\",\n });\n calculationsStore.createIndex(INDEXES.CALCULATIONS_BY_BLOCK, \"blockId\", { unique: false });\n calculationsStore.createIndex(\"calculationType\", \"calculationType\", {\n unique: false,\n });\n calculationsStore.createIndex(\"calculatedAt\", \"calculatedAt\", {\n unique: false,\n });\n }\n\n // Create walk-forward analysis store\n if (!db.objectStoreNames.contains(STORES.WALK_FORWARD)) {\n const walkForwardStore = db.createObjectStore(STORES.WALK_FORWARD, {\n keyPath: \"id\",\n });\n walkForwardStore.createIndex(INDEXES.WALK_FORWARD_BY_BLOCK, \"blockId\", {\n unique: false,\n });\n walkForwardStore.createIndex(\"createdAt\", \"createdAt\", { unique: false });\n }\n\n // Create static datasets store (metadata)\n if (!db.objectStoreNames.contains(STORES.STATIC_DATASETS)) {\n const staticDatasetsStore = db.createObjectStore(STORES.STATIC_DATASETS, {\n keyPath: \"id\",\n });\n staticDatasetsStore.createIndex(\"name\", \"name\", { unique: true });\n staticDatasetsStore.createIndex(\"uploadedAt\", \"uploadedAt\", { unique: false });\n }\n\n // Create static dataset rows store (data rows)\n if (!db.objectStoreNames.contains(STORES.STATIC_DATASET_ROWS)) {\n const staticDatasetRowsStore = db.createObjectStore(STORES.STATIC_DATASET_ROWS, {\n autoIncrement: true,\n });\n staticDatasetRowsStore.createIndex(INDEXES.STATIC_DATASET_ROWS_BY_DATASET, \"datasetId\", {\n unique: false,\n });\n staticDatasetRowsStore.createIndex(INDEXES.STATIC_DATASET_ROWS_BY_TIMESTAMP, \"timestamp\", {\n unique: false,\n });\n staticDatasetRowsStore.createIndex(\n \"composite_dataset_timestamp\",\n [\"datasetId\", \"timestamp\"],\n { unique: false },\n );\n }\n\n if (!db.objectStoreNames.contains(STORES.PUBLISHED_RATES)) {\n db.createObjectStore(STORES.PUBLISHED_RATES);\n }\n\n if (event.oldVersion < 7) {\n upgradeStoredRecords(transaction, event.oldVersion);\n }\n\n transaction.oncomplete = () => {\n dbInstance = db;\n resolve(db);\n };\n };\n });\n}\n\n/**\n * Get database instance (initialize if needed)\n */\nexport async function getDatabase(): Promise<IDBDatabase> {\n if (dbInstance) {\n return dbInstance;\n }\n return initializeDatabase();\n}\n\n/**\n * Close database connection\n */\nexport function closeDatabase(): void {\n if (dbInstance) {\n dbInstance.close();\n dbInstance = null;\n }\n}\n\n/**\n * Delete the entire database (for testing/reset)\n * This version is more robust for corrupted databases:\n * - Doesn't require opening the database first\n * - Has timeout to prevent hanging forever\n * - Resolves on blocked (since deletion completes after reload)\n */\nexport async function deleteDatabase(): Promise<void> {\n return new Promise((resolve) => {\n // Close any existing connection (don't wait for it)\n if (dbInstance) {\n try {\n dbInstance.close();\n } catch {\n // Ignore close errors - database might be in bad state\n }\n dbInstance = null;\n }\n\n const deleteRequest = indexedDB.deleteDatabase(DB_NAME);\n\n // Timeout to prevent hanging forever on corrupted database\n const timeout = setTimeout(() => {\n console.warn(\"Database deletion timed out - will retry after reload\");\n resolve(); // Resolve anyway so we can reload\n }, 5000);\n\n deleteRequest.onsuccess = () => {\n clearTimeout(timeout);\n resolve();\n };\n\n deleteRequest.onerror = () => {\n clearTimeout(timeout);\n console.error(\"Failed to delete database:\", deleteRequest.error);\n // Still resolve - user can retry after page reload\n resolve();\n };\n\n deleteRequest.onblocked = () => {\n clearTimeout(timeout);\n console.warn(\"Database deletion blocked - will complete after reload\");\n // Resolve instead of reject - the deletion will complete once all connections close\n // After page reload, there will be no connections blocking it\n resolve();\n };\n });\n}\n\n/**\n * Transaction helper for read operations\n */\nexport async function withReadTransaction<T>(\n stores: string | string[],\n callback: (transaction: IDBTransaction) => Promise<T>,\n): Promise<T> {\n const db = await getDatabase();\n const storeNames = Array.isArray(stores) ? stores : [stores];\n const transaction = db.transaction(storeNames, \"readonly\");\n\n return callback(transaction);\n}\n\n/**\n * Transaction helper for write operations\n */\nexport async function withWriteTransaction<T>(\n stores: string | string[],\n callback: (transaction: IDBTransaction) => Promise<T>,\n): Promise<T> {\n const db = await getDatabase();\n const storeNames = Array.isArray(stores) ? stores : [stores];\n const transaction = db.transaction(storeNames, \"readwrite\");\n\n return callback(transaction);\n}\n\n/**\n * Generic helper for promisifying IDBRequest\n */\nexport function promisifyRequest<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\n/**\n * Storage quota management\n */\nexport interface StorageInfo {\n quota: number;\n usage: number;\n available: number;\n persistent: boolean;\n}\n\n/**\n * Get storage quota information\n */\nexport async function getStorageInfo(): Promise<StorageInfo> {\n if (\"storage\" in navigator && \"estimate\" in navigator.storage) {\n const estimate = await navigator.storage.estimate();\n const persistent = await navigator.storage.persisted();\n\n return {\n quota: estimate.quota || 0,\n usage: estimate.usage || 0,\n available: (estimate.quota || 0) - (estimate.usage || 0),\n persistent,\n };\n }\n\n // Fallback for browsers without storage API\n return {\n quota: 0,\n usage: 0,\n available: 0,\n persistent: false,\n };\n}\n\n/**\n * Request persistent storage\n */\nexport async function requestPersistentStorage(): Promise<boolean> {\n if (\"storage\" in navigator && \"persist\" in navigator.storage) {\n return navigator.storage.persist();\n }\n return false;\n}\n\n/**\n * Database error types\n */\nexport class DatabaseError extends Error {\n readonly operation: string;\n readonly store?: string;\n override readonly cause?: Error;\n constructor(message: string, operation: string, store?: string, cause?: Error) {\n super(message);\n this.name = \"DatabaseError\";\n this.operation = operation;\n this.store = store;\n this.cause = cause;\n }\n}\n\nexport class QuotaExceededError extends DatabaseError {\n constructor(operation: string, store?: string) {\n super(\"Storage quota exceeded\", operation, store);\n this.name = \"QuotaExceededError\";\n }\n}\n\nexport class TransactionError extends DatabaseError {\n constructor(message: string, operation: string, store?: string, cause?: Error) {\n super(message, operation, store, cause);\n this.name = \"TransactionError\";\n }\n}\n\n// Re-export functions from individual stores\nexport {\n createBlock,\n deleteBlock,\n getActiveBlock,\n getAllBlocks,\n getBlock,\n updateBlock,\n updateBlockStats,\n} from \"./blocks-store.ts\";\nexport {\n addDailyLogEntries,\n deleteDailyLogsByBlock,\n getDailyLogCountByBlock,\n getDailyLogsByBlock,\n updateDailyLogsForBlock,\n} from \"./daily-logs-store.ts\";\nexport type { StoredDailyLogEntry } from \"./daily-logs-store.ts\";\nexport {\n addReportingTrades,\n deleteReportingTradesByBlock,\n getReportingStrategiesByBlock,\n getReportingTradeCountByBlock,\n getReportingTradesByBlock,\n updateReportingTradesForBlock,\n} from \"./reporting-logs-store.ts\";\nexport {\n addTrades,\n deleteTradesByBlock,\n getTradeCountByBlock,\n getTradesByBlock,\n getTradesByBlockWithOptions,\n updateTradesForBlock,\n} from \"./trades-store.ts\";\nexport type { StoredTrade } from \"./trades-store.ts\";\nexport {\n saveWalkForwardAnalysis,\n getWalkForwardAnalysis,\n getWalkForwardAnalysesByBlock,\n deleteWalkForwardAnalysis,\n deleteWalkForwardAnalysesByBlock,\n} from \"./walk-forward-store.ts\";\nexport {\n storeCombinedTradesCache,\n getCombinedTradesCache,\n deleteCombinedTradesCache,\n hasCombinedTradesCache,\n invalidateBlockCaches,\n} from \"./combined-trades-cache.ts\";\nexport {\n storePerformanceSnapshotCache,\n getPerformanceSnapshotCache,\n deletePerformanceSnapshotCache,\n hasPerformanceSnapshotCache,\n} from \"./performance-snapshot-cache.ts\";\nexport { loadBrowserPublishedRates } from \"./published-rates-store.ts\";\nexport type { CachedPerformanceSnapshot } from \"./performance-snapshot-cache.ts\";\nexport {\n storeEnrichedTradesCache,\n getEnrichedTradesCache,\n deleteEnrichedTradesCache,\n hasEnrichedTradesCache,\n} from \"./enriched-trades-cache.ts\";\nexport {\n createStaticDataset,\n getStaticDataset,\n getStaticDatasetByName,\n getAllStaticDatasets,\n updateStaticDatasetMatchStrategy,\n updateStaticDatasetName,\n updateStaticDatasetTiming,\n deleteStaticDataset,\n isDatasetNameTaken,\n getStaticDatasetCount,\n} from \"./static-datasets-store.ts\";\nexport {\n addStaticDatasetRows,\n getStaticDatasetRows,\n getStaticDatasetRowsByRange,\n getStaticDatasetRowCount,\n deleteStaticDatasetRows,\n deleteStaticDatasetWithRows,\n getStaticDatasetDateRange,\n} from \"./static-dataset-rows-store.ts\";\n","/**\n * Daily Logs Store - CRUD operations for daily log data\n */\n\nimport type { DailyLogEntry } from \"../models/daily-log.ts\";\nimport {\n STORES,\n INDEXES,\n withReadTransaction,\n withWriteTransaction,\n promisifyRequest,\n} from \"./index.ts\";\nimport { clearUnverifiedCalendarDays } from \"./blocks-store.ts\";\nimport {\n DATED_ROW_DAY_FIELDS,\n decodeCalendarDays,\n encodeCalendarDay,\n encodeCalendarDays,\n type StoredCalendarDays,\n} from \"./calendar-days.ts\";\n\n/**\n * Extended daily log entry with block association\n */\nexport interface StoredDailyLogEntry extends DailyLogEntry {\n blockId: string;\n id?: number; // Auto-generated by IndexedDB\n}\n\ntype PersistedDailyLogEntry = StoredCalendarDays<StoredDailyLogEntry, \"date\">;\n\nconst fromPersisted = (entries: PersistedDailyLogEntry[]): StoredDailyLogEntry[] =>\n entries.map((entry) =>\n decodeCalendarDays<StoredDailyLogEntry, \"date\">(entry, DATED_ROW_DAY_FIELDS),\n );\n\n/**\n * Add daily log entries for a block (batch operation)\n */\nexport async function addDailyLogEntries(blockId: string, entries: DailyLogEntry[]): Promise<void> {\n if (entries.length === 0) return;\n\n await withWriteTransaction(STORES.DAILY_LOGS, async (transaction) => {\n const store = transaction.objectStore(STORES.DAILY_LOGS);\n\n // Use Promise.all for better performance with large datasets\n const promises = entries.map((entry) =>\n promisifyRequest(store.add(encodeCalendarDays({ ...entry, blockId }, DATED_ROW_DAY_FIELDS))),\n );\n\n await Promise.all(promises);\n });\n}\n\n/**\n * Get all daily log entries for a block\n */\nexport async function getDailyLogsByBlock(blockId: string): Promise<StoredDailyLogEntry[]> {\n return withReadTransaction(STORES.DAILY_LOGS, async (transaction) => {\n const store = transaction.objectStore(STORES.DAILY_LOGS);\n const index = store.index(INDEXES.DAILY_LOGS_BY_BLOCK);\n const result: PersistedDailyLogEntry[] = await promisifyRequest(index.getAll(blockId));\n\n // Chronological order: `YYYY-MM-DD` days sort as text.\n result.sort((a, b) => (a.date < b.date ? -1 : a.date > b.date ? 1 : 0));\n return fromPersisted(result);\n });\n}\n\n/**\n * Get daily log entries dated `startDate` through `endDate` (inclusive calendar days)\n */\nexport async function getDailyLogsByDateRange(\n blockId: string,\n startDate: Date,\n endDate: Date,\n): Promise<StoredDailyLogEntry[]> {\n return withReadTransaction(STORES.DAILY_LOGS, async (transaction) => {\n const store = transaction.objectStore(STORES.DAILY_LOGS);\n const index = store.index(\"composite_block_date\");\n\n const range = IDBKeyRange.bound(\n [blockId, encodeCalendarDay(startDate)],\n [blockId, encodeCalendarDay(endDate)],\n );\n return fromPersisted(await promisifyRequest(index.getAll(range)));\n });\n}\n\n/**\n * Get daily log entry for a specific date\n */\nexport async function getDailyLogByDate(\n blockId: string,\n date: Date,\n): Promise<StoredDailyLogEntry | null> {\n const entries = await getDailyLogsByDateRange(blockId, date, date);\n return entries.length > 0 ? entries[0] : null;\n}\n\n/**\n * Get daily log count by block\n */\nexport async function getDailyLogCountByBlock(blockId: string): Promise<number> {\n return withReadTransaction(STORES.DAILY_LOGS, async (transaction) => {\n const store = transaction.objectStore(STORES.DAILY_LOGS);\n const index = store.index(INDEXES.DAILY_LOGS_BY_BLOCK);\n const result = await promisifyRequest(index.count(blockId));\n return result;\n });\n}\n\n/**\n * Delete all daily log entries for a block\n */\nexport async function deleteDailyLogsByBlock(blockId: string): Promise<void> {\n await withWriteTransaction([STORES.DAILY_LOGS, STORES.BLOCKS], async (transaction) => {\n const store = transaction.objectStore(STORES.DAILY_LOGS);\n const index = store.index(INDEXES.DAILY_LOGS_BY_BLOCK);\n const request = index.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n request.onerror = () => reject(request.error);\n });\n await clearUnverifiedCalendarDays(transaction, blockId, STORES.DAILY_LOGS);\n });\n}\n\n/**\n * Update daily log entries for a block (replace all)\n */\nexport async function updateDailyLogsForBlock(\n blockId: string,\n entries: DailyLogEntry[],\n): Promise<void> {\n await withWriteTransaction([STORES.DAILY_LOGS, STORES.BLOCKS], async (transaction) => {\n // First delete existing entries\n const store = transaction.objectStore(STORES.DAILY_LOGS);\n const index = store.index(INDEXES.DAILY_LOGS_BY_BLOCK);\n const deleteRequest = index.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n deleteRequest.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n deleteRequest.onerror = () => reject(deleteRequest.error);\n });\n\n // Then add new entries\n const promises = entries.map((entry) =>\n promisifyRequest(store.add(encodeCalendarDays({ ...entry, blockId }, DATED_ROW_DAY_FIELDS))),\n );\n\n await Promise.all(promises);\n await clearUnverifiedCalendarDays(transaction, blockId, STORES.DAILY_LOGS);\n });\n}\n\n/**\n * Get daily log statistics for a block\n */\nexport async function getDailyLogStatistics(blockId: string): Promise<{\n totalEntries: number;\n dateRange: { start: Date | null; end: Date | null };\n finalPortfolioValue: number;\n maxDrawdown: number;\n totalPl: number;\n avgDailyPl: number;\n}> {\n const entries = await getDailyLogsByBlock(blockId);\n\n if (entries.length === 0) {\n return {\n totalEntries: 0,\n dateRange: { start: null, end: null },\n finalPortfolioValue: 0,\n maxDrawdown: 0,\n totalPl: 0,\n avgDailyPl: 0,\n };\n }\n\n const totalEntries = entries.length;\n\n // Get date range\n const dates = entries.map((entry) => new Date(entry.date));\n const start = new Date(Math.min(...dates.map((d) => d.getTime())));\n const end = new Date(Math.max(...dates.map((d) => d.getTime())));\n\n // Final portfolio value (last entry)\n const sortedEntries = entries.sort(\n (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime(),\n );\n const finalPortfolioValue = sortedEntries[0]?.netLiquidity || 0;\n\n // Calculate max drawdown (most negative value)\n const maxDrawdown = Math.min(...entries.map((entry) => entry.drawdownPct));\n\n // Total P/L (sum of all daily P/L)\n const totalPl = entries.reduce((sum, entry) => sum + entry.dailyPl, 0);\n\n // Average daily P/L\n const avgDailyPl = totalPl / totalEntries;\n\n return {\n totalEntries,\n dateRange: { start, end },\n finalPortfolioValue,\n maxDrawdown,\n totalPl,\n avgDailyPl,\n };\n}\n\n/**\n * Get portfolio value over time (for charts)\n */\nexport async function getPortfolioValueTimeSeries(blockId: string): Promise<\n Array<{\n date: Date;\n netLiquidity: number;\n dailyPl: number;\n drawdownPct: number;\n }>\n> {\n const entries = await getDailyLogsByBlock(blockId);\n\n return entries.map((entry) => ({\n date: new Date(entry.date),\n netLiquidity: entry.netLiquidity,\n dailyPl: entry.dailyPl,\n drawdownPct: entry.drawdownPct,\n }));\n}\n\n/**\n * Get daily P/L aggregated by month\n */\nexport async function getMonthlyPl(blockId: string): Promise<Record<string, number>> {\n const entries = await getDailyLogsByBlock(blockId);\n const monthlyPl: Record<string, number> = {};\n\n entries.forEach((entry) => {\n const date = new Date(entry.date);\n const monthKey = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}`;\n\n if (!monthlyPl[monthKey]) {\n monthlyPl[monthKey] = 0;\n }\n monthlyPl[monthKey] += entry.dailyPl;\n });\n\n return monthlyPl;\n}\n\n/**\n * Get daily P/L aggregated by week\n */\nexport async function getWeeklyPl(blockId: string): Promise<Record<string, number>> {\n const entries = await getDailyLogsByBlock(blockId);\n const weeklyPl: Record<string, number> = {};\n\n entries.forEach((entry) => {\n const date = new Date(entry.date);\n const year = date.getFullYear();\n const week = getWeekNumber(date);\n const weekKey = `${year}-W${String(week).padStart(2, \"0\")}`;\n\n if (!weeklyPl[weekKey]) {\n weeklyPl[weekKey] = 0;\n }\n weeklyPl[weekKey] += entry.dailyPl;\n });\n\n return weeklyPl;\n}\n\n/**\n * Helper function to get week number\n */\nfunction getWeekNumber(date: Date): number {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n}\n"],"mappings":"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AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA;AAAA,EAEd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAChB;;;ACz3GO,IAAM,aAAqC;AAAA,EAChD,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAA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","names":["getCacheId","getCacheId","fromPersisted"]}
1
+ {"version":3,"sources":["../../lib/calculations/trade-matching.ts","../../lib/db/calendar-days.ts","../../lib/utils/id.ts","../../lib/db/blocks-store.ts","../../lib/utils/equity-curve.ts","../../lib/utils/combine-leg-groups.ts","../../lib/db/combined-trades-cache.ts","../../lib/data/treasury-rates.ts","../../lib/data/sofr-rates.ts","../../lib/utils/published-rates.ts","../../lib/utils/risk-free-rate.ts","../../lib/db/performance-snapshot-cache.ts","../../lib/db/trades-store.ts","../../lib/utils/trade-frequency.ts","../../lib/calculations/xnys-session-calendar.ts","../../lib/db/index.ts","../../lib/db/daily-logs-store.ts"],"sourcesContent":["/**\n * Trade Matching & Scaling Utilities\n *\n * Pure business logic for matching backtest trades to actual (reporting log)\n * trades and computing scaled P/L comparisons. Used by live alignment engine,\n * slippage analysis, and discrepancy analysis.\n */\n\nimport type { Trade } from \"../models/trade.ts\";\nimport type { ReportingTrade } from \"../models/reporting-trade.ts\";\nimport { matchTradeSets } from \"./trade-set-alignment.ts\";\n\n/**\n * Helper to format date key for trade matching\n */\nexport function formatDateKey(d: Date): string {\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, \"0\");\n const day = String(d.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Helper to truncate time to minute precision for matching\n */\nexport function truncateTimeToMinute(time: string | undefined): string {\n if (!time) return \"00:00\";\n const match = time.trim().match(/^(\\d{1,2}):(\\d{2})(?::\\d{2}(?:\\.\\d+)?)?\\s*([AP]M)?$/i);\n if (!match) return \"00:00\";\n\n let hour = Number(match[1]);\n const period = match[3]?.toUpperCase();\n if (period) {\n if (hour < 1 || hour > 12) return \"00:00\";\n hour = (hour % 12) + (period === \"PM\" ? 12 : 0);\n } else if (hour > 23) {\n return \"00:00\";\n }\n\n return `${String(hour).padStart(2, \"0\")}:${match[2]}`;\n}\n\n/**\n * Helper to parse hour from time string\n */\nexport function parseHourFromTime(timeOpened: string | undefined): number | null {\n if (!timeOpened || typeof timeOpened !== \"string\") return null;\n const parts = timeOpened.split(\":\");\n if (parts.length < 1) return null;\n const hour = parseInt(parts[0], 10);\n if (isNaN(hour) || hour < 0 || hour > 23) return null;\n return hour;\n}\n\n/**\n * Helper to get ISO week key (YYYY-Www format)\n */\nexport function getIsoWeekKey(dateStr: string): string {\n const [yearStr, monthStr, dayStr] = dateStr.split(\"-\");\n const year = Number(yearStr);\n const month = Number(monthStr) - 1;\n const day = Number(dayStr);\n const date = new Date(Date.UTC(year, month, day));\n const thursday = new Date(date.getTime());\n const dayOfWeek = thursday.getUTCDay() || 7;\n thursday.setUTCDate(thursday.getUTCDate() + (4 - dayOfWeek));\n const yearStart = new Date(Date.UTC(thursday.getUTCFullYear(), 0, 1));\n const weekNum = Math.ceil(((thursday.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n return `${thursday.getUTCFullYear()}-W${String(weekNum).padStart(2, \"0\")}`;\n}\n\n/**\n * Helper to get month key (YYYY-MM format)\n */\nexport function getMonthKey(dateStr: string): string {\n return dateStr.substring(0, 7);\n}\n\n/**\n * Matched trade data for slippage analysis\n */\nexport interface MatchedTradeData {\n date: string;\n strategy: string;\n timeOpened: string;\n totalSlippage: number;\n openingVix?: number;\n closingVix?: number;\n gap?: number;\n movement?: number;\n hourOfDay: number | null;\n contracts: number;\n}\n\n/**\n * Apply date range filter to trades\n */\nexport function applyDateRangeFilter<T extends { dateOpened: Date }>(\n trades: T[],\n dateRange?: { from?: string; to?: string },\n): T[] {\n if (!dateRange || (!dateRange.from && !dateRange.to)) {\n return trades;\n }\n\n return trades.filter((t) => {\n const tradeDate = formatDateKey(new Date(t.dateOpened));\n if (dateRange.from && tradeDate < dateRange.from) return false;\n if (dateRange.to && tradeDate > dateRange.to) return false;\n return true;\n });\n}\n\n/**\n * Apply strategy filter to trades\n */\nexport function applyStrategyFilter<T extends { strategy: string }>(\n trades: T[],\n strategy?: string,\n): T[] {\n if (!strategy) return trades;\n return trades.filter((t) => t.strategy.toLowerCase() === strategy.toLowerCase());\n}\n\n/**\n * Calculate scaled P/L values for slippage comparison\n */\nexport function calculateScaledPl(\n btPl: number,\n actualPl: number,\n btContracts: number,\n actualContracts: number,\n scaling: \"raw\" | \"perContract\" | \"toReported\",\n): { scaledBtPl: number; scaledActualPl: number } {\n let scaledBtPl = btPl;\n let scaledActualPl = actualPl;\n\n if (scaling === \"perContract\") {\n scaledBtPl = btContracts > 0 ? btPl / btContracts : 0;\n scaledActualPl = actualContracts > 0 ? actualPl / actualContracts : 0;\n } else if (scaling === \"toReported\") {\n if (btContracts > 0 && actualContracts > 0) {\n const scalingFactor = actualContracts / btContracts;\n scaledBtPl = btPl * scalingFactor;\n } else if (btContracts === 0) {\n scaledBtPl = 0;\n }\n }\n\n return { scaledBtPl, scaledActualPl };\n}\n\n/**\n * Match backtest trades to actual trades and calculate slippage\n */\nexport function matchTrades(\n backtestTrades: Trade[],\n actualTrades: ReportingTrade[],\n scaling: \"raw\" | \"perContract\" | \"toReported\",\n): {\n matchedTrades: MatchedTradeData[];\n unmatchedBacktestCount: number;\n unmatchedActualCount: number;\n} {\n const {\n matched,\n unmatchedBacktestIndices,\n unmatchedActualIndices,\n unusableBacktest,\n unusableActual,\n } = matchTradeSets(backtestTrades, actualTrades);\n\n const matchedTrades: MatchedTradeData[] = matched.map(({ backtestIndex, actualIndex }) => {\n const btTrade = backtestTrades[backtestIndex];\n const actualTrade = actualTrades[actualIndex];\n const { scaledBtPl, scaledActualPl } = calculateScaledPl(\n btTrade.pl,\n actualTrade.pl,\n btTrade.numContracts,\n actualTrade.numContracts,\n scaling,\n );\n\n return {\n date: formatDateKey(new Date(btTrade.dateOpened)),\n strategy: btTrade.strategy,\n timeOpened: truncateTimeToMinute(btTrade.timeOpened),\n // Total slippage = actual P/L - backtest P/L (after scaling)\n totalSlippage: scaledActualPl - scaledBtPl,\n openingVix: btTrade.openingVix,\n closingVix: btTrade.closingVix,\n gap: btTrade.gap,\n movement: btTrade.movement,\n hourOfDay: parseHourFromTime(btTrade.timeOpened),\n contracts: actualTrade.numContracts,\n };\n });\n\n // Malformed rows never match; count them with the unmatched totals so the\n // matched + unmatched accounting still spans every input row.\n const unmatchedBacktestCount = unmatchedBacktestIndices.length + unusableBacktest.length;\n const unmatchedActualCount = unmatchedActualIndices.length + unusableActual.length;\n\n return { matchedTrades, unmatchedBacktestCount, unmatchedActualCount };\n}\n\n/**\n * Get correlation interpretation string\n */\nexport function getCorrelationInterpretation(coeff: number): string {\n const abs = Math.abs(coeff);\n const direction = coeff >= 0 ? \"positive\" : \"negative\";\n if (abs >= 0.7) return `strong ${direction}`;\n if (abs >= 0.4) return `moderate ${direction}`;\n return `weak ${direction}`;\n}\n\n/**\n * Get confidence level based on sample size\n */\nexport function getConfidenceLevel(n: number): \"low\" | \"moderate\" | \"high\" {\n if (n < 10) return \"low\";\n if (n < 30) return \"moderate\";\n return \"high\";\n}\n","/**\n * Calendar days in IndexedDB.\n *\n * Trade, daily-log and reporting-log dates are calendar days held in memory as local-midnight\n * `Date` values. A `Date` is an instant, so storing one ties the day to the importing browser's\n * timezone. IndexedDB therefore holds these fields as `YYYY-MM-DD` strings: they are encoded from\n * the value's local calendar parts on write and decoded to local midnight in the current zone on\n * read.\n */\n\nimport { formatDateKey } from \"../calculations/trade-matching.ts\";\n\nconst DAY_MS = 86_400_000;\nconst HOUR_MS = 3_600_000;\nconst QUARTER_HOUR_MS = 900_000;\n\n/** A record as IndexedDB holds it: the named calendar-day fields are `YYYY-MM-DD` strings. */\nexport type StoredCalendarDays<T, K extends keyof T> = Omit<T, K> & {\n [P in K]: undefined extends T[P] ? string | undefined : string;\n};\n\n/** Calendar-day fields of `Trade`, `ReportingTrade` and the trade rows derived from them. */\nexport const TRADE_DAY_FIELDS = [\"dateOpened\", \"dateClosed\"] as const;\nexport type TradeDayField = (typeof TRADE_DAY_FIELDS)[number];\n/** Calendar-day field of `DailyLogEntry` and of MFE/MAE chart points. */\nexport const DATED_ROW_DAY_FIELDS = [\"date\"] as const;\n\nexport function encodeCalendarDay(date: Date): string {\n return formatDateKey(date);\n}\n\nfunction decodeCalendarDay(day: string): Date {\n const [year, month, date] = day.split(\"-\").map(Number);\n return new Date(year, month - 1, date);\n}\n\n/** Realm-safe: a structured clone can hand back a `Date` from another global. */\nexport function isDate(value: unknown): value is Date {\n return Object.prototype.toString.call(value) === \"[object Date]\";\n}\n\nexport function encodeCalendarDays<T extends object, K extends keyof T>(\n record: T,\n fields: readonly K[],\n): StoredCalendarDays<T, K> {\n const stored = { ...record } as Record<PropertyKey, unknown>;\n for (const field of fields) {\n const value = stored[field];\n if (isDate(value)) stored[field] = encodeCalendarDay(value);\n }\n return stored as StoredCalendarDays<T, K>;\n}\n\nexport function decodeCalendarDays<T extends object, K extends keyof T>(\n stored: StoredCalendarDays<T, K>,\n fields: readonly K[],\n): T {\n const record: Record<PropertyKey, unknown> = { ...stored };\n for (const field of fields) {\n const value = record[field];\n if (typeof value === \"string\") record[field] = decodeCalendarDay(value);\n }\n return record as T;\n}\n\nfunction utcDay(ms: number): string {\n const date = new Date(ms);\n const month = String(date.getUTCMonth() + 1).padStart(2, \"0\");\n const day = String(date.getUTCDate()).padStart(2, \"0\");\n return `${date.getUTCFullYear()}-${month}-${day}`;\n}\n\n/**\n * Recover the calendar day a pre-v7 browser stored as a `Date` instant, or `null` when the\n * instant alone cannot prove it.\n *\n * Stored days were local midnight in the importing zone or, from older parsers, UTC midnight.\n * Every real offset lies between -12h and +14h on the quarter-hour grid, so a midnight lands\n * before 10:00 UTC on its own day (zones at or west of UTC) or after 12:00 UTC on the previous\n * day (east of UTC). From 10:00 to 12:00 UTC the two readings collide (offsets -10..-12 and\n * +12..+14 name different days), and an off-grid instant came from a timestamp, not a day.\n */\nexport function recoverCalendarDay(instant: Date): string | null {\n const ms = instant.getTime();\n if (!Number.isFinite(ms)) return null;\n const timeOfDay = ((ms % DAY_MS) + DAY_MS) % DAY_MS;\n if (timeOfDay % QUARTER_HOUR_MS !== 0) return null;\n if (timeOfDay < 10 * HOUR_MS) return utcDay(ms);\n if (timeOfDay > 12 * HOUR_MS) return utcDay(ms + DAY_MS);\n return null;\n}\n","/**\n * Opaque identifier generation\n *\n * `crypto.randomUUID()` is only exposed in secure contexts. Serving a production\n * build over plain http from a LAN address (anything that is not localhost or\n * https) leaves `crypto` defined but `crypto.randomUUID` undefined, so call sites\n * that used it directly threw \"crypto.randomUUID is not a function\". Every id in\n * the app is an opaque string, so falling back to a locally generated UUIDv4\n * keeps the stored format identical.\n */\n\nconst HEX = Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, \"0\"));\n\n/**\n * Format 16 random bytes as a canonical UUID string, stamping the version 4 and\n * RFC 4122 variant bits.\n */\nfunction formatUuidV4(bytes: Uint8Array): string {\n bytes[6] = (bytes[6] & 0x0f) | 0x40;\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n\n const hex = Array.from(bytes, (byte) => HEX[byte]);\n return [\n hex.slice(0, 4).join(\"\"),\n hex.slice(4, 6).join(\"\"),\n hex.slice(6, 8).join(\"\"),\n hex.slice(8, 10).join(\"\"),\n hex.slice(10, 16).join(\"\"),\n ].join(\"-\");\n}\n\n/**\n * Generate an opaque identifier as a canonical UUID string.\n *\n * Prefers `crypto.randomUUID()`, falls back to `crypto.getRandomValues()`, and\n * only reaches `Math.random()` when neither is available.\n *\n * @returns A UUID string, e.g. \"3f6b0f3e-9c5b-4f4e-8a2f-1d0c9b8a7e6f\"\n */\nexport function generateId(): string {\n const cryptoObj: Crypto | undefined = globalThis.crypto;\n\n if (typeof cryptoObj?.randomUUID === \"function\") {\n return cryptoObj.randomUUID();\n }\n\n const bytes = new Uint8Array(16);\n\n if (typeof cryptoObj?.getRandomValues === \"function\") {\n cryptoObj.getRandomValues(bytes);\n } else {\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n\n return formatUuidV4(bytes);\n}\n","/**\n * Blocks Store - CRUD operations for trading blocks\n */\n\nimport type { ProcessedBlock, Block } from \"../models/block.ts\";\nimport { generateId } from \"../utils/id.ts\";\nimport {\n STORES,\n withReadTransaction,\n withWriteTransaction,\n promisifyRequest,\n DatabaseError,\n} from \"./index.ts\";\nimport {\n decodeCalendarDays,\n encodeCalendarDays,\n type StoredCalendarDays,\n} from \"./calendar-days.ts\";\n\ntype DateRange = NonNullable<ProcessedBlock[\"dateRange\"]>;\ntype PersistedBlock = Omit<ProcessedBlock, \"dateRange\"> & {\n dateRange?: StoredCalendarDays<DateRange, keyof DateRange>;\n};\n\n/** The block's date range holds calendar days (its trades' first and last opening days). */\nconst RANGE_DAY_FIELDS = [\"start\", \"end\"] as const;\n\nfunction toPersisted(block: ProcessedBlock | PersistedBlock): PersistedBlock {\n if (!block.dateRange) return block as PersistedBlock;\n return { ...block, dateRange: encodeCalendarDays(block.dateRange, RANGE_DAY_FIELDS) };\n}\n\nfunction fromPersisted(block: PersistedBlock): ProcessedBlock {\n if (!block.dateRange) return block as ProcessedBlock;\n return {\n ...block,\n dateRange: decodeCalendarDays<DateRange, keyof DateRange>(block.dateRange, RANGE_DAY_FIELDS),\n };\n}\n\n/**\n * Clear a collection's unverified-day count after its rows are replaced or deleted, inside the\n * transaction that changes them.\n */\nexport async function clearUnverifiedCalendarDays(\n transaction: IDBTransaction,\n blockId: string,\n collection: keyof NonNullable<ProcessedBlock[\"unverifiedCalendarDays\"]>,\n): Promise<void> {\n const store = transaction.objectStore(STORES.BLOCKS);\n const block: PersistedBlock | undefined = await promisifyRequest(store.get(blockId));\n const counts = block?.unverifiedCalendarDays;\n if (!block || !counts || !(collection in counts)) return;\n delete counts[collection];\n if (Object.keys(counts).length === 0) delete block.unverifiedCalendarDays;\n await promisifyRequest(store.put(block));\n}\n\n/**\n * Create a new block\n */\nexport async function createBlock(\n blockData: Omit<ProcessedBlock, \"id\" | \"created\" | \"lastModified\">,\n): Promise<ProcessedBlock> {\n const block: ProcessedBlock = {\n ...blockData,\n id: generateId(),\n created: new Date(),\n lastModified: new Date(),\n };\n\n await withWriteTransaction(STORES.BLOCKS, async (transaction) => {\n const store = transaction.objectStore(STORES.BLOCKS);\n await promisifyRequest(store.add(toPersisted(block)));\n });\n\n return block;\n}\n\n/**\n * Get block by ID\n */\nexport async function getBlock(blockId: string): Promise<ProcessedBlock | null> {\n return withReadTransaction(STORES.BLOCKS, async (transaction) => {\n const store = transaction.objectStore(STORES.BLOCKS);\n const result: PersistedBlock | undefined = await promisifyRequest(store.get(blockId));\n return result ? fromPersisted(result) : null;\n });\n}\n\n/**\n * Get all blocks\n */\nexport async function getAllBlocks(): Promise<ProcessedBlock[]> {\n return withReadTransaction(STORES.BLOCKS, async (transaction) => {\n const store = transaction.objectStore(STORES.BLOCKS);\n const result: PersistedBlock[] = await promisifyRequest(store.getAll());\n\n // Sort by last modified (newest first)\n return result\n .sort((a, b) => new Date(b.lastModified).getTime() - new Date(a.lastModified).getTime())\n .map(fromPersisted);\n });\n}\n\n/**\n * Get active block\n */\nexport async function getActiveBlock(): Promise<ProcessedBlock | null> {\n return withReadTransaction(STORES.BLOCKS, async (transaction) => {\n const store = transaction.objectStore(STORES.BLOCKS);\n const index = store.index(\"isActive\");\n const result: PersistedBlock | undefined = await promisifyRequest(\n index.get(true as unknown as IDBValidKey),\n );\n return result ? fromPersisted(result) : null;\n });\n}\n\n/**\n * Update block\n */\nexport async function updateBlock(\n blockId: string,\n updates: Partial<ProcessedBlock>,\n): Promise<ProcessedBlock> {\n return withWriteTransaction(STORES.BLOCKS, async (transaction) => {\n const store = transaction.objectStore(STORES.BLOCKS);\n\n // Get existing block\n const existing: PersistedBlock | undefined = await promisifyRequest(store.get(blockId));\n if (!existing) {\n throw new DatabaseError(`Block not found: ${blockId}`, \"update\", STORES.BLOCKS);\n }\n\n // Merge updates with lastModified timestamp\n const updatedBlock = toPersisted({\n ...existing,\n ...(updates as Partial<PersistedBlock>),\n lastModified: new Date(),\n });\n\n await promisifyRequest(store.put(updatedBlock));\n return fromPersisted(updatedBlock);\n });\n}\n\n/**\n * Set active block (deactivates all others)\n */\nexport async function setActiveBlock(blockId: string): Promise<void> {\n await withWriteTransaction(STORES.BLOCKS, async (transaction) => {\n const store = transaction.objectStore(STORES.BLOCKS);\n\n // First, verify the block exists\n const targetBlock = await promisifyRequest(store.get(blockId));\n if (!targetBlock) {\n throw new DatabaseError(`Block not found: ${blockId}`, \"setActive\", STORES.BLOCKS);\n }\n\n // Get all blocks and update their active status\n const allBlocks = await promisifyRequest(store.getAll());\n\n for (const block of allBlocks) {\n const isActive = block.id === blockId;\n if (block.isActive !== isActive) {\n await promisifyRequest(\n store.put({\n ...block,\n isActive,\n lastModified: new Date(),\n }),\n );\n }\n }\n });\n}\n\n/**\n * Delete block and all associated data\n */\nexport async function deleteBlock(blockId: string): Promise<void> {\n await withWriteTransaction(\n [STORES.BLOCKS, STORES.TRADES, STORES.DAILY_LOGS, STORES.CALCULATIONS, STORES.REPORTING_LOGS],\n async (transaction) => {\n // Delete block\n const blocksStore = transaction.objectStore(STORES.BLOCKS);\n await promisifyRequest(blocksStore.delete(blockId));\n\n // Delete associated trades\n const tradesStore = transaction.objectStore(STORES.TRADES);\n const tradesIndex = tradesStore.index(\"blockId\");\n const tradesRequest = tradesIndex.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n tradesRequest.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n tradesRequest.onerror = () => reject(tradesRequest.error);\n });\n\n // Delete associated daily logs\n const dailyLogsStore = transaction.objectStore(STORES.DAILY_LOGS);\n const dailyLogsIndex = dailyLogsStore.index(\"blockId\");\n const dailyLogsRequest = dailyLogsIndex.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n dailyLogsRequest.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n dailyLogsRequest.onerror = () => reject(dailyLogsRequest.error);\n });\n\n // Delete associated reporting trades\n const reportingStore = transaction.objectStore(STORES.REPORTING_LOGS);\n const reportingIndex = reportingStore.index(\"blockId\");\n const reportingRequest = reportingIndex.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n reportingRequest.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n reportingRequest.onerror = () => reject(reportingRequest.error);\n });\n\n // Delete associated calculations\n const calculationsStore = transaction.objectStore(STORES.CALCULATIONS);\n const calculationsIndex = calculationsStore.index(\"blockId\");\n const calculationsRequest = calculationsIndex.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n calculationsRequest.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n calculationsRequest.onerror = () => reject(calculationsRequest.error);\n });\n },\n );\n}\n\n/**\n * Get blocks count\n */\nexport async function getBlocksCount(): Promise<number> {\n return withReadTransaction(STORES.BLOCKS, async (transaction) => {\n const store = transaction.objectStore(STORES.BLOCKS);\n const result = await promisifyRequest(store.count());\n return result;\n });\n}\n\n/**\n * Check if block name is unique\n */\nexport async function isBlockNameUnique(name: string, excludeId?: string): Promise<boolean> {\n return withReadTransaction(STORES.BLOCKS, async (transaction) => {\n const store = transaction.objectStore(STORES.BLOCKS);\n const index = store.index(\"name\");\n const result = await promisifyRequest(index.getAll(name));\n\n if (excludeId) {\n return result.filter((block) => block.id !== excludeId).length === 0;\n }\n\n return result.length === 0;\n });\n}\n\n/**\n * Update block processing status\n */\nexport async function updateProcessingStatus(\n blockId: string,\n status: ProcessedBlock[\"processingStatus\"],\n error?: string,\n): Promise<void> {\n await updateBlock(blockId, {\n processingStatus: status,\n processingError: error,\n ...(status === \"completed\" && { lastProcessedAt: new Date() }),\n });\n}\n\n/**\n * Update block statistics\n */\nexport async function updateBlockStats(\n blockId: string,\n portfolioStats: ProcessedBlock[\"portfolioStats\"],\n strategyStats?: ProcessedBlock[\"strategyStats\"],\n performanceMetrics?: ProcessedBlock[\"performanceMetrics\"],\n): Promise<void> {\n await updateBlock(blockId, {\n portfolioStats,\n strategyStats,\n performanceMetrics,\n });\n}\n\n/**\n * Convert ProcessedBlock to legacy Block format (for backward compatibility)\n */\nexport function toLegacyBlock(processedBlock: ProcessedBlock): Block {\n return {\n id: processedBlock.id,\n name: processedBlock.name,\n description: processedBlock.description,\n isActive: processedBlock.isActive,\n created: processedBlock.created,\n lastModified: processedBlock.lastModified,\n tradeLog: {\n fileName: processedBlock.tradeLog.fileName,\n rowCount: processedBlock.tradeLog.processedRowCount,\n fileSize: processedBlock.tradeLog.fileSize,\n },\n dailyLog: processedBlock.dailyLog\n ? {\n fileName: processedBlock.dailyLog.fileName,\n rowCount: processedBlock.dailyLog.processedRowCount,\n fileSize: processedBlock.dailyLog.fileSize,\n }\n : undefined,\n stats: {\n totalPnL: processedBlock.portfolioStats?.totalPl || 0,\n winRate: processedBlock.portfolioStats?.winRate || 0,\n totalTrades: processedBlock.portfolioStats?.totalTrades || 0,\n avgWin: processedBlock.portfolioStats?.avgWin || 0,\n avgLoss: processedBlock.portfolioStats?.avgLoss || 0,\n },\n };\n}\n","/**\n * Shared utility for equity curve calculations.\n *\n * This module provides a single source of truth for rebuilding equity curves\n * when trades are modified (scaled, filtered, etc.). It prevents bugs where\n * fundsAtClose values become inconsistent with P&L values.\n *\n * @example\n * ```typescript\n * // Rebuild equity curve after scaling trades\n * const scaledTrades = trades.map(t => ({ ...t, pl: t.pl * 0.5 }))\n * const withEquity = rebuildEquityCurve(scaledTrades, { initialCapital: 10000 })\n *\n * // Or use the combined helper\n * const scaled = scaleTradesWithEquityCurve(trades, 0.5, { initialCapital: 10000 })\n * ```\n */\n\nimport { PlBasis, type Trade } from \"../models/trade.ts\";\n\n/**\n * Options for rebuilding equity curves.\n */\nexport interface RebuildEquityCurveOptions {\n /**\n * Initial capital to start the equity curve from.\n * If not provided, will be calculated from the first trade's fundsAtClose - pl.\n */\n initialCapital?: number;\n\n /**\n * Whether to sort trades by close date before processing.\n * Default: true\n */\n sortByDate?: boolean;\n\n /**\n * Whether to include commissions in P&L calculation.\n * When true, uses basis-aware net P&L and deducts fees at most once.\n * Default: false (uses the reported value from trade.pl)\n */\n useNetPl?: boolean;\n}\n\n/**\n * Options for scaling trades with equity curve rebuild.\n */\nexport interface ScaleTradesOptions extends RebuildEquityCurveOptions {\n /**\n * Whether to also scale commission fees.\n * Default: true\n */\n scaleCommissions?: boolean;\n}\n\n/**\n * Sort trades by close date and time.\n *\n * @param trades - Array of trades to sort\n * @returns New array sorted by dateClosed and timeClosed\n */\nexport function sortTradesByCloseDate<T extends Pick<Trade, \"dateClosed\" | \"timeClosed\">>(\n trades: T[],\n): T[] {\n return [...trades].sort((a, b) => {\n if (!a.dateClosed && !b.dateClosed) return 0;\n if (!a.dateClosed) return 1;\n if (!b.dateClosed) return -1;\n\n const dateA = new Date(a.dateClosed);\n const dateB = new Date(b.dateClosed);\n const cmp = dateA.getTime() - dateB.getTime();\n if (cmp !== 0) return cmp;\n\n // Secondary sort by time\n return (a.timeClosed || \"\").localeCompare(b.timeClosed || \"\");\n });\n}\n\n/**\n * Calculate initial capital from a sorted array of trades.\n *\n * Uses the first trade's fundsAtClose - pl to derive the starting capital.\n *\n * @param sortedTrades - Trades sorted by close date\n * @returns Initial capital, or undefined if cannot be determined\n */\nexport function calculateInitialCapital(\n sortedTrades: Pick<\n Trade,\n \"fundsAtClose\" | \"pl\" | \"plBasis\" | \"openingCommissionsFees\" | \"closingCommissionsFees\"\n >[],\n): number | undefined {\n if (sortedTrades.length === 0) return undefined;\n\n const firstTrade = sortedTrades[0];\n if (firstTrade.fundsAtClose === undefined || firstTrade.fundsAtClose === null) {\n return undefined;\n }\n\n const metricPl = firstTrade.plBasis === undefined ? firstTrade.pl : getNetPl(firstTrade);\n return firstTrade.fundsAtClose - metricPl;\n}\n\n/**\n * Get the net P&L for a trade, deducting commissions exactly once.\n *\n * Option Omega exports declare `net_includes_fees`, so their reported P/L is\n * returned unchanged. An omitted basis preserves the historical TradeBlocks\n * contract and is treated as `gross_before_fees`.\n *\n * @param trade - Trade to calculate net P&L for\n * @returns Net P&L value\n */\nexport function getNetPl(\n trade: Pick<Trade, \"pl\" | \"plBasis\" | \"openingCommissionsFees\" | \"closingCommissionsFees\">,\n): number {\n if (trade.plBasis === PlBasis.NetIncludesFees) {\n return trade.pl;\n }\n const openingComm = trade.openingCommissionsFees ?? 0;\n const closingComm = trade.closingCommissionsFees ?? 0;\n return trade.pl - openingComm - closingComm;\n}\n\n/**\n * Get gross-before-fee P/L from a basis-aware trade.\n */\nexport function getGrossPl(\n trade: Pick<Trade, \"pl\" | \"plBasis\" | \"openingCommissionsFees\" | \"closingCommissionsFees\">,\n): number {\n if (trade.plBasis !== PlBasis.NetIncludesFees) {\n return trade.pl;\n }\n const openingComm = trade.openingCommissionsFees ?? 0;\n const closingComm = trade.closingCommissionsFees ?? 0;\n return trade.pl + openingComm + closingComm;\n}\n\n/**\n * Rebuild the equity curve for a set of trades.\n *\n * This function recalculates fundsAtClose for each trade based on cumulative P&L.\n * It's essential to call this after modifying trade P&L values (e.g., scaling).\n *\n * IMPORTANT: The returned trades maintain their original order but have\n * fundsAtClose recalculated based on chronological P&L accumulation.\n *\n * @param trades - Array of trades (will not be mutated)\n * @param options - Configuration options\n * @returns New array of trades with recalculated fundsAtClose values\n *\n * @example\n * ```typescript\n * // After scaling P&L, rebuild the equity curve\n * const scaledTrades = trades.map(t => ({ ...t, pl: t.pl * 0.5 }))\n * const withEquity = rebuildEquityCurve(scaledTrades, { initialCapital: 10000 })\n * ```\n */\nexport function rebuildEquityCurve<T extends Trade>(\n trades: T[],\n options: RebuildEquityCurveOptions = {},\n): T[] {\n const { sortByDate = true, useNetPl = false } = options;\n\n if (trades.length === 0) return [];\n\n // Filter to trades with close dates for equity calculation\n const closedTrades = trades.filter((t) => t.dateClosed);\n if (closedTrades.length === 0) return [...trades];\n\n // Sort trades chronologically\n const sortedTrades = sortByDate ? sortTradesByCloseDate(closedTrades) : closedTrades;\n\n // Determine initial capital\n let initialCapital = options.initialCapital;\n if (initialCapital === undefined) {\n // Try to calculate from original first trade's fundsAtClose\n const originalSorted = sortTradesByCloseDate(\n trades.filter((t) => t.dateClosed && t.fundsAtClose !== undefined && t.fundsAtClose !== null),\n );\n initialCapital = calculateInitialCapital(originalSorted);\n\n // Fallback to a reasonable default\n if (initialCapital === undefined) {\n initialCapital = 1000000;\n }\n }\n\n // Build mapping of trade -> new fundsAtClose\n // We use a Map keyed by trade reference since trades may have same values\n const fundsAtCloseMap = new Map<T, number>();\n let runningEquity = initialCapital;\n\n for (const trade of sortedTrades) {\n const pl = useNetPl ? getNetPl(trade) : trade.pl;\n runningEquity += pl;\n fundsAtCloseMap.set(trade, runningEquity);\n }\n\n // Return trades in original order with updated fundsAtClose\n return trades.map((trade) => {\n const newFundsAtClose = fundsAtCloseMap.get(trade);\n if (newFundsAtClose !== undefined) {\n return { ...trade, fundsAtClose: newFundsAtClose };\n }\n return { ...trade };\n });\n}\n\n/**\n * Scale trades by a factor and rebuild the equity curve.\n *\n * This is the recommended way to scale trades as it ensures the equity curve\n * remains consistent with the scaled P&L values.\n *\n * @param trades - Array of trades (will not be mutated)\n * @param scaleFactor - Factor to multiply P&L by (e.g., 0.5 for half, 2 for double)\n * @param options - Configuration options\n * @returns New array of trades with scaled P&L and recalculated fundsAtClose\n *\n * @example\n * ```typescript\n * // Scale trades to 50% and rebuild equity curve\n * const scaled = scaleTradesWithEquityCurve(trades, 0.5, { initialCapital: 10000 })\n *\n * // Scale up by 2x\n * const doubled = scaleTradesWithEquityCurve(trades, 2.0)\n * ```\n */\nexport function scaleTradesWithEquityCurve<T extends Trade>(\n trades: T[],\n scaleFactor: number,\n options: ScaleTradesOptions = {},\n): T[] {\n const { scaleCommissions = true, ...rebuildOptions } = options;\n\n if (trades.length === 0) return [];\n\n // Scale P&L and optionally commissions\n const scaledTrades = trades.map((trade) => {\n const scaled: T = {\n ...trade,\n pl: trade.pl * scaleFactor,\n };\n\n if (scaleCommissions) {\n if (trade.openingCommissionsFees !== undefined) {\n scaled.openingCommissionsFees = trade.openingCommissionsFees * scaleFactor;\n }\n if (trade.closingCommissionsFees !== undefined) {\n scaled.closingCommissionsFees = trade.closingCommissionsFees * scaleFactor;\n }\n }\n\n return scaled;\n });\n\n // Rebuild equity curve with scaled P&L\n return rebuildEquityCurve(scaledTrades, rebuildOptions);\n}\n\n/**\n * Normalize trades to one lot (single contract) and rebuild equity curve.\n *\n * Divides P&L by contract count to get per-contract performance.\n *\n * @param trades - Array of trades (will not be mutated)\n * @param options - Configuration options\n * @returns New array of trades normalized to one lot with rebuilt equity curve\n *\n * @example\n * ```typescript\n * const normalized = normalizeToOneLot(trades, { initialCapital: 10000 })\n * ```\n */\nexport function normalizeToOneLot<T extends Trade>(\n trades: T[],\n options: RebuildEquityCurveOptions = {},\n): T[] {\n if (trades.length === 0) return [];\n\n // Normalize each trade to single contract\n const normalizedTrades = trades.map((trade) => {\n const contracts = trade.numContracts || 1;\n const scaleFactor = 1 / contracts;\n\n return {\n ...trade,\n pl: trade.pl * scaleFactor,\n numContracts: 1,\n openingCommissionsFees: trade.openingCommissionsFees\n ? trade.openingCommissionsFees * scaleFactor\n : trade.openingCommissionsFees,\n closingCommissionsFees: trade.closingCommissionsFees\n ? trade.closingCommissionsFees * scaleFactor\n : trade.closingCommissionsFees,\n };\n });\n\n // Rebuild equity curve with normalized P&L\n return rebuildEquityCurve(normalizedTrades, options);\n}\n","/**\n * Leg Group Combining Utility\n *\n * For MEIC (Multiple Entry Iron Condor) and similar strategies where the backtester\n * creates separate trade records for each leg group (e.g., calls and puts) that were\n * opened simultaneously but may have different exit conditions/times.\n *\n * This utility groups trades by entry timestamp and combines them into single trade records.\n */\n\nimport { PlBasis, type Trade } from \"../models/trade.ts\";\nimport { formatDateKey } from \"../calculations/trade-matching.ts\";\nimport { hasReportingPremiumQuote, type ReportingTrade } from \"../models/reporting-trade.ts\";\nimport { yieldToMain, checkCancelled } from \"./async-helpers.ts\";\nimport { getNetPl } from \"./equity-curve.ts\";\n\n/**\n * Key used to group trades that were opened at the same time\n */\nexport interface TradeGroupKey {\n dateOpened: string; // ISO date string\n timeOpened: string;\n strategy: string;\n}\n\n/**\n * Result of combining multiple leg groups into a single trade\n */\nexport interface CombinedTrade extends Trade {\n originalTradeCount: number; // Number of trades that were combined\n combinedLegs: string[]; // Array of leg strings from each trade\n}\n\n/**\n * Result of combining multiple ReportingTrade leg groups into a single trade\n */\nexport interface CombinedReportingTrade extends ReportingTrade {\n originalTradeCount: number; // Number of trades that were combined\n combinedLegs: string[]; // Array of leg strings from each trade\n}\n\n/**\n * Type guard to check if a Trade is a CombinedTrade\n */\nexport function isCombinedTrade(trade: Trade): trade is CombinedTrade {\n return \"originalTradeCount\" in trade && \"combinedLegs\" in trade;\n}\n\n/**\n * Type guard to check if a ReportingTrade is a CombinedReportingTrade\n */\nexport function isCombinedReportingTrade(trade: ReportingTrade): trade is CombinedReportingTrade {\n return \"originalTradeCount\" in trade && \"combinedLegs\" in trade;\n}\n\n/**\n * Generate a unique key for grouping trades by entry timestamp\n */\nfunction generateGroupKey(trade: Trade): string {\n const dateStr = formatDateKey(trade.dateOpened);\n return `${dateStr}|${trade.timeOpened}|${trade.strategy}`;\n}\n\n/**\n * Parse a group key back into its components\n * (Not currently used but kept for future API compatibility)\n */\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction parseGroupKey(key: string): TradeGroupKey {\n const [dateOpened, timeOpened, strategy] = key.split(\"|\");\n return { dateOpened, timeOpened, strategy };\n}\n\n/**\n * Group trades by their entry timestamp (date + time + strategy)\n * Returns a map where the key is the group identifier and value is array of trades\n */\nexport function groupTradesByEntry(trades: Trade[]): Map<string, Trade[]> {\n const groups = new Map<string, Trade[]>();\n\n for (const trade of trades) {\n const key = generateGroupKey(trade);\n const group = groups.get(key) || [];\n group.push(trade);\n groups.set(key, group);\n }\n\n return groups;\n}\n\n/**\n * Combine a group of trades that were opened at the same time into a single trade record\n *\n * Rules for combining:\n * - Opening fields: Use first trade's values (they should be identical)\n * - Closing fields: Use the last closing time among all trades\n * - Premium: Sum of all premiums\n * - P/L: Sum of all P/Ls\n * - Commissions: Sum of all commissions\n * - Margin: Use the maximum margin requirement\n * - Contracts: Sum of all contracts\n * - Legs: Concatenate all leg descriptions\n * - Closing price: Use weighted average based on premiums\n * - Funds at close: Use final funds from last closed trade\n */\nexport function combineLegGroup(trades: Trade[]): CombinedTrade {\n if (trades.length === 0) {\n throw new Error(\"Cannot combine empty trade group\");\n }\n\n // Sort trades by closing time (or use original order if not closed)\n const sortedTrades = [...trades].sort((a, b) => {\n if (!a.dateClosed && !b.dateClosed) return 0;\n if (!a.dateClosed) return 1;\n if (!b.dateClosed) return -1;\n\n const dateCompare = a.dateClosed.getTime() - b.dateClosed.getTime();\n if (dateCompare !== 0) return dateCompare;\n\n // Secondary sort by time if dates are equal\n const timeA = a.timeClosed || \"00:00:00\";\n const timeB = b.timeClosed || \"00:00:00\";\n return timeA.localeCompare(timeB);\n });\n\n // Use first trade as template (opening info should be identical)\n const firstTrade = sortedTrades[0];\n const lastTrade = sortedTrades[sortedTrades.length - 1];\n\n // Aggregate numeric values\n const totalPremium = trades.reduce((sum, t) => sum + t.premium, 0);\n const allBasesUndeclared = trades.every((trade) => trade.plBasis === undefined);\n const totalPL = allBasesUndeclared\n ? trades.reduce((sum, trade) => sum + trade.pl, 0)\n : trades.reduce((sum, trade) => sum + getNetPl(trade), 0);\n // Use the contract size of the first leg to represent the \"Strategy Unit Size\"\n // e.g. A 10-lot Iron Condor has 4 legs of 10 contracts.\n // We want the combined trade to say \"10 contracts\" (10 ICs), not 40.\n const totalContracts = firstTrade.numContracts;\n const totalOpeningCommissions = trades.reduce((sum, t) => sum + t.openingCommissionsFees, 0);\n const totalClosingCommissions = trades.reduce((sum, t) => sum + t.closingCommissionsFees, 0);\n\n // For margin:\n // - Debit trades (totalPremium < 0): Sum margin (e.g. Straddle = Call + Put cost)\n // - Credit trades (totalPremium >= 0): Max margin (e.g. Iron Condor = Max(Call side, Put side))\n const maxMargin =\n totalPremium < 0\n ? trades.reduce((sum, t) => sum + t.marginReq, 0)\n : Math.max(...trades.map((t) => t.marginReq));\n\n // Calculate weighted average closing price\n let weightedClosingPrice: number | undefined;\n if (trades.every((t) => t.closingPrice !== undefined)) {\n const totalPremiumForClosedTrades = trades\n .filter((t) => t.closingPrice !== undefined)\n .reduce((sum, t) => sum + Math.abs(t.premium), 0);\n\n if (totalPremiumForClosedTrades > 0) {\n weightedClosingPrice =\n trades\n .filter((t) => t.closingPrice !== undefined)\n .reduce((sum, t) => sum + t.closingPrice! * Math.abs(t.premium), 0) /\n totalPremiumForClosedTrades;\n }\n }\n\n // Calculate total closing cost if all trades have it recorded\n let avgClosingCost: number | undefined;\n const tradesWithClosingCost = trades.filter((t) => t.avgClosingCost !== undefined);\n if (tradesWithClosingCost.length === trades.length) {\n avgClosingCost = tradesWithClosingCost.reduce((sum, t) => sum + t.avgClosingCost!, 0);\n }\n\n // Combine leg descriptions\n const combinedLegs = trades.map((t) => t.legs);\n const combinedLegsString = combinedLegs.join(\" | \");\n\n // Use last trade's closing information (latest exit)\n const dateClosed = lastTrade.dateClosed;\n const timeClosed = lastTrade.timeClosed;\n const reasonForClose = lastTrade.reasonForClose;\n const fundsAtClose = lastTrade.fundsAtClose;\n const closingShortLongRatio = lastTrade.closingShortLongRatio;\n const closingVix = lastTrade.closingVix;\n\n // Calculate combined opening short/long ratio (weighted by premium)\n const totalAbsPremium = trades.reduce((sum, t) => sum + Math.abs(t.premium), 0);\n const weightedOpeningShortLongRatio =\n totalAbsPremium > 0\n ? trades.reduce((sum, t) => sum + t.openingShortLongRatio * Math.abs(t.premium), 0) /\n totalAbsPremium\n : trades[0].openingShortLongRatio;\n\n // For optional fields, use first trade's value or undefined\n const gap = firstTrade.gap;\n const movement = firstTrade.movement;\n\n // Max profit/loss handling:\n // - For single trades (originalTradeCount === 1): preserve original percentage values from CSV\n // - For combined trades (originalTradeCount > 1): derive dollar amounts from margin\n let maxProfit: number | undefined;\n let maxLoss: number | undefined;\n\n if (trades.length === 1) {\n // Single trade: preserve original values (percentages from CSV)\n maxProfit = firstTrade.maxProfit;\n maxLoss = firstTrade.maxLoss;\n // For debit trades without explicit maxLoss, use premium paid as max loss\n if (maxLoss === undefined && firstTrade.premium < 0) {\n maxLoss = firstTrade.premium;\n }\n } else {\n // Combined trades: sum maxProfit, use margin for maxLoss\n if (trades.every((t) => t.maxProfit !== undefined)) {\n maxProfit = trades.reduce((sum, t) => sum + t.maxProfit!, 0);\n }\n\n // Use margin requirement as ground truth for worst-case loss\n if (maxMargin && Number.isFinite(maxMargin) && maxMargin > 0) {\n maxLoss = -maxMargin;\n } else if (trades.every((t) => t.maxLoss !== undefined)) {\n maxLoss = trades.reduce((sum, t) => sum + t.maxLoss!, 0);\n } else if (totalPremium < 0) {\n // Fallback: For debit trades, the max loss is at least the premium paid\n maxLoss = totalPremium;\n }\n }\n\n const combined: CombinedTrade = {\n // Opening information (from first trade)\n dateOpened: firstTrade.dateOpened,\n timeOpened: firstTrade.timeOpened,\n openingPrice: firstTrade.openingPrice,\n legs: combinedLegsString,\n premium: totalPremium,\n openingVix: firstTrade.openingVix,\n\n // Closing information (from last closed trade)\n closingPrice: weightedClosingPrice,\n dateClosed,\n timeClosed,\n avgClosingCost,\n reasonForClose,\n closingVix,\n\n // Aggregated values\n pl: totalPL,\n plBasis: allBasesUndeclared ? undefined : PlBasis.NetIncludesFees,\n // A singleton keeps the source's own P/L %; a multi-row group has no source value for the\n // combined position, so enrichment computes it from the combined P/L and premium.\n plPct: trades.length === 1 ? firstTrade.plPct : undefined,\n numContracts: totalContracts,\n fundsAtClose,\n marginReq: maxMargin,\n openingCommissionsFees: totalOpeningCommissions,\n closingCommissionsFees: totalClosingCommissions,\n\n // Strategy and ratios\n strategy: firstTrade.strategy,\n openingShortLongRatio: weightedOpeningShortLongRatio,\n closingShortLongRatio,\n\n // Optional market data\n gap,\n movement,\n maxProfit,\n maxLoss,\n\n // Combined trade metadata\n originalTradeCount: trades.length,\n combinedLegs,\n };\n\n return combined;\n}\n\nexport interface CombineLegGroupsProgress {\n step: string;\n percent: number;\n}\n\nexport interface CombineLegGroupsOptions {\n onProgress?: (progress: CombineLegGroupsProgress) => void;\n signal?: AbortSignal;\n}\n\n/**\n * Process all trades and combine leg groups that share the same entry timestamp\n *\n * @param trades - Array of trades to process\n * @returns Array of trades with leg groups combined (single trades are preserved as-is)\n */\nexport function combineAllLegGroups(trades: Trade[]): CombinedTrade[] {\n const groups = groupTradesByEntry(trades);\n const combinedTrades: CombinedTrade[] = [];\n\n for (const [, groupTrades] of groups) {\n combinedTrades.push(combineLegGroup(groupTrades));\n }\n\n // Sort by date/time to maintain chronological order\n combinedTrades.sort((a, b) => {\n const dateCompare = a.dateOpened.getTime() - b.dateOpened.getTime();\n if (dateCompare !== 0) return dateCompare;\n return a.timeOpened.localeCompare(b.timeOpened);\n });\n\n return combinedTrades;\n}\n\n/**\n * Async version of combineAllLegGroups with progress reporting and cancellation support\n * Use this for large datasets to keep UI responsive\n *\n * @param trades - Array of trades to process\n * @param options - Progress callback and abort signal\n * @returns Array of trades with leg groups combined\n */\nexport async function combineAllLegGroupsAsync(\n trades: Trade[],\n options?: CombineLegGroupsOptions,\n): Promise<CombinedTrade[]> {\n const { onProgress, signal } = options ?? {};\n\n checkCancelled(signal);\n onProgress?.({ step: \"Grouping trades by entry\", percent: 0 });\n await yieldToMain();\n\n const groups = groupTradesByEntry(trades);\n const combinedTrades: CombinedTrade[] = [];\n const totalGroups = groups.size;\n let processedGroups = 0;\n\n checkCancelled(signal);\n onProgress?.({ step: \"Combining leg groups\", percent: 10 });\n\n for (const [, groupTrades] of groups) {\n combinedTrades.push(combineLegGroup(groupTrades));\n processedGroups++;\n\n // Yield every 100 groups to keep UI responsive\n if (processedGroups % 100 === 0) {\n checkCancelled(signal);\n const percent = 10 + Math.floor((processedGroups / totalGroups) * 70);\n onProgress?.({ step: `Combining leg groups (${processedGroups}/${totalGroups})`, percent });\n await yieldToMain();\n }\n }\n\n checkCancelled(signal);\n onProgress?.({ step: \"Sorting combined trades\", percent: 85 });\n await yieldToMain();\n\n // Sort by date/time to maintain chronological order\n combinedTrades.sort((a, b) => {\n const dateCompare = a.dateOpened.getTime() - b.dateOpened.getTime();\n if (dateCompare !== 0) return dateCompare;\n return a.timeOpened.localeCompare(b.timeOpened);\n });\n\n onProgress?.({ step: \"Complete\", percent: 100 });\n\n return combinedTrades;\n}\n\n/**\n * Identify which trades would be affected by combining leg groups\n * Useful for showing users what will change before they enable the feature\n *\n * @returns Object with statistics about grouping\n */\nexport function analyzeLegGroups(trades: Trade[]): {\n totalTrades: number;\n uniqueEntries: number;\n groupedEntries: number;\n maxGroupSize: number;\n avgGroupSize: number;\n groupSizeDistribution: Record<number, number>; // size -> count\n} {\n const groups = groupTradesByEntry(trades);\n\n const groupSizes = Array.from(groups.values()).map((g) => g.length);\n const groupedEntries = groupSizes.filter((size) => size > 1).length;\n\n const distribution: Record<number, number> = {};\n for (const size of groupSizes) {\n distribution[size] = (distribution[size] || 0) + 1;\n }\n\n return {\n totalTrades: trades.length,\n uniqueEntries: groups.size,\n groupedEntries,\n maxGroupSize: groupSizes.length > 0 ? Math.max(...groupSizes) : 0,\n avgGroupSize:\n groupSizes.length > 0 ? groupSizes.reduce((a, b) => a + b, 0) / groupSizes.length : 0,\n groupSizeDistribution: distribution,\n };\n}\n\n// =============================================================================\n// ReportingTrade Combining Functions\n// =============================================================================\n\n/**\n * Generate a unique key for grouping ReportingTrades by entry timestamp\n */\nfunction generateReportingGroupKey(trade: ReportingTrade): string {\n const dateStr = formatDateKey(trade.dateOpened);\n const timeStr = trade.timeOpened ?? \"00:00:00\";\n return `${dateStr}|${timeStr}|${trade.strategy}`;\n}\n\n/**\n * Group ReportingTrades by their entry timestamp (date + time + strategy)\n * Returns a map where the key is the group identifier and value is array of trades\n */\nexport function groupReportingTradesByEntry(\n trades: ReportingTrade[],\n): Map<string, ReportingTrade[]> {\n const groups = new Map<string, ReportingTrade[]>();\n\n for (const trade of trades) {\n const key = generateReportingGroupKey(trade);\n const group = groups.get(key) || [];\n group.push(trade);\n groups.set(key, group);\n }\n\n return groups;\n}\n\n/**\n * Combine a group of ReportingTrades that were opened at the same time into a single trade record\n *\n * Rules for combining (simpler than Trade - fewer fields):\n * - Opening fields: Use first trade's values (should be identical)\n * - Closing fields: Use the last closing time among all trades\n * - Premium: Sum of the signed per-share quotes (all component rows share the lot count)\n * - P/L: Sum of all P/Ls\n * - Contracts: Use first trade's contract count (strategy unit size)\n * - Legs: Concatenate all leg descriptions\n */\nexport function combineReportingLegGroup(trades: ReportingTrade[]): CombinedReportingTrade {\n if (trades.length === 0) {\n throw new Error(\"Cannot combine empty reporting trade group\");\n }\n\n // Sort trades by closing time\n const sortedTrades = [...trades].sort((a, b) => {\n if (!a.dateClosed && !b.dateClosed) return 0;\n if (!a.dateClosed) return 1;\n if (!b.dateClosed) return -1;\n\n const dateCompare = a.dateClosed.getTime() - b.dateClosed.getTime();\n if (dateCompare !== 0) return dateCompare;\n\n const timeA = a.timeClosed || \"00:00:00\";\n const timeB = b.timeClosed || \"00:00:00\";\n return timeA.localeCompare(timeB);\n });\n\n const firstTrade = sortedTrades[0];\n const lastTrade = sortedTrades[sortedTrades.length - 1];\n\n // Aggregate numeric values\n const totalPremium = trades.reduce((sum, t) => sum + t.initialPremium, 0);\n const totalPL = trades.reduce((sum, t) => sum + t.pl, 0);\n const totalContracts = firstTrade.numContracts; // Strategy unit size\n\n // Combine leg descriptions\n const combinedLegs = trades.map((t) => t.legs);\n const combinedLegsString = combinedLegs.join(\" | \");\n\n // Calculate total closing cost if all trades have it\n let avgClosingCost: number | undefined;\n const tradesWithClosingCost = trades.filter((t) => t.avgClosingCost !== undefined);\n if (tradesWithClosingCost.length === trades.length) {\n avgClosingCost = tradesWithClosingCost.reduce((sum, t) => sum + t.avgClosingCost!, 0);\n }\n\n // Weighted average closing price\n let closingPrice: number | undefined;\n if (trades.every((t) => t.closingPrice !== undefined)) {\n const totalPremiumAbs = trades.reduce((sum, t) => sum + Math.abs(t.initialPremium), 0);\n if (totalPremiumAbs > 0) {\n closingPrice =\n trades.reduce((sum, t) => sum + t.closingPrice! * Math.abs(t.initialPremium), 0) /\n totalPremiumAbs;\n }\n }\n\n return {\n strategy: firstTrade.strategy,\n dateOpened: firstTrade.dateOpened,\n timeOpened: firstTrade.timeOpened,\n openingPrice: firstTrade.openingPrice,\n legs: combinedLegsString,\n initialPremium: totalPremium,\n initialPremiumUnit: trades.every(hasReportingPremiumQuote) ? \"quote\" : undefined,\n numContracts: totalContracts,\n pl: totalPL,\n closingPrice,\n dateClosed: lastTrade.dateClosed,\n timeClosed: lastTrade.timeClosed,\n avgClosingCost,\n reasonForClose: lastTrade.reasonForClose,\n originalTradeCount: trades.length,\n combinedLegs,\n };\n}\n\n/**\n * Process all ReportingTrades and combine leg groups that share the same entry timestamp\n *\n * @param trades - Array of ReportingTrades to process\n * @returns Array of trades with leg groups combined\n */\nexport function combineAllReportingLegGroups(trades: ReportingTrade[]): CombinedReportingTrade[] {\n const groups = groupReportingTradesByEntry(trades);\n const combinedTrades: CombinedReportingTrade[] = [];\n\n for (const [, groupTrades] of groups) {\n combinedTrades.push(combineReportingLegGroup(groupTrades));\n }\n\n // Sort chronologically\n combinedTrades.sort((a, b) => {\n const dateCompare = a.dateOpened.getTime() - b.dateOpened.getTime();\n if (dateCompare !== 0) return dateCompare;\n const timeA = a.timeOpened || \"00:00:00\";\n const timeB = b.timeOpened || \"00:00:00\";\n return timeA.localeCompare(timeB);\n });\n\n return combinedTrades;\n}\n","/**\n * Combined Trades Cache\n *\n * Caches pre-calculated combined leg group trades in IndexedDB\n * to avoid expensive recalculation on every page load.\n */\n\nimport type { CombinedTrade } from \"../utils/combine-leg-groups.ts\";\nimport {\n INDEXES,\n promisifyRequest,\n STORES,\n withReadTransaction,\n withWriteTransaction,\n} from \"./index.ts\";\nimport {\n decodeCalendarDays,\n encodeCalendarDays,\n type StoredCalendarDays,\n TRADE_DAY_FIELDS,\n type TradeDayField,\n} from \"./calendar-days.ts\";\n\n/**\n * Cache entry for combined trades\n */\ninterface CombinedTradesCache {\n id: string; // Format: `combined_trades_${blockId}`\n blockId: string;\n calculationType: \"combined_trades\";\n trades: StoredCalendarDays<CombinedTrade, TradeDayField>[];\n tradeCount: number;\n calculatedAt: Date;\n}\n\n/**\n * Generate the cache ID for a block\n */\nfunction getCacheId(blockId: string): string {\n return `combined_trades_v2_${blockId}`;\n}\n\n/**\n * Store pre-calculated combined trades for a block\n */\nexport async function storeCombinedTradesCache(\n blockId: string,\n combinedTrades: CombinedTrade[],\n): Promise<void> {\n const cacheEntry: CombinedTradesCache = {\n id: getCacheId(blockId),\n blockId,\n calculationType: \"combined_trades\",\n trades: combinedTrades.map((trade) => encodeCalendarDays(trade, TRADE_DAY_FIELDS)),\n tradeCount: combinedTrades.length,\n calculatedAt: new Date(),\n };\n\n await withWriteTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n await promisifyRequest(store.put(cacheEntry));\n });\n}\n\n/**\n * Get cached combined trades for a block\n * Returns null if cache doesn't exist\n */\nexport async function getCombinedTradesCache(blockId: string): Promise<CombinedTrade[] | null> {\n return withReadTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n const cacheId = getCacheId(blockId);\n const result = await promisifyRequest(store.get(cacheId));\n\n if (!result || result.calculationType !== \"combined_trades\") {\n return null;\n }\n\n const cache = result as CombinedTradesCache;\n\n return cache.trades.map((trade) =>\n decodeCalendarDays<CombinedTrade, TradeDayField>(trade, TRADE_DAY_FIELDS),\n );\n });\n}\n\n/**\n * Delete cached combined trades for a block\n */\nexport async function deleteCombinedTradesCache(blockId: string): Promise<void> {\n await withWriteTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n const cacheId = getCacheId(blockId);\n\n // Check if entry exists before trying to delete\n const existing = await promisifyRequest(store.get(cacheId));\n if (existing) {\n await promisifyRequest(store.delete(cacheId));\n }\n });\n}\n\n/**\n * Check if combined trades cache exists for a block\n */\nexport async function hasCombinedTradesCache(blockId: string): Promise<boolean> {\n return withReadTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n const cacheId = getCacheId(blockId);\n const result = await promisifyRequest(store.get(cacheId));\n return result?.calculationType === \"combined_trades\";\n });\n}\n\n/**\n * Invalidate all calculation caches for a block\n * (including combined trades cache)\n */\nexport async function invalidateBlockCaches(blockId: string): Promise<void> {\n await withWriteTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n const index = store.index(INDEXES.CALCULATIONS_BY_BLOCK);\n const request = index.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n request.onerror = () => reject(request.error);\n });\n });\n}\n","/**\n * Historical 3-Month Treasury Bill Rates (DTB3)\n * Source: Federal Reserve Economic Data (FRED), St. Louis Federal Reserve\n * Data series: DTB3 (Market Yield on U.S. Treasury Securities at 3-Month Constant Maturity)\n *\n * Values are annual percentages (e.g., 4.32 = 4.32% annual rate)\n * Keys are dates in YYYY-MM-DD format (US Eastern time)\n *\n * Used for calculating risk-free rate in Sharpe/Sortino ratio calculations.\n *\n * @see https://fred.stlouisfed.org/series/DTB3\n *\n * ## How to Update\n *\n * Daily DTB3 and SOFR observations are published to the rates-data branch.\n * For a reviewed release, run `node scripts/rates.mjs seed` to refresh both\n * bundled tables from that validated publication. The release workflow checks\n * bundle freshness with `node scripts/rates.mjs seed-check --max-lag-days 10`.\n *\n * Note: Rates are only available for trading days (weekdays, excluding market holidays).\n * The lookup utility handles weekends/holidays by finding the most recent prior trading day.\n */\nexport const TREASURY_RATES: Record<string, number> = {\n \"2013-01-02\": 0.08,\n \"2013-01-03\": 0.08,\n \"2013-01-04\": 0.07,\n \"2013-01-07\": 0.07,\n \"2013-01-08\": 0.07,\n \"2013-01-09\": 0.06,\n \"2013-01-10\": 0.06,\n \"2013-01-11\": 0.07,\n \"2013-01-14\": 0.08,\n \"2013-01-15\": 0.09,\n \"2013-01-16\": 0.08,\n \"2013-01-17\": 0.07,\n \"2013-01-18\": 0.08,\n \"2013-01-22\": 0.08,\n \"2013-01-23\": 0.08,\n \"2013-01-24\": 0.08,\n \"2013-01-25\": 0.08,\n \"2013-01-28\": 0.07,\n \"2013-01-29\": 0.07,\n \"2013-01-30\": 0.07,\n \"2013-01-31\": 0.07,\n \"2013-02-01\": 0.06,\n \"2013-02-04\": 0.07,\n \"2013-02-05\": 0.07,\n \"2013-02-06\": 0.07,\n \"2013-02-07\": 0.07,\n \"2013-02-08\": 0.07,\n \"2013-02-11\": 0.09,\n \"2013-02-12\": 0.09,\n \"2013-02-13\": 0.1,\n \"2013-02-14\": 0.11,\n \"2013-02-15\": 0.1,\n \"2013-02-19\": 0.12,\n \"2013-02-20\": 0.12,\n \"2013-02-21\": 0.13,\n \"2013-02-22\": 0.13,\n \"2013-02-25\": 0.12,\n \"2013-02-26\": 0.14,\n \"2013-02-27\": 0.11,\n \"2013-02-28\": 0.11,\n \"2013-03-01\": 0.11,\n \"2013-03-04\": 0.11,\n \"2013-03-05\": 0.08,\n \"2013-03-06\": 0.1,\n \"2013-03-07\": 0.1,\n \"2013-03-08\": 0.1,\n \"2013-03-11\": 0.1,\n \"2013-03-12\": 0.1,\n \"2013-03-13\": 0.09,\n \"2013-03-14\": 0.1,\n \"2013-03-15\": 0.09,\n \"2013-03-18\": 0.07,\n \"2013-03-19\": 0.07,\n \"2013-03-20\": 0.07,\n \"2013-03-21\": 0.07,\n \"2013-03-22\": 0.07,\n \"2013-03-25\": 0.08,\n \"2013-03-26\": 0.07,\n \"2013-03-27\": 0.09,\n \"2013-03-28\": 0.07,\n \"2013-04-01\": 0.08,\n \"2013-04-02\": 0.07,\n \"2013-04-03\": 0.06,\n \"2013-04-04\": 0.07,\n \"2013-04-05\": 0.07,\n \"2013-04-08\": 0.07,\n \"2013-04-09\": 0.06,\n \"2013-04-10\": 0.07,\n \"2013-04-11\": 0.07,\n \"2013-04-12\": 0.06,\n \"2013-04-15\": 0.06,\n \"2013-04-16\": 0.06,\n \"2013-04-17\": 0.06,\n \"2013-04-18\": 0.05,\n \"2013-04-19\": 0.05,\n \"2013-04-22\": 0.05,\n \"2013-04-23\": 0.05,\n \"2013-04-24\": 0.06,\n \"2013-04-25\": 0.05,\n \"2013-04-26\": 0.05,\n \"2013-04-29\": 0.05,\n \"2013-04-30\": 0.05,\n \"2013-05-01\": 0.06,\n \"2013-05-02\": 0.05,\n \"2013-05-03\": 0.05,\n \"2013-05-06\": 0.04,\n \"2013-05-07\": 0.04,\n \"2013-05-08\": 0.04,\n \"2013-05-09\": 0.04,\n \"2013-05-10\": 0.04,\n \"2013-05-13\": 0.05,\n \"2013-05-14\": 0.05,\n \"2013-05-15\": 0.04,\n \"2013-05-16\": 0.03,\n \"2013-05-17\": 0.04,\n \"2013-05-20\": 0.05,\n \"2013-05-21\": 0.04,\n \"2013-05-22\": 0.04,\n \"2013-05-23\": 0.05,\n \"2013-05-24\": 0.04,\n \"2013-05-28\": 0.05,\n \"2013-05-29\": 0.05,\n \"2013-05-30\": 0.04,\n \"2013-05-31\": 0.04,\n \"2013-06-03\": 0.05,\n \"2013-06-04\": 0.04,\n \"2013-06-05\": 0.05,\n \"2013-06-06\": 0.05,\n \"2013-06-07\": 0.04,\n \"2013-06-10\": 0.05,\n \"2013-06-11\": 0.05,\n \"2013-06-12\": 0.05,\n \"2013-06-13\": 0.05,\n \"2013-06-14\": 0.05,\n \"2013-06-17\": 0.05,\n \"2013-06-18\": 0.05,\n \"2013-06-19\": 0.05,\n \"2013-06-20\": 0.05,\n \"2013-06-21\": 0.05,\n \"2013-06-24\": 0.06,\n \"2013-06-25\": 0.06,\n \"2013-06-26\": 0.06,\n \"2013-06-27\": 0.06,\n \"2013-06-28\": 0.04,\n \"2013-07-01\": 0.04,\n \"2013-07-02\": 0.03,\n \"2013-07-03\": 0.05,\n \"2013-07-05\": 0.04,\n \"2013-07-08\": 0.05,\n \"2013-07-09\": 0.04,\n \"2013-07-10\": 0.04,\n \"2013-07-11\": 0.04,\n \"2013-07-12\": 0.04,\n \"2013-07-15\": 0.04,\n \"2013-07-16\": 0.03,\n \"2013-07-17\": 0.03,\n \"2013-07-18\": 0.03,\n \"2013-07-19\": 0.03,\n \"2013-07-22\": 0.04,\n \"2013-07-23\": 0.02,\n \"2013-07-24\": 0.03,\n \"2013-07-25\": 0.02,\n \"2013-07-26\": 0.03,\n \"2013-07-29\": 0.03,\n \"2013-07-30\": 0.04,\n \"2013-07-31\": 0.04,\n \"2013-08-01\": 0.04,\n \"2013-08-02\": 0.04,\n \"2013-08-05\": 0.05,\n \"2013-08-06\": 0.04,\n \"2013-08-07\": 0.05,\n \"2013-08-08\": 0.05,\n \"2013-08-09\": 0.05,\n \"2013-08-12\": 0.06,\n \"2013-08-13\": 0.06,\n \"2013-08-14\": 0.05,\n \"2013-08-15\": 0.05,\n \"2013-08-16\": 0.05,\n \"2013-08-19\": 0.06,\n \"2013-08-20\": 0.04,\n \"2013-08-21\": 0.04,\n \"2013-08-22\": 0.03,\n \"2013-08-23\": 0.03,\n \"2013-08-26\": 0.04,\n \"2013-08-27\": 0.05,\n \"2013-08-28\": 0.03,\n \"2013-08-29\": 0.02,\n \"2013-08-30\": 0.03,\n \"2013-09-03\": 0.02,\n \"2013-09-04\": 0.02,\n \"2013-09-05\": 0.02,\n \"2013-09-06\": 0.02,\n \"2013-09-09\": 0.02,\n \"2013-09-10\": 0.02,\n \"2013-09-11\": 0.02,\n \"2013-09-12\": 0.01,\n \"2013-09-13\": 0.01,\n \"2013-09-16\": 0.02,\n \"2013-09-17\": 0.01,\n \"2013-09-18\": 0.01,\n \"2013-09-19\": 0.01,\n \"2013-09-20\": 0.01,\n \"2013-09-23\": 0.02,\n \"2013-09-24\": 0.02,\n \"2013-09-25\": 0.02,\n \"2013-09-26\": 0.0,\n \"2013-09-27\": 0.02,\n \"2013-09-30\": 0.02,\n \"2013-10-01\": 0.02,\n \"2013-10-02\": 0.02,\n \"2013-10-03\": 0.03,\n \"2013-10-04\": 0.03,\n \"2013-10-07\": 0.03,\n \"2013-10-08\": 0.05,\n \"2013-10-09\": 0.05,\n \"2013-10-10\": 0.05,\n \"2013-10-11\": 0.08,\n \"2013-10-15\": 0.14,\n \"2013-10-16\": 0.1,\n \"2013-10-17\": 0.05,\n \"2013-10-18\": 0.04,\n \"2013-10-21\": 0.04,\n \"2013-10-22\": 0.04,\n \"2013-10-23\": 0.04,\n \"2013-10-24\": 0.03,\n \"2013-10-25\": 0.04,\n \"2013-10-28\": 0.04,\n \"2013-10-29\": 0.04,\n \"2013-10-30\": 0.04,\n \"2013-10-31\": 0.04,\n \"2013-11-01\": 0.04,\n \"2013-11-04\": 0.05,\n \"2013-11-05\": 0.05,\n \"2013-11-06\": 0.05,\n \"2013-11-07\": 0.05,\n \"2013-11-08\": 0.06,\n \"2013-11-12\": 0.08,\n \"2013-11-13\": 0.08,\n \"2013-11-14\": 0.08,\n \"2013-11-15\": 0.08,\n \"2013-11-18\": 0.09,\n \"2013-11-19\": 0.08,\n \"2013-11-20\": 0.08,\n \"2013-11-21\": 0.07,\n \"2013-11-22\": 0.07,\n \"2013-11-25\": 0.08,\n \"2013-11-26\": 0.07,\n \"2013-11-27\": 0.07,\n \"2013-11-29\": 0.06,\n \"2013-12-02\": 0.05,\n \"2013-12-03\": 0.06,\n \"2013-12-04\": 0.06,\n \"2013-12-05\": 0.06,\n \"2013-12-06\": 0.06,\n \"2013-12-09\": 0.07,\n \"2013-12-10\": 0.07,\n \"2013-12-11\": 0.07,\n \"2013-12-12\": 0.07,\n \"2013-12-13\": 0.07,\n \"2013-12-16\": 0.07,\n \"2013-12-17\": 0.07,\n \"2013-12-18\": 0.07,\n \"2013-12-19\": 0.06,\n \"2013-12-20\": 0.07,\n \"2013-12-23\": 0.07,\n \"2013-12-24\": 0.07,\n \"2013-12-26\": 0.07,\n \"2013-12-27\": 0.07,\n \"2013-12-30\": 0.07,\n \"2013-12-31\": 0.07,\n \"2014-01-02\": 0.07,\n \"2014-01-03\": 0.07,\n \"2014-01-06\": 0.05,\n \"2014-01-07\": 0.04,\n \"2014-01-08\": 0.05,\n \"2014-01-09\": 0.04,\n \"2014-01-10\": 0.05,\n \"2014-01-13\": 0.03,\n \"2014-01-14\": 0.04,\n \"2014-01-15\": 0.04,\n \"2014-01-16\": 0.04,\n \"2014-01-17\": 0.05,\n \"2014-01-21\": 0.04,\n \"2014-01-22\": 0.04,\n \"2014-01-23\": 0.04,\n \"2014-01-24\": 0.04,\n \"2014-01-27\": 0.05,\n \"2014-01-28\": 0.05,\n \"2014-01-29\": 0.04,\n \"2014-01-30\": 0.02,\n \"2014-01-31\": 0.02,\n \"2014-02-03\": 0.05,\n \"2014-02-04\": 0.06,\n \"2014-02-05\": 0.07,\n \"2014-02-06\": 0.07,\n \"2014-02-07\": 0.08,\n \"2014-02-10\": 0.07,\n \"2014-02-11\": 0.05,\n \"2014-02-12\": 0.05,\n \"2014-02-13\": 0.03,\n \"2014-02-14\": 0.02,\n \"2014-02-18\": 0.05,\n \"2014-02-19\": 0.06,\n \"2014-02-20\": 0.05,\n \"2014-02-21\": 0.05,\n \"2014-02-24\": 0.05,\n \"2014-02-25\": 0.05,\n \"2014-02-26\": 0.05,\n \"2014-02-27\": 0.04,\n \"2014-02-28\": 0.05,\n \"2014-03-03\": 0.05,\n \"2014-03-04\": 0.05,\n \"2014-03-05\": 0.06,\n \"2014-03-06\": 0.05,\n \"2014-03-07\": 0.06,\n \"2014-03-10\": 0.05,\n \"2014-03-11\": 0.05,\n \"2014-03-12\": 0.05,\n \"2014-03-13\": 0.05,\n \"2014-03-14\": 0.05,\n \"2014-03-17\": 0.06,\n \"2014-03-18\": 0.05,\n \"2014-03-19\": 0.06,\n \"2014-03-20\": 0.06,\n \"2014-03-21\": 0.06,\n \"2014-03-24\": 0.06,\n \"2014-03-25\": 0.05,\n \"2014-03-26\": 0.05,\n \"2014-03-27\": 0.04,\n \"2014-03-28\": 0.04,\n \"2014-03-31\": 0.05,\n \"2014-04-01\": 0.04,\n \"2014-04-02\": 0.02,\n \"2014-04-03\": 0.02,\n \"2014-04-04\": 0.03,\n \"2014-04-07\": 0.03,\n \"2014-04-08\": 0.03,\n \"2014-04-09\": 0.04,\n \"2014-04-10\": 0.04,\n \"2014-04-11\": 0.04,\n \"2014-04-14\": 0.04,\n \"2014-04-15\": 0.04,\n \"2014-04-16\": 0.04,\n \"2014-04-17\": 0.03,\n \"2014-04-21\": 0.04,\n \"2014-04-22\": 0.03,\n \"2014-04-23\": 0.02,\n \"2014-04-24\": 0.01,\n \"2014-04-25\": 0.03,\n \"2014-04-28\": 0.03,\n \"2014-04-29\": 0.02,\n \"2014-04-30\": 0.03,\n \"2014-05-01\": 0.03,\n \"2014-05-02\": 0.02,\n \"2014-05-05\": 0.03,\n \"2014-05-06\": 0.03,\n \"2014-05-07\": 0.03,\n \"2014-05-08\": 0.03,\n \"2014-05-09\": 0.03,\n \"2014-05-12\": 0.03,\n \"2014-05-13\": 0.03,\n \"2014-05-14\": 0.03,\n \"2014-05-15\": 0.03,\n \"2014-05-16\": 0.03,\n \"2014-05-19\": 0.03,\n \"2014-05-20\": 0.03,\n \"2014-05-21\": 0.04,\n \"2014-05-22\": 0.03,\n \"2014-05-23\": 0.04,\n \"2014-05-27\": 0.04,\n \"2014-05-28\": 0.04,\n \"2014-05-29\": 0.04,\n \"2014-05-30\": 0.04,\n \"2014-06-02\": 0.04,\n \"2014-06-03\": 0.04,\n \"2014-06-04\": 0.04,\n \"2014-06-05\": 0.04,\n \"2014-06-06\": 0.04,\n \"2014-06-09\": 0.04,\n \"2014-06-10\": 0.04,\n \"2014-06-11\": 0.04,\n \"2014-06-12\": 0.04,\n \"2014-06-13\": 0.04,\n \"2014-06-16\": 0.04,\n \"2014-06-17\": 0.04,\n \"2014-06-18\": 0.03,\n \"2014-06-19\": 0.02,\n \"2014-06-20\": 0.02,\n \"2014-06-23\": 0.03,\n \"2014-06-24\": 0.03,\n \"2014-06-25\": 0.03,\n \"2014-06-26\": 0.04,\n \"2014-06-27\": 0.03,\n \"2014-06-30\": 0.04,\n \"2014-07-01\": 0.02,\n \"2014-07-02\": 0.02,\n \"2014-07-03\": 0.01,\n \"2014-07-07\": 0.04,\n \"2014-07-08\": 0.03,\n \"2014-07-09\": 0.03,\n \"2014-07-10\": 0.02,\n \"2014-07-11\": 0.02,\n \"2014-07-14\": 0.03,\n \"2014-07-15\": 0.02,\n \"2014-07-16\": 0.02,\n \"2014-07-17\": 0.02,\n \"2014-07-18\": 0.02,\n \"2014-07-21\": 0.03,\n \"2014-07-22\": 0.03,\n \"2014-07-23\": 0.03,\n \"2014-07-24\": 0.03,\n \"2014-07-25\": 0.03,\n \"2014-07-28\": 0.04,\n \"2014-07-29\": 0.02,\n \"2014-07-30\": 0.04,\n \"2014-07-31\": 0.03,\n \"2014-08-01\": 0.03,\n \"2014-08-04\": 0.04,\n \"2014-08-05\": 0.03,\n \"2014-08-06\": 0.03,\n \"2014-08-07\": 0.03,\n \"2014-08-08\": 0.03,\n \"2014-08-11\": 0.04,\n \"2014-08-12\": 0.03,\n \"2014-08-13\": 0.04,\n \"2014-08-14\": 0.04,\n \"2014-08-15\": 0.03,\n \"2014-08-18\": 0.03,\n \"2014-08-19\": 0.03,\n \"2014-08-20\": 0.04,\n \"2014-08-21\": 0.02,\n \"2014-08-22\": 0.03,\n \"2014-08-25\": 0.04,\n \"2014-08-26\": 0.03,\n \"2014-08-27\": 0.04,\n \"2014-08-28\": 0.03,\n \"2014-08-29\": 0.03,\n \"2014-09-02\": 0.03,\n \"2014-09-03\": 0.03,\n \"2014-09-04\": 0.03,\n \"2014-09-05\": 0.03,\n \"2014-09-08\": 0.02,\n \"2014-09-09\": 0.02,\n \"2014-09-10\": 0.02,\n \"2014-09-11\": 0.02,\n \"2014-09-12\": 0.02,\n \"2014-09-15\": 0.02,\n \"2014-09-16\": 0.02,\n \"2014-09-17\": 0.02,\n \"2014-09-18\": 0.02,\n \"2014-09-19\": 0.02,\n \"2014-09-22\": 0.01,\n \"2014-09-23\": 0.01,\n \"2014-09-24\": 0.02,\n \"2014-09-25\": 0.01,\n \"2014-09-26\": 0.01,\n \"2014-09-29\": 0.02,\n \"2014-09-30\": 0.02,\n \"2014-10-01\": 0.02,\n \"2014-10-02\": 0.01,\n \"2014-10-03\": 0.01,\n \"2014-10-06\": 0.02,\n \"2014-10-07\": 0.02,\n \"2014-10-08\": 0.01,\n \"2014-10-09\": 0.01,\n \"2014-10-10\": 0.01,\n \"2014-10-14\": 0.02,\n \"2014-10-15\": 0.02,\n \"2014-10-16\": 0.03,\n \"2014-10-17\": 0.02,\n \"2014-10-20\": 0.02,\n \"2014-10-21\": 0.02,\n \"2014-10-22\": 0.02,\n \"2014-10-23\": 0.01,\n \"2014-10-24\": 0.01,\n \"2014-10-27\": 0.02,\n \"2014-10-28\": 0.02,\n \"2014-10-29\": 0.03,\n \"2014-10-30\": 0.01,\n \"2014-10-31\": 0.01,\n \"2014-11-03\": 0.02,\n \"2014-11-04\": 0.03,\n \"2014-11-05\": 0.03,\n \"2014-11-06\": 0.03,\n \"2014-11-07\": 0.03,\n \"2014-11-10\": 0.02,\n \"2014-11-12\": 0.02,\n \"2014-11-13\": 0.02,\n \"2014-11-14\": 0.02,\n \"2014-11-17\": 0.03,\n \"2014-11-18\": 0.02,\n \"2014-11-19\": 0.01,\n \"2014-11-20\": 0.02,\n \"2014-11-21\": 0.01,\n \"2014-11-24\": 0.02,\n \"2014-11-25\": 0.02,\n \"2014-11-26\": 0.02,\n \"2014-11-28\": 0.02,\n \"2014-12-01\": 0.03,\n \"2014-12-02\": 0.03,\n \"2014-12-03\": 0.01,\n \"2014-12-04\": 0.02,\n \"2014-12-05\": 0.02,\n \"2014-12-08\": 0.03,\n \"2014-12-09\": 0.04,\n \"2014-12-10\": 0.03,\n \"2014-12-11\": 0.03,\n \"2014-12-12\": 0.02,\n \"2014-12-15\": 0.04,\n \"2014-12-16\": 0.03,\n \"2014-12-17\": 0.03,\n \"2014-12-18\": 0.04,\n \"2014-12-19\": 0.04,\n \"2014-12-22\": 0.05,\n \"2014-12-23\": 0.03,\n \"2014-12-24\": 0.01,\n \"2014-12-26\": 0.01,\n \"2014-12-29\": 0.03,\n \"2014-12-30\": 0.03,\n \"2014-12-31\": 0.04,\n \"2015-01-02\": 0.02,\n \"2015-01-05\": 0.03,\n \"2015-01-06\": 0.03,\n \"2015-01-07\": 0.03,\n \"2015-01-08\": 0.03,\n \"2015-01-09\": 0.02,\n \"2015-01-12\": 0.03,\n \"2015-01-13\": 0.03,\n \"2015-01-14\": 0.04,\n \"2015-01-15\": 0.03,\n \"2015-01-16\": 0.03,\n \"2015-01-20\": 0.03,\n \"2015-01-21\": 0.03,\n \"2015-01-22\": 0.03,\n \"2015-01-23\": 0.02,\n \"2015-01-26\": 0.03,\n \"2015-01-27\": 0.02,\n \"2015-01-28\": 0.02,\n \"2015-01-29\": 0.03,\n \"2015-01-30\": 0.02,\n \"2015-02-02\": 0.02,\n \"2015-02-03\": 0.02,\n \"2015-02-04\": 0.01,\n \"2015-02-05\": 0.02,\n \"2015-02-06\": 0.02,\n \"2015-02-09\": 0.01,\n \"2015-02-10\": 0.01,\n \"2015-02-11\": 0.01,\n \"2015-02-12\": 0.02,\n \"2015-02-13\": 0.01,\n \"2015-02-17\": 0.02,\n \"2015-02-18\": 0.02,\n \"2015-02-19\": 0.02,\n \"2015-02-20\": 0.02,\n \"2015-02-23\": 0.02,\n \"2015-02-24\": 0.02,\n \"2015-02-25\": 0.02,\n \"2015-02-26\": 0.03,\n \"2015-02-27\": 0.02,\n \"2015-03-02\": 0.02,\n \"2015-03-03\": 0.02,\n \"2015-03-04\": 0.01,\n \"2015-03-05\": 0.02,\n \"2015-03-06\": 0.01,\n \"2015-03-09\": 0.02,\n \"2015-03-10\": 0.02,\n \"2015-03-11\": 0.03,\n \"2015-03-12\": 0.03,\n \"2015-03-13\": 0.03,\n \"2015-03-16\": 0.05,\n \"2015-03-17\": 0.05,\n \"2015-03-18\": 0.03,\n \"2015-03-19\": 0.03,\n \"2015-03-20\": 0.01,\n \"2015-03-23\": 0.03,\n \"2015-03-24\": 0.02,\n \"2015-03-25\": 0.04,\n \"2015-03-26\": 0.03,\n \"2015-03-27\": 0.04,\n \"2015-03-30\": 0.04,\n \"2015-03-31\": 0.03,\n \"2015-04-01\": 0.03,\n \"2015-04-02\": 0.02,\n \"2015-04-03\": 0.02,\n \"2015-04-06\": 0.03,\n \"2015-04-07\": 0.02,\n \"2015-04-08\": 0.03,\n \"2015-04-09\": 0.03,\n \"2015-04-10\": 0.02,\n \"2015-04-13\": 0.03,\n \"2015-04-14\": 0.02,\n \"2015-04-15\": 0.02,\n \"2015-04-16\": 0.02,\n \"2015-04-17\": 0.01,\n \"2015-04-20\": 0.03,\n \"2015-04-21\": 0.03,\n \"2015-04-22\": 0.03,\n \"2015-04-23\": 0.03,\n \"2015-04-24\": 0.03,\n \"2015-04-27\": 0.02,\n \"2015-04-28\": 0.02,\n \"2015-04-29\": 0.01,\n \"2015-04-30\": 0.01,\n \"2015-05-01\": 0.01,\n \"2015-05-04\": 0.02,\n \"2015-05-05\": 0.01,\n \"2015-05-06\": 0.02,\n \"2015-05-07\": 0.01,\n \"2015-05-08\": 0.01,\n \"2015-05-11\": 0.02,\n \"2015-05-12\": 0.03,\n \"2015-05-13\": 0.02,\n \"2015-05-14\": 0.01,\n \"2015-05-15\": 0.02,\n \"2015-05-18\": 0.02,\n \"2015-05-19\": 0.02,\n \"2015-05-20\": 0.02,\n \"2015-05-21\": 0.02,\n \"2015-05-22\": 0.02,\n \"2015-05-26\": 0.02,\n \"2015-05-27\": 0.01,\n \"2015-05-28\": 0.01,\n \"2015-05-29\": 0.01,\n \"2015-06-01\": 0.02,\n \"2015-06-02\": 0.01,\n \"2015-06-03\": 0.02,\n \"2015-06-04\": 0.02,\n \"2015-06-05\": 0.03,\n \"2015-06-08\": 0.02,\n \"2015-06-09\": 0.02,\n \"2015-06-10\": 0.02,\n \"2015-06-11\": 0.01,\n \"2015-06-12\": 0.02,\n \"2015-06-15\": 0.02,\n \"2015-06-16\": 0.01,\n \"2015-06-17\": 0.01,\n \"2015-06-18\": 0.01,\n \"2015-06-19\": 0.01,\n \"2015-06-22\": 0.01,\n \"2015-06-23\": 0.01,\n \"2015-06-24\": 0.01,\n \"2015-06-25\": 0.01,\n \"2015-06-26\": 0.01,\n \"2015-06-29\": 0.02,\n \"2015-06-30\": 0.01,\n \"2015-07-01\": 0.01,\n \"2015-07-02\": 0.01,\n \"2015-07-06\": 0.02,\n \"2015-07-07\": 0.02,\n \"2015-07-08\": 0.02,\n \"2015-07-09\": 0.03,\n \"2015-07-10\": 0.01,\n \"2015-07-13\": 0.02,\n \"2015-07-14\": 0.01,\n \"2015-07-15\": 0.02,\n \"2015-07-16\": 0.02,\n \"2015-07-17\": 0.03,\n \"2015-07-20\": 0.04,\n \"2015-07-21\": 0.03,\n \"2015-07-22\": 0.04,\n \"2015-07-23\": 0.03,\n \"2015-07-24\": 0.04,\n \"2015-07-27\": 0.05,\n \"2015-07-28\": 0.05,\n \"2015-07-29\": 0.06,\n \"2015-07-30\": 0.07,\n \"2015-07-31\": 0.08,\n \"2015-08-03\": 0.08,\n \"2015-08-04\": 0.08,\n \"2015-08-05\": 0.08,\n \"2015-08-06\": 0.04,\n \"2015-08-07\": 0.06,\n \"2015-08-10\": 0.12,\n \"2015-08-11\": 0.1,\n \"2015-08-12\": 0.1,\n \"2015-08-13\": 0.1,\n \"2015-08-14\": 0.09,\n \"2015-08-17\": 0.1,\n \"2015-08-18\": 0.07,\n \"2015-08-19\": 0.05,\n \"2015-08-20\": 0.02,\n \"2015-08-21\": 0.03,\n \"2015-08-24\": 0.06,\n \"2015-08-25\": 0.07,\n \"2015-08-26\": 0.06,\n \"2015-08-27\": 0.06,\n \"2015-08-28\": 0.06,\n \"2015-08-31\": 0.08,\n \"2015-09-01\": 0.03,\n \"2015-09-02\": 0.03,\n \"2015-09-03\": 0.02,\n \"2015-09-04\": 0.02,\n \"2015-09-08\": 0.06,\n \"2015-09-09\": 0.03,\n \"2015-09-10\": 0.02,\n \"2015-09-11\": 0.04,\n \"2015-09-14\": 0.07,\n \"2015-09-15\": 0.07,\n \"2015-09-16\": 0.06,\n \"2015-09-17\": 0.01,\n \"2015-09-18\": -0.01,\n \"2015-09-21\": 0.01,\n \"2015-09-22\": -0.01,\n \"2015-09-23\": 0.01,\n \"2015-09-24\": 0.01,\n \"2015-09-25\": -0.01,\n \"2015-09-28\": 0.01,\n \"2015-09-29\": 0.01,\n \"2015-09-30\": -0.01,\n \"2015-10-01\": -0.02,\n \"2015-10-02\": 0.0,\n \"2015-10-05\": 0.01,\n \"2015-10-06\": 0.0,\n \"2015-10-07\": 0.0,\n \"2015-10-08\": -0.01,\n \"2015-10-09\": 0.01,\n \"2015-10-13\": 0.01,\n \"2015-10-14\": 0.0,\n \"2015-10-15\": 0.01,\n \"2015-10-16\": 0.01,\n \"2015-10-19\": 0.02,\n \"2015-10-20\": 0.02,\n \"2015-10-21\": 0.01,\n \"2015-10-22\": 0.0,\n \"2015-10-23\": 0.01,\n \"2015-10-26\": 0.02,\n \"2015-10-27\": 0.03,\n \"2015-10-28\": 0.04,\n \"2015-10-29\": 0.07,\n \"2015-10-30\": 0.08,\n \"2015-11-02\": 0.08,\n \"2015-11-03\": 0.06,\n \"2015-11-04\": 0.05,\n \"2015-11-05\": 0.05,\n \"2015-11-06\": 0.08,\n \"2015-11-09\": 0.14,\n \"2015-11-10\": 0.13,\n \"2015-11-12\": 0.14,\n \"2015-11-13\": 0.13,\n \"2015-11-16\": 0.15,\n \"2015-11-17\": 0.14,\n \"2015-11-18\": 0.12,\n \"2015-11-19\": 0.11,\n \"2015-11-20\": 0.11,\n \"2015-11-23\": 0.14,\n \"2015-11-24\": 0.16,\n \"2015-11-25\": 0.19,\n \"2015-11-27\": 0.17,\n \"2015-11-30\": 0.22,\n \"2015-12-01\": 0.21,\n \"2015-12-02\": 0.21,\n \"2015-12-03\": 0.21,\n \"2015-12-04\": 0.22,\n \"2015-12-07\": 0.29,\n \"2015-12-08\": 0.27,\n \"2015-12-09\": 0.26,\n \"2015-12-10\": 0.24,\n \"2015-12-11\": 0.22,\n \"2015-12-14\": 0.26,\n \"2015-12-15\": 0.25,\n \"2015-12-16\": 0.27,\n \"2015-12-17\": 0.23,\n \"2015-12-18\": 0.19,\n \"2015-12-21\": 0.24,\n \"2015-12-22\": 0.21,\n \"2015-12-23\": 0.2,\n \"2015-12-24\": 0.2,\n \"2015-12-28\": 0.23,\n \"2015-12-29\": 0.23,\n \"2015-12-30\": 0.21,\n \"2015-12-31\": 0.16,\n \"2016-01-04\": 0.22,\n \"2016-01-05\": 0.2,\n \"2016-01-06\": 0.21,\n \"2016-01-07\": 0.2,\n \"2016-01-08\": 0.2,\n \"2016-01-11\": 0.21,\n \"2016-01-12\": 0.21,\n \"2016-01-13\": 0.22,\n \"2016-01-14\": 0.25,\n \"2016-01-15\": 0.23,\n \"2016-01-19\": 0.26,\n \"2016-01-20\": 0.26,\n \"2016-01-21\": 0.28,\n \"2016-01-22\": 0.3,\n \"2016-01-25\": 0.31,\n \"2016-01-26\": 0.31,\n \"2016-01-27\": 0.32,\n \"2016-01-28\": 0.34,\n \"2016-01-29\": 0.32,\n \"2016-02-01\": 0.35,\n \"2016-02-02\": 0.34,\n \"2016-02-03\": 0.33,\n \"2016-02-04\": 0.29,\n \"2016-02-05\": 0.29,\n \"2016-02-08\": 0.32,\n \"2016-02-09\": 0.3,\n \"2016-02-10\": 0.31,\n \"2016-02-11\": 0.28,\n \"2016-02-12\": 0.29,\n \"2016-02-16\": 0.3,\n \"2016-02-17\": 0.3,\n \"2016-02-18\": 0.3,\n \"2016-02-19\": 0.3,\n \"2016-02-22\": 0.33,\n \"2016-02-23\": 0.32,\n \"2016-02-24\": 0.33,\n \"2016-02-25\": 0.32,\n \"2016-02-26\": 0.32,\n \"2016-02-29\": 0.33,\n \"2016-03-01\": 0.33,\n \"2016-03-02\": 0.35,\n \"2016-03-03\": 0.27,\n \"2016-03-04\": 0.28,\n \"2016-03-07\": 0.32,\n \"2016-03-08\": 0.29,\n \"2016-03-09\": 0.3,\n \"2016-03-10\": 0.31,\n \"2016-03-11\": 0.32,\n \"2016-03-14\": 0.34,\n \"2016-03-15\": 0.34,\n \"2016-03-16\": 0.31,\n \"2016-03-17\": 0.29,\n \"2016-03-18\": 0.29,\n \"2016-03-21\": 0.31,\n \"2016-03-22\": 0.3,\n \"2016-03-23\": 0.3,\n \"2016-03-24\": 0.29,\n \"2016-03-28\": 0.29,\n \"2016-03-29\": 0.23,\n \"2016-03-30\": 0.2,\n \"2016-03-31\": 0.21,\n \"2016-04-01\": 0.23,\n \"2016-04-04\": 0.23,\n \"2016-04-05\": 0.23,\n \"2016-04-06\": 0.23,\n \"2016-04-07\": 0.23,\n \"2016-04-08\": 0.23,\n \"2016-04-11\": 0.23,\n \"2016-04-12\": 0.22,\n \"2016-04-13\": 0.23,\n \"2016-04-14\": 0.22,\n \"2016-04-15\": 0.22,\n \"2016-04-18\": 0.22,\n \"2016-04-19\": 0.21,\n \"2016-04-20\": 0.23,\n \"2016-04-21\": 0.23,\n \"2016-04-22\": 0.23,\n \"2016-04-25\": 0.25,\n \"2016-04-26\": 0.24,\n \"2016-04-27\": 0.24,\n \"2016-04-28\": 0.22,\n \"2016-04-29\": 0.22,\n \"2016-05-02\": 0.22,\n \"2016-05-03\": 0.21,\n \"2016-05-04\": 0.19,\n \"2016-05-05\": 0.2,\n \"2016-05-06\": 0.19,\n \"2016-05-09\": 0.24,\n \"2016-05-10\": 0.24,\n \"2016-05-11\": 0.26,\n \"2016-05-12\": 0.27,\n \"2016-05-13\": 0.28,\n \"2016-05-16\": 0.28,\n \"2016-05-17\": 0.28,\n \"2016-05-18\": 0.3,\n \"2016-05-19\": 0.3,\n \"2016-05-20\": 0.32,\n \"2016-05-23\": 0.35,\n \"2016-05-24\": 0.35,\n \"2016-05-25\": 0.33,\n \"2016-05-26\": 0.3,\n \"2016-05-27\": 0.31,\n \"2016-05-31\": 0.34,\n \"2016-06-01\": 0.3,\n \"2016-06-02\": 0.28,\n \"2016-06-03\": 0.29,\n \"2016-06-06\": 0.28,\n \"2016-06-07\": 0.28,\n \"2016-06-08\": 0.24,\n \"2016-06-09\": 0.25,\n \"2016-06-10\": 0.25,\n \"2016-06-13\": 0.27,\n \"2016-06-14\": 0.27,\n \"2016-06-15\": 0.26,\n \"2016-06-16\": 0.27,\n \"2016-06-17\": 0.26,\n \"2016-06-20\": 0.28,\n \"2016-06-21\": 0.27,\n \"2016-06-22\": 0.27,\n \"2016-06-23\": 0.3,\n \"2016-06-24\": 0.26,\n \"2016-06-27\": 0.27,\n \"2016-06-28\": 0.26,\n \"2016-06-29\": 0.26,\n \"2016-06-30\": 0.26,\n \"2016-07-01\": 0.27,\n \"2016-07-05\": 0.28,\n \"2016-07-06\": 0.27,\n \"2016-07-07\": 0.29,\n \"2016-07-08\": 0.27,\n \"2016-07-11\": 0.31,\n \"2016-07-12\": 0.29,\n \"2016-07-13\": 0.31,\n \"2016-07-14\": 0.31,\n \"2016-07-15\": 0.31,\n \"2016-07-18\": 0.32,\n \"2016-07-19\": 0.31,\n \"2016-07-20\": 0.32,\n \"2016-07-21\": 0.31,\n \"2016-07-22\": 0.32,\n \"2016-07-25\": 0.32,\n \"2016-07-26\": 0.31,\n \"2016-07-27\": 0.31,\n \"2016-07-28\": 0.25,\n \"2016-07-29\": 0.27,\n \"2016-08-01\": 0.29,\n \"2016-08-02\": 0.29,\n \"2016-08-03\": 0.28,\n \"2016-08-04\": 0.26,\n \"2016-08-05\": 0.27,\n \"2016-08-08\": 0.31,\n \"2016-08-09\": 0.29,\n \"2016-08-10\": 0.28,\n \"2016-08-11\": 0.28,\n \"2016-08-12\": 0.28,\n \"2016-08-15\": 0.31,\n \"2016-08-16\": 0.27,\n \"2016-08-17\": 0.3,\n \"2016-08-18\": 0.29,\n \"2016-08-19\": 0.29,\n \"2016-08-22\": 0.29,\n \"2016-08-23\": 0.3,\n \"2016-08-24\": 0.31,\n \"2016-08-25\": 0.33,\n \"2016-08-26\": 0.33,\n \"2016-08-29\": 0.33,\n \"2016-08-30\": 0.33,\n \"2016-08-31\": 0.33,\n \"2016-09-01\": 0.33,\n \"2016-09-02\": 0.32,\n \"2016-09-06\": 0.32,\n \"2016-09-07\": 0.34,\n \"2016-09-08\": 0.34,\n \"2016-09-09\": 0.34,\n \"2016-09-12\": 0.37,\n \"2016-09-13\": 0.36,\n \"2016-09-14\": 0.33,\n \"2016-09-15\": 0.29,\n \"2016-09-16\": 0.29,\n \"2016-09-19\": 0.3,\n \"2016-09-20\": 0.3,\n \"2016-09-21\": 0.22,\n \"2016-09-22\": 0.18,\n \"2016-09-23\": 0.18,\n \"2016-09-26\": 0.25,\n \"2016-09-27\": 0.26,\n \"2016-09-28\": 0.27,\n \"2016-09-29\": 0.26,\n \"2016-09-30\": 0.28,\n \"2016-10-03\": 0.32,\n \"2016-10-04\": 0.33,\n \"2016-10-05\": 0.32,\n \"2016-10-06\": 0.32,\n \"2016-10-07\": 0.32,\n \"2016-10-11\": 0.35,\n \"2016-10-12\": 0.36,\n \"2016-10-13\": 0.29,\n \"2016-10-14\": 0.31,\n \"2016-10-17\": 0.34,\n \"2016-10-18\": 0.34,\n \"2016-10-19\": 0.34,\n \"2016-10-20\": 0.34,\n \"2016-10-21\": 0.33,\n \"2016-10-24\": 0.33,\n \"2016-10-25\": 0.34,\n \"2016-10-26\": 0.33,\n \"2016-10-27\": 0.29,\n \"2016-10-28\": 0.29,\n \"2016-10-31\": 0.34,\n \"2016-11-01\": 0.35,\n \"2016-11-02\": 0.36,\n \"2016-11-03\": 0.37,\n \"2016-11-04\": 0.37,\n \"2016-11-07\": 0.41,\n \"2016-11-08\": 0.43,\n \"2016-11-09\": 0.44,\n \"2016-11-10\": 0.47,\n \"2016-11-14\": 0.54,\n \"2016-11-15\": 0.5,\n \"2016-11-16\": 0.46,\n \"2016-11-17\": 0.43,\n \"2016-11-18\": 0.43,\n \"2016-11-21\": 0.46,\n \"2016-11-22\": 0.48,\n \"2016-11-23\": 0.5,\n \"2016-11-25\": 0.48,\n \"2016-11-28\": 0.48,\n \"2016-11-29\": 0.48,\n \"2016-11-30\": 0.48,\n \"2016-12-01\": 0.47,\n \"2016-12-02\": 0.48,\n \"2016-12-05\": 0.49,\n \"2016-12-06\": 0.49,\n \"2016-12-07\": 0.51,\n \"2016-12-08\": 0.5,\n \"2016-12-09\": 0.53,\n \"2016-12-12\": 0.51,\n \"2016-12-13\": 0.54,\n \"2016-12-14\": 0.54,\n \"2016-12-15\": 0.5,\n \"2016-12-16\": 0.5,\n \"2016-12-19\": 0.52,\n \"2016-12-20\": 0.52,\n \"2016-12-21\": 0.51,\n \"2016-12-22\": 0.5,\n \"2016-12-23\": 0.51,\n \"2016-12-27\": 0.51,\n \"2016-12-28\": 0.52,\n \"2016-12-29\": 0.46,\n \"2016-12-30\": 0.5,\n \"2017-01-03\": 0.53,\n \"2017-01-04\": 0.52,\n \"2017-01-05\": 0.51,\n \"2017-01-06\": 0.52,\n \"2017-01-09\": 0.5,\n \"2017-01-10\": 0.51,\n \"2017-01-11\": 0.51,\n \"2017-01-12\": 0.51,\n \"2017-01-13\": 0.52,\n \"2017-01-17\": 0.54,\n \"2017-01-18\": 0.52,\n \"2017-01-19\": 0.51,\n \"2017-01-20\": 0.49,\n \"2017-01-23\": 0.51,\n \"2017-01-24\": 0.5,\n \"2017-01-25\": 0.49,\n \"2017-01-26\": 0.5,\n \"2017-01-27\": 0.51,\n \"2017-01-30\": 0.51,\n \"2017-01-31\": 0.52,\n \"2017-02-01\": 0.5,\n \"2017-02-02\": 0.51,\n \"2017-02-03\": 0.5,\n \"2017-02-06\": 0.53,\n \"2017-02-07\": 0.53,\n \"2017-02-08\": 0.53,\n \"2017-02-09\": 0.53,\n \"2017-02-10\": 0.54,\n \"2017-02-13\": 0.52,\n \"2017-02-14\": 0.54,\n \"2017-02-15\": 0.53,\n \"2017-02-16\": 0.52,\n \"2017-02-17\": 0.52,\n \"2017-02-21\": 0.53,\n \"2017-02-22\": 0.52,\n \"2017-02-23\": 0.51,\n \"2017-02-24\": 0.51,\n \"2017-02-27\": 0.5,\n \"2017-02-28\": 0.53,\n \"2017-03-01\": 0.62,\n \"2017-03-02\": 0.66,\n \"2017-03-03\": 0.7,\n \"2017-03-06\": 0.73,\n \"2017-03-07\": 0.75,\n \"2017-03-08\": 0.72,\n \"2017-03-09\": 0.72,\n \"2017-03-10\": 0.73,\n \"2017-03-13\": 0.78,\n \"2017-03-14\": 0.77,\n \"2017-03-15\": 0.72,\n \"2017-03-16\": 0.72,\n \"2017-03-17\": 0.72,\n \"2017-03-20\": 0.75,\n \"2017-03-21\": 0.76,\n \"2017-03-22\": 0.76,\n \"2017-03-23\": 0.75,\n \"2017-03-24\": 0.77,\n \"2017-03-27\": 0.77,\n \"2017-03-28\": 0.77,\n \"2017-03-29\": 0.77,\n \"2017-03-30\": 0.77,\n \"2017-03-31\": 0.75,\n \"2017-04-03\": 0.78,\n \"2017-04-04\": 0.78,\n \"2017-04-05\": 0.79,\n \"2017-04-06\": 0.78,\n \"2017-04-07\": 0.81,\n \"2017-04-10\": 0.81,\n \"2017-04-11\": 0.81,\n \"2017-04-12\": 0.8,\n \"2017-04-13\": 0.8,\n \"2017-04-17\": 0.82,\n \"2017-04-18\": 0.81,\n \"2017-04-19\": 0.8,\n \"2017-04-20\": 0.78,\n \"2017-04-21\": 0.78,\n \"2017-04-24\": 0.8,\n \"2017-04-25\": 0.81,\n \"2017-04-26\": 0.82,\n \"2017-04-27\": 0.8,\n \"2017-04-28\": 0.79,\n \"2017-05-01\": 0.82,\n \"2017-05-02\": 0.81,\n \"2017-05-03\": 0.84,\n \"2017-05-04\": 0.84,\n \"2017-05-05\": 0.88,\n \"2017-05-08\": 0.9,\n \"2017-05-09\": 0.9,\n \"2017-05-10\": 0.89,\n \"2017-05-11\": 0.87,\n \"2017-05-12\": 0.86,\n \"2017-05-15\": 0.89,\n \"2017-05-16\": 0.89,\n \"2017-05-17\": 0.89,\n \"2017-05-18\": 0.91,\n \"2017-05-19\": 0.9,\n \"2017-05-22\": 0.92,\n \"2017-05-23\": 0.91,\n \"2017-05-24\": 0.92,\n \"2017-05-25\": 0.92,\n \"2017-05-26\": 0.92,\n \"2017-05-30\": 0.92,\n \"2017-05-31\": 0.96,\n \"2017-06-01\": 0.96,\n \"2017-06-02\": 0.96,\n \"2017-06-05\": 0.95,\n \"2017-06-06\": 0.96,\n \"2017-06-07\": 0.98,\n \"2017-06-08\": 0.99,\n \"2017-06-09\": 0.99,\n \"2017-06-12\": 0.97,\n \"2017-06-13\": 0.99,\n \"2017-06-14\": 0.99,\n \"2017-06-15\": 1.0,\n \"2017-06-16\": 1.01,\n \"2017-06-19\": 1.01,\n \"2017-06-20\": 1.0,\n \"2017-06-21\": 0.97,\n \"2017-06-22\": 0.94,\n \"2017-06-23\": 0.95,\n \"2017-06-26\": 0.98,\n \"2017-06-27\": 0.99,\n \"2017-06-28\": 1.0,\n \"2017-06-29\": 1.02,\n \"2017-06-30\": 1.01,\n \"2017-07-03\": 1.04,\n \"2017-07-05\": 1.03,\n \"2017-07-06\": 1.02,\n \"2017-07-07\": 1.03,\n \"2017-07-10\": 1.03,\n \"2017-07-11\": 1.03,\n \"2017-07-12\": 1.03,\n \"2017-07-13\": 1.03,\n \"2017-07-14\": 1.02,\n \"2017-07-17\": 1.05,\n \"2017-07-18\": 1.05,\n \"2017-07-19\": 1.09,\n \"2017-07-20\": 1.13,\n \"2017-07-21\": 1.14,\n \"2017-07-24\": 1.15,\n \"2017-07-25\": 1.16,\n \"2017-07-26\": 1.11,\n \"2017-07-27\": 1.09,\n \"2017-07-28\": 1.06,\n \"2017-07-31\": 1.05,\n \"2017-08-01\": 1.06,\n \"2017-08-02\": 1.06,\n \"2017-08-03\": 1.06,\n \"2017-08-04\": 1.06,\n \"2017-08-07\": 1.01,\n \"2017-08-08\": 1.04,\n \"2017-08-09\": 1.04,\n \"2017-08-10\": 1.03,\n \"2017-08-11\": 1.01,\n \"2017-08-14\": 1.01,\n \"2017-08-15\": 1.02,\n \"2017-08-16\": 1.0,\n \"2017-08-17\": 0.98,\n \"2017-08-18\": 1.0,\n \"2017-08-21\": 0.99,\n \"2017-08-22\": 0.99,\n \"2017-08-23\": 0.98,\n \"2017-08-24\": 1.0,\n \"2017-08-25\": 1.01,\n \"2017-08-28\": 0.97,\n \"2017-08-29\": 1.01,\n \"2017-08-30\": 1.01,\n \"2017-08-31\": 0.99,\n \"2017-09-01\": 1.0,\n \"2017-09-05\": 1.01,\n \"2017-09-06\": 1.05,\n \"2017-09-07\": 1.03,\n \"2017-09-08\": 1.02,\n \"2017-09-11\": 1.04,\n \"2017-09-12\": 1.02,\n \"2017-09-13\": 1.02,\n \"2017-09-14\": 1.03,\n \"2017-09-15\": 1.03,\n \"2017-09-18\": 1.04,\n \"2017-09-19\": 1.03,\n \"2017-09-20\": 1.02,\n \"2017-09-21\": 1.02,\n \"2017-09-22\": 1.01,\n \"2017-09-25\": 1.04,\n \"2017-09-26\": 1.05,\n \"2017-09-27\": 1.05,\n \"2017-09-28\": 1.04,\n \"2017-09-29\": 1.04,\n \"2017-10-02\": 1.0,\n \"2017-10-03\": 1.05,\n \"2017-10-04\": 1.06,\n \"2017-10-05\": 1.05,\n \"2017-10-06\": 1.05,\n \"2017-10-10\": 1.06,\n \"2017-10-11\": 1.08,\n \"2017-10-12\": 1.07,\n \"2017-10-13\": 1.07,\n \"2017-10-16\": 1.09,\n \"2017-10-17\": 1.07,\n \"2017-10-18\": 1.07,\n \"2017-10-19\": 1.08,\n \"2017-10-20\": 1.09,\n \"2017-10-23\": 1.08,\n \"2017-10-24\": 1.1,\n \"2017-10-25\": 1.1,\n \"2017-10-26\": 1.09,\n \"2017-10-27\": 1.08,\n \"2017-10-30\": 1.1,\n \"2017-10-31\": 1.13,\n \"2017-11-01\": 1.16,\n \"2017-11-02\": 1.15,\n \"2017-11-03\": 1.16,\n \"2017-11-06\": 1.17,\n \"2017-11-07\": 1.2,\n \"2017-11-08\": 1.21,\n \"2017-11-09\": 1.22,\n \"2017-11-10\": 1.21,\n \"2017-11-13\": 1.22,\n \"2017-11-14\": 1.24,\n \"2017-11-15\": 1.23,\n \"2017-11-16\": 1.25,\n \"2017-11-17\": 1.26,\n \"2017-11-20\": 1.28,\n \"2017-11-21\": 1.28,\n \"2017-11-22\": 1.27,\n \"2017-11-24\": 1.26,\n \"2017-11-27\": 1.25,\n \"2017-11-28\": 1.28,\n \"2017-11-29\": 1.27,\n \"2017-11-30\": 1.25,\n \"2017-12-01\": 1.25,\n \"2017-12-04\": 1.28,\n \"2017-12-05\": 1.28,\n \"2017-12-06\": 1.28,\n \"2017-12-07\": 1.27,\n \"2017-12-08\": 1.26,\n \"2017-12-11\": 1.31,\n \"2017-12-12\": 1.32,\n \"2017-12-13\": 1.28,\n \"2017-12-14\": 1.3,\n \"2017-12-15\": 1.29,\n \"2017-12-18\": 1.36,\n \"2017-12-19\": 1.35,\n \"2017-12-20\": 1.36,\n \"2017-12-21\": 1.33,\n \"2017-12-22\": 1.31,\n \"2017-12-26\": 1.45,\n \"2017-12-27\": 1.42,\n \"2017-12-28\": 1.37,\n \"2017-12-29\": 1.37,\n \"2018-01-02\": 1.42,\n \"2018-01-03\": 1.39,\n \"2018-01-04\": 1.39,\n \"2018-01-05\": 1.37,\n \"2018-01-08\": 1.43,\n \"2018-01-09\": 1.42,\n \"2018-01-10\": 1.4,\n \"2018-01-11\": 1.41,\n \"2018-01-12\": 1.41,\n \"2018-01-16\": 1.43,\n \"2018-01-17\": 1.42,\n \"2018-01-18\": 1.43,\n \"2018-01-19\": 1.42,\n \"2018-01-22\": 1.43,\n \"2018-01-23\": 1.42,\n \"2018-01-24\": 1.41,\n \"2018-01-25\": 1.4,\n \"2018-01-26\": 1.39,\n \"2018-01-29\": 1.43,\n \"2018-01-30\": 1.42,\n \"2018-01-31\": 1.44,\n \"2018-02-01\": 1.46,\n \"2018-02-02\": 1.46,\n \"2018-02-05\": 1.49,\n \"2018-02-06\": 1.5,\n \"2018-02-07\": 1.53,\n \"2018-02-08\": 1.53,\n \"2018-02-09\": 1.53,\n \"2018-02-12\": 1.61,\n \"2018-02-13\": 1.57,\n \"2018-02-14\": 1.56,\n \"2018-02-15\": 1.56,\n \"2018-02-16\": 1.59,\n \"2018-02-20\": 1.64,\n \"2018-02-21\": 1.62,\n \"2018-02-22\": 1.61,\n \"2018-02-23\": 1.61,\n \"2018-02-26\": 1.65,\n \"2018-02-27\": 1.64,\n \"2018-02-28\": 1.63,\n \"2018-03-01\": 1.6,\n \"2018-03-02\": 1.62,\n \"2018-03-05\": 1.67,\n \"2018-03-06\": 1.65,\n \"2018-03-07\": 1.65,\n \"2018-03-08\": 1.64,\n \"2018-03-09\": 1.64,\n \"2018-03-12\": 1.68,\n \"2018-03-13\": 1.7,\n \"2018-03-14\": 1.73,\n \"2018-03-15\": 1.74,\n \"2018-03-16\": 1.75,\n \"2018-03-19\": 1.77,\n \"2018-03-20\": 1.78,\n \"2018-03-21\": 1.71,\n \"2018-03-22\": 1.69,\n \"2018-03-23\": 1.71,\n \"2018-03-26\": 1.76,\n \"2018-03-27\": 1.74,\n \"2018-03-28\": 1.7,\n \"2018-03-29\": 1.7,\n \"2018-04-02\": 1.74,\n \"2018-04-03\": 1.72,\n \"2018-04-04\": 1.68,\n \"2018-04-05\": 1.69,\n \"2018-04-06\": 1.7,\n \"2018-04-09\": 1.73,\n \"2018-04-10\": 1.71,\n \"2018-04-11\": 1.7,\n \"2018-04-12\": 1.72,\n \"2018-04-13\": 1.73,\n \"2018-04-16\": 1.76,\n \"2018-04-17\": 1.77,\n \"2018-04-18\": 1.78,\n \"2018-04-19\": 1.79,\n \"2018-04-20\": 1.78,\n \"2018-04-23\": 1.84,\n \"2018-04-24\": 1.84,\n \"2018-04-25\": 1.82,\n \"2018-04-26\": 1.79,\n \"2018-04-27\": 1.78,\n \"2018-04-30\": 1.84,\n \"2018-05-01\": 1.82,\n \"2018-05-02\": 1.81,\n \"2018-05-03\": 1.8,\n \"2018-05-04\": 1.8,\n \"2018-05-07\": 1.83,\n \"2018-05-08\": 1.84,\n \"2018-05-09\": 1.85,\n \"2018-05-10\": 1.86,\n \"2018-05-11\": 1.88,\n \"2018-05-14\": 1.9,\n \"2018-05-15\": 1.89,\n \"2018-05-16\": 1.88,\n \"2018-05-17\": 1.88,\n \"2018-05-18\": 1.87,\n \"2018-05-21\": 1.9,\n \"2018-05-22\": 1.9,\n \"2018-05-23\": 1.88,\n \"2018-05-24\": 1.87,\n \"2018-05-25\": 1.86,\n \"2018-05-29\": 1.9,\n \"2018-05-30\": 1.9,\n \"2018-05-31\": 1.89,\n \"2018-06-01\": 1.88,\n \"2018-06-04\": 1.91,\n \"2018-06-05\": 1.91,\n \"2018-06-06\": 1.91,\n \"2018-06-07\": 1.9,\n \"2018-06-08\": 1.89,\n \"2018-06-11\": 1.91,\n \"2018-06-12\": 1.89,\n \"2018-06-13\": 1.9,\n \"2018-06-14\": 1.9,\n \"2018-06-15\": 1.9,\n \"2018-06-18\": 1.91,\n \"2018-06-19\": 1.91,\n \"2018-06-20\": 1.9,\n \"2018-06-21\": 1.9,\n \"2018-06-22\": 1.89,\n \"2018-06-25\": 1.9,\n \"2018-06-26\": 1.9,\n \"2018-06-27\": 1.89,\n \"2018-06-28\": 1.89,\n \"2018-06-29\": 1.89,\n \"2018-07-02\": 1.95,\n \"2018-07-03\": 1.94,\n \"2018-07-05\": 1.92,\n \"2018-07-06\": 1.93,\n \"2018-07-09\": 1.95,\n \"2018-07-10\": 1.95,\n \"2018-07-11\": 1.93,\n \"2018-07-12\": 1.94,\n \"2018-07-13\": 1.94,\n \"2018-07-16\": 1.98,\n \"2018-07-17\": 1.98,\n \"2018-07-18\": 1.96,\n \"2018-07-19\": 1.96,\n \"2018-07-20\": 1.95,\n \"2018-07-23\": 1.96,\n \"2018-07-24\": 1.98,\n \"2018-07-25\": 1.97,\n \"2018-07-26\": 1.95,\n \"2018-07-27\": 1.96,\n \"2018-07-30\": 2.01,\n \"2018-07-31\": 1.99,\n \"2018-08-01\": 1.99,\n \"2018-08-02\": 1.98,\n \"2018-08-03\": 1.97,\n \"2018-08-06\": 2.02,\n \"2018-08-07\": 2.02,\n \"2018-08-08\": 2.02,\n \"2018-08-09\": 2.02,\n \"2018-08-10\": 2.01,\n \"2018-08-13\": 2.03,\n \"2018-08-14\": 2.04,\n \"2018-08-15\": 2.03,\n \"2018-08-16\": 2.03,\n \"2018-08-17\": 2.01,\n \"2018-08-20\": 2.03,\n \"2018-08-21\": 2.04,\n \"2018-08-22\": 2.05,\n \"2018-08-23\": 2.04,\n \"2018-08-24\": 2.05,\n \"2018-08-27\": 2.08,\n \"2018-08-28\": 2.09,\n \"2018-08-29\": 2.09,\n \"2018-08-30\": 2.07,\n \"2018-08-31\": 2.07,\n \"2018-09-04\": 2.09,\n \"2018-09-05\": 2.1,\n \"2018-09-06\": 2.09,\n \"2018-09-07\": 2.1,\n \"2018-09-10\": 2.11,\n \"2018-09-11\": 2.11,\n \"2018-09-12\": 2.12,\n \"2018-09-13\": 2.11,\n \"2018-09-14\": 2.12,\n \"2018-09-17\": 2.13,\n \"2018-09-18\": 2.13,\n \"2018-09-19\": 2.12,\n \"2018-09-20\": 2.13,\n \"2018-09-21\": 2.14,\n \"2018-09-24\": 2.18,\n \"2018-09-25\": 2.17,\n \"2018-09-26\": 2.16,\n \"2018-09-27\": 2.14,\n \"2018-09-28\": 2.15,\n \"2018-10-01\": 2.19,\n \"2018-10-02\": 2.19,\n \"2018-10-03\": 2.19,\n \"2018-10-04\": 2.18,\n \"2018-10-05\": 2.18,\n \"2018-10-09\": 2.21,\n \"2018-10-10\": 2.23,\n \"2018-10-11\": 2.22,\n \"2018-10-12\": 2.23,\n \"2018-10-15\": 2.27,\n \"2018-10-16\": 2.26,\n \"2018-10-17\": 2.27,\n \"2018-10-18\": 2.27,\n \"2018-10-19\": 2.26,\n \"2018-10-22\": 2.3,\n \"2018-10-23\": 2.29,\n \"2018-10-24\": 2.29,\n \"2018-10-25\": 2.29,\n \"2018-10-26\": 2.28,\n \"2018-10-29\": 2.3,\n \"2018-10-30\": 2.29,\n \"2018-10-31\": 2.29,\n \"2018-11-01\": 2.27,\n \"2018-11-02\": 2.28,\n \"2018-11-05\": 2.32,\n \"2018-11-06\": 2.31,\n \"2018-11-07\": 2.32,\n \"2018-11-08\": 2.3,\n \"2018-11-09\": 2.31,\n \"2018-11-13\": 2.34,\n \"2018-11-14\": 2.33,\n \"2018-11-15\": 2.32,\n \"2018-11-16\": 2.31,\n \"2018-11-19\": 2.34,\n \"2018-11-20\": 2.34,\n \"2018-11-21\": 2.36,\n \"2018-11-23\": 2.36,\n \"2018-11-26\": 2.37,\n \"2018-11-27\": 2.36,\n \"2018-11-28\": 2.35,\n \"2018-11-29\": 2.32,\n \"2018-11-30\": 2.32,\n \"2018-12-03\": 2.34,\n \"2018-12-04\": 2.38,\n \"2018-12-06\": 2.36,\n \"2018-12-07\": 2.35,\n \"2018-12-10\": 2.37,\n \"2018-12-11\": 2.37,\n \"2018-12-12\": 2.39,\n \"2018-12-13\": 2.38,\n \"2018-12-14\": 2.37,\n \"2018-12-17\": 2.36,\n \"2018-12-18\": 2.34,\n \"2018-12-19\": 2.35,\n \"2018-12-20\": 2.34,\n \"2018-12-21\": 2.34,\n \"2018-12-24\": 2.41,\n \"2018-12-26\": 2.39,\n \"2018-12-27\": 2.36,\n \"2018-12-28\": 2.35,\n \"2018-12-31\": 2.4,\n \"2019-01-02\": 2.37,\n \"2019-01-03\": 2.36,\n \"2019-01-04\": 2.37,\n \"2019-01-07\": 2.41,\n \"2019-01-08\": 2.41,\n \"2019-01-09\": 2.4,\n \"2019-01-10\": 2.38,\n \"2019-01-11\": 2.38,\n \"2019-01-14\": 2.4,\n \"2019-01-15\": 2.4,\n \"2019-01-16\": 2.38,\n \"2019-01-17\": 2.37,\n \"2019-01-18\": 2.36,\n \"2019-01-22\": 2.38,\n \"2019-01-23\": 2.36,\n \"2019-01-24\": 2.32,\n \"2019-01-25\": 2.34,\n \"2019-01-28\": 2.37,\n \"2019-01-29\": 2.37,\n \"2019-01-30\": 2.37,\n \"2019-01-31\": 2.36,\n \"2019-02-01\": 2.35,\n \"2019-02-04\": 2.37,\n \"2019-02-05\": 2.37,\n \"2019-02-06\": 2.37,\n \"2019-02-07\": 2.37,\n \"2019-02-08\": 2.38,\n \"2019-02-11\": 2.4,\n \"2019-02-12\": 2.38,\n \"2019-02-13\": 2.39,\n \"2019-02-14\": 2.38,\n \"2019-02-15\": 2.38,\n \"2019-02-19\": 2.41,\n \"2019-02-20\": 2.4,\n \"2019-02-21\": 2.4,\n \"2019-02-22\": 2.41,\n \"2019-02-25\": 2.42,\n \"2019-02-26\": 2.4,\n \"2019-02-27\": 2.4,\n \"2019-02-28\": 2.4,\n \"2019-03-01\": 2.39,\n \"2019-03-04\": 2.41,\n \"2019-03-05\": 2.41,\n \"2019-03-06\": 2.41,\n \"2019-03-07\": 2.4,\n \"2019-03-08\": 2.41,\n \"2019-03-11\": 2.41,\n \"2019-03-12\": 2.41,\n \"2019-03-13\": 2.4,\n \"2019-03-14\": 2.4,\n \"2019-03-15\": 2.4,\n \"2019-03-18\": 2.39,\n \"2019-03-19\": 2.41,\n \"2019-03-20\": 2.42,\n \"2019-03-21\": 2.43,\n \"2019-03-22\": 2.41,\n \"2019-03-25\": 2.41,\n \"2019-03-26\": 2.41,\n \"2019-03-27\": 2.39,\n \"2019-03-28\": 2.38,\n \"2019-03-29\": 2.35,\n \"2019-04-01\": 2.38,\n \"2019-04-02\": 2.37,\n \"2019-04-03\": 2.39,\n \"2019-04-04\": 2.39,\n \"2019-04-05\": 2.39,\n \"2019-04-08\": 2.38,\n \"2019-04-09\": 2.37,\n \"2019-04-10\": 2.38,\n \"2019-04-11\": 2.38,\n \"2019-04-12\": 2.39,\n \"2019-04-15\": 2.38,\n \"2019-04-16\": 2.38,\n \"2019-04-17\": 2.39,\n \"2019-04-18\": 2.37,\n \"2019-04-22\": 2.39,\n \"2019-04-23\": 2.4,\n \"2019-04-24\": 2.39,\n \"2019-04-25\": 2.38,\n \"2019-04-26\": 2.37,\n \"2019-04-29\": 2.39,\n \"2019-04-30\": 2.38,\n \"2019-05-01\": 2.38,\n \"2019-05-02\": 2.41,\n \"2019-05-03\": 2.38,\n \"2019-05-06\": 2.39,\n \"2019-05-07\": 2.38,\n \"2019-05-08\": 2.38,\n \"2019-05-09\": 2.38,\n \"2019-05-10\": 2.38,\n \"2019-05-13\": 2.36,\n \"2019-05-14\": 2.36,\n \"2019-05-15\": 2.37,\n \"2019-05-16\": 2.35,\n \"2019-05-17\": 2.34,\n \"2019-05-20\": 2.34,\n \"2019-05-21\": 2.34,\n \"2019-05-22\": 2.33,\n \"2019-05-23\": 2.32,\n \"2019-05-24\": 2.3,\n \"2019-05-28\": 2.32,\n \"2019-05-29\": 2.32,\n \"2019-05-30\": 2.33,\n \"2019-05-31\": 2.3,\n \"2019-06-03\": 2.3,\n \"2019-06-04\": 2.3,\n \"2019-06-05\": 2.3,\n \"2019-06-06\": 2.28,\n \"2019-06-07\": 2.23,\n \"2019-06-10\": 2.24,\n \"2019-06-11\": 2.22,\n \"2019-06-12\": 2.19,\n \"2019-06-13\": 2.14,\n \"2019-06-14\": 2.15,\n \"2019-06-17\": 2.18,\n \"2019-06-18\": 2.17,\n \"2019-06-19\": 2.13,\n \"2019-06-20\": 2.09,\n \"2019-06-21\": 2.07,\n \"2019-06-24\": 2.08,\n \"2019-06-25\": 2.07,\n \"2019-06-26\": 2.1,\n \"2019-06-27\": 2.09,\n \"2019-06-28\": 2.08,\n \"2019-07-01\": 2.16,\n \"2019-07-02\": 2.15,\n \"2019-07-03\": 2.16,\n \"2019-07-05\": 2.18,\n \"2019-07-08\": 2.21,\n \"2019-07-09\": 2.21,\n \"2019-07-10\": 2.15,\n \"2019-07-11\": 2.12,\n \"2019-07-12\": 2.1,\n \"2019-07-15\": 2.11,\n \"2019-07-16\": 2.1,\n \"2019-07-17\": 2.09,\n \"2019-07-18\": 2.01,\n \"2019-07-19\": 2.02,\n \"2019-07-22\": 2.04,\n \"2019-07-23\": 2.02,\n \"2019-07-24\": 2.05,\n \"2019-07-25\": 2.06,\n \"2019-07-26\": 2.08,\n \"2019-07-29\": 2.07,\n \"2019-07-30\": 2.04,\n \"2019-07-31\": 2.04,\n \"2019-08-01\": 2.03,\n \"2019-08-02\": 2.02,\n \"2019-08-05\": 2.0,\n \"2019-08-06\": 2.01,\n \"2019-08-07\": 1.98,\n \"2019-08-08\": 1.98,\n \"2019-08-09\": 1.96,\n \"2019-08-12\": 1.96,\n \"2019-08-13\": 1.96,\n \"2019-08-14\": 1.92,\n \"2019-08-15\": 1.87,\n \"2019-08-16\": 1.83,\n \"2019-08-19\": 1.9,\n \"2019-08-20\": 1.9,\n \"2019-08-21\": 1.93,\n \"2019-08-22\": 1.96,\n \"2019-08-23\": 1.93,\n \"2019-08-26\": 1.96,\n \"2019-08-27\": 1.94,\n \"2019-08-28\": 1.95,\n \"2019-08-29\": 1.95,\n \"2019-08-30\": 1.95,\n \"2019-09-03\": 1.94,\n \"2019-09-04\": 1.93,\n \"2019-09-05\": 1.93,\n \"2019-09-06\": 1.92,\n \"2019-09-09\": 1.92,\n \"2019-09-10\": 1.91,\n \"2019-09-11\": 1.92,\n \"2019-09-12\": 1.91,\n \"2019-09-13\": 1.92,\n \"2019-09-16\": 1.95,\n \"2019-09-17\": 1.95,\n \"2019-09-18\": 1.91,\n \"2019-09-19\": 1.89,\n \"2019-09-20\": 1.87,\n \"2019-09-23\": 1.9,\n \"2019-09-24\": 1.88,\n \"2019-09-25\": 1.85,\n \"2019-09-26\": 1.79,\n \"2019-09-27\": 1.76,\n \"2019-09-30\": 1.84,\n \"2019-10-01\": 1.78,\n \"2019-10-02\": 1.75,\n \"2019-10-03\": 1.67,\n \"2019-10-04\": 1.68,\n \"2019-10-07\": 1.71,\n \"2019-10-08\": 1.68,\n \"2019-10-09\": 1.66,\n \"2019-10-10\": 1.65,\n \"2019-10-11\": 1.65,\n \"2019-10-15\": 1.64,\n \"2019-10-16\": 1.63,\n \"2019-10-17\": 1.63,\n \"2019-10-18\": 1.63,\n \"2019-10-21\": 1.64,\n \"2019-10-22\": 1.62,\n \"2019-10-23\": 1.62,\n \"2019-10-24\": 1.64,\n \"2019-10-25\": 1.63,\n \"2019-10-28\": 1.62,\n \"2019-10-29\": 1.6,\n \"2019-10-30\": 1.59,\n \"2019-10-31\": 1.51,\n \"2019-11-01\": 1.49,\n \"2019-11-04\": 1.5,\n \"2019-11-05\": 1.53,\n \"2019-11-06\": 1.53,\n \"2019-11-07\": 1.53,\n \"2019-11-08\": 1.52,\n \"2019-11-12\": 1.56,\n \"2019-11-13\": 1.54,\n \"2019-11-14\": 1.54,\n \"2019-11-15\": 1.54,\n \"2019-11-18\": 1.54,\n \"2019-11-19\": 1.54,\n \"2019-11-20\": 1.54,\n \"2019-11-21\": 1.55,\n \"2019-11-22\": 1.55,\n \"2019-11-25\": 1.58,\n \"2019-11-26\": 1.57,\n \"2019-11-27\": 1.59,\n \"2019-11-29\": 1.56,\n \"2019-12-02\": 1.57,\n \"2019-12-03\": 1.54,\n \"2019-12-04\": 1.52,\n \"2019-12-05\": 1.51,\n \"2019-12-06\": 1.5,\n \"2019-12-09\": 1.51,\n \"2019-12-10\": 1.53,\n \"2019-12-11\": 1.54,\n \"2019-12-12\": 1.53,\n \"2019-12-13\": 1.54,\n \"2019-12-16\": 1.54,\n \"2019-12-17\": 1.53,\n \"2019-12-18\": 1.53,\n \"2019-12-19\": 1.54,\n \"2019-12-20\": 1.55,\n \"2019-12-23\": 1.56,\n \"2019-12-24\": 1.55,\n \"2019-12-26\": 1.55,\n \"2019-12-27\": 1.54,\n \"2019-12-30\": 1.54,\n \"2019-12-31\": 1.52,\n \"2020-01-02\": 1.51,\n \"2020-01-03\": 1.49,\n \"2020-01-06\": 1.53,\n \"2020-01-07\": 1.51,\n \"2020-01-08\": 1.51,\n \"2020-01-09\": 1.51,\n \"2020-01-10\": 1.51,\n \"2020-01-13\": 1.54,\n \"2020-01-14\": 1.54,\n \"2020-01-15\": 1.54,\n \"2020-01-16\": 1.52,\n \"2020-01-17\": 1.53,\n \"2020-01-21\": 1.53,\n \"2020-01-22\": 1.52,\n \"2020-01-23\": 1.52,\n \"2020-01-24\": 1.51,\n \"2020-01-27\": 1.52,\n \"2020-01-28\": 1.54,\n \"2020-01-29\": 1.53,\n \"2020-01-30\": 1.54,\n \"2020-01-31\": 1.52,\n \"2020-02-03\": 1.54,\n \"2020-02-04\": 1.54,\n \"2020-02-05\": 1.54,\n \"2020-02-06\": 1.54,\n \"2020-02-07\": 1.53,\n \"2020-02-10\": 1.55,\n \"2020-02-11\": 1.54,\n \"2020-02-12\": 1.55,\n \"2020-02-13\": 1.56,\n \"2020-02-14\": 1.55,\n \"2020-02-18\": 1.55,\n \"2020-02-19\": 1.55,\n \"2020-02-20\": 1.55,\n \"2020-02-21\": 1.53,\n \"2020-02-24\": 1.5,\n \"2020-02-25\": 1.5,\n \"2020-02-26\": 1.5,\n \"2020-02-27\": 1.42,\n \"2020-02-28\": 1.25,\n \"2020-03-02\": 1.1,\n \"2020-03-03\": 0.93,\n \"2020-03-04\": 0.71,\n \"2020-03-05\": 0.61,\n \"2020-03-06\": 0.45,\n \"2020-03-09\": 0.32,\n \"2020-03-10\": 0.43,\n \"2020-03-11\": 0.41,\n \"2020-03-12\": 0.33,\n \"2020-03-13\": 0.27,\n \"2020-03-16\": 0.24,\n \"2020-03-17\": 0.19,\n \"2020-03-18\": 0.02,\n \"2020-03-19\": 0.04,\n \"2020-03-20\": 0.05,\n \"2020-03-23\": 0.02,\n \"2020-03-24\": 0.01,\n \"2020-03-25\": -0.04,\n \"2020-03-26\": -0.05,\n \"2020-03-27\": 0.03,\n \"2020-03-30\": 0.12,\n \"2020-03-31\": 0.11,\n \"2020-04-01\": 0.09,\n \"2020-04-02\": 0.09,\n \"2020-04-03\": 0.1,\n \"2020-04-06\": 0.15,\n \"2020-04-07\": 0.14,\n \"2020-04-08\": 0.22,\n \"2020-04-09\": 0.25,\n \"2020-04-13\": 0.26,\n \"2020-04-14\": 0.2,\n \"2020-04-15\": 0.14,\n \"2020-04-16\": 0.14,\n \"2020-04-17\": 0.12,\n \"2020-04-20\": 0.12,\n \"2020-04-21\": 0.11,\n \"2020-04-22\": 0.12,\n \"2020-04-23\": 0.11,\n \"2020-04-24\": 0.12,\n \"2020-04-27\": 0.12,\n \"2020-04-28\": 0.11,\n \"2020-04-29\": 0.1,\n \"2020-04-30\": 0.09,\n \"2020-05-01\": 0.12,\n \"2020-05-04\": 0.13,\n \"2020-05-05\": 0.13,\n \"2020-05-06\": 0.12,\n \"2020-05-07\": 0.11,\n \"2020-05-08\": 0.12,\n \"2020-05-11\": 0.12,\n \"2020-05-12\": 0.13,\n \"2020-05-13\": 0.13,\n \"2020-05-14\": 0.12,\n \"2020-05-15\": 0.12,\n \"2020-05-18\": 0.13,\n \"2020-05-19\": 0.13,\n \"2020-05-20\": 0.12,\n \"2020-05-21\": 0.12,\n \"2020-05-22\": 0.12,\n \"2020-05-26\": 0.14,\n \"2020-05-27\": 0.15,\n \"2020-05-28\": 0.15,\n \"2020-05-29\": 0.14,\n \"2020-06-01\": 0.14,\n \"2020-06-02\": 0.15,\n \"2020-06-03\": 0.16,\n \"2020-06-04\": 0.15,\n \"2020-06-05\": 0.15,\n \"2020-06-08\": 0.17,\n \"2020-06-09\": 0.19,\n \"2020-06-10\": 0.17,\n \"2020-06-11\": 0.17,\n \"2020-06-12\": 0.16,\n \"2020-06-15\": 0.18,\n \"2020-06-16\": 0.17,\n \"2020-06-17\": 0.17,\n \"2020-06-18\": 0.16,\n \"2020-06-19\": 0.15,\n \"2020-06-22\": 0.16,\n \"2020-06-23\": 0.16,\n \"2020-06-24\": 0.15,\n \"2020-06-25\": 0.16,\n \"2020-06-26\": 0.14,\n \"2020-06-29\": 0.14,\n \"2020-06-30\": 0.16,\n \"2020-07-01\": 0.14,\n \"2020-07-02\": 0.14,\n \"2020-07-06\": 0.15,\n \"2020-07-07\": 0.15,\n \"2020-07-08\": 0.15,\n \"2020-07-09\": 0.13,\n \"2020-07-10\": 0.13,\n \"2020-07-13\": 0.14,\n \"2020-07-14\": 0.15,\n \"2020-07-15\": 0.16,\n \"2020-07-16\": 0.11,\n \"2020-07-17\": 0.11,\n \"2020-07-20\": 0.13,\n \"2020-07-21\": 0.13,\n \"2020-07-22\": 0.13,\n \"2020-07-23\": 0.12,\n \"2020-07-24\": 0.11,\n \"2020-07-27\": 0.11,\n \"2020-07-28\": 0.11,\n \"2020-07-29\": 0.11,\n \"2020-07-30\": 0.09,\n \"2020-07-31\": 0.09,\n \"2020-08-03\": 0.1,\n \"2020-08-04\": 0.09,\n \"2020-08-05\": 0.1,\n \"2020-08-06\": 0.1,\n \"2020-08-07\": 0.1,\n \"2020-08-10\": 0.11,\n \"2020-08-11\": 0.11,\n \"2020-08-12\": 0.11,\n \"2020-08-13\": 0.1,\n \"2020-08-14\": 0.1,\n \"2020-08-17\": 0.1,\n \"2020-08-18\": 0.09,\n \"2020-08-19\": 0.11,\n \"2020-08-20\": 0.11,\n \"2020-08-21\": 0.1,\n \"2020-08-24\": 0.12,\n \"2020-08-25\": 0.11,\n \"2020-08-26\": 0.11,\n \"2020-08-27\": 0.11,\n \"2020-08-28\": 0.1,\n \"2020-08-31\": 0.11,\n \"2020-09-01\": 0.12,\n \"2020-09-02\": 0.12,\n \"2020-09-03\": 0.11,\n \"2020-09-04\": 0.11,\n \"2020-09-08\": 0.13,\n \"2020-09-09\": 0.12,\n \"2020-09-10\": 0.12,\n \"2020-09-11\": 0.11,\n \"2020-09-14\": 0.11,\n \"2020-09-15\": 0.11,\n \"2020-09-16\": 0.12,\n \"2020-09-17\": 0.09,\n \"2020-09-18\": 0.1,\n \"2020-09-21\": 0.1,\n \"2020-09-22\": 0.1,\n \"2020-09-23\": 0.11,\n \"2020-09-24\": 0.1,\n \"2020-09-25\": 0.1,\n \"2020-09-28\": 0.11,\n \"2020-09-29\": 0.09,\n \"2020-09-30\": 0.1,\n \"2020-10-01\": 0.09,\n \"2020-10-02\": 0.09,\n \"2020-10-05\": 0.1,\n \"2020-10-06\": 0.1,\n \"2020-10-07\": 0.1,\n \"2020-10-08\": 0.09,\n \"2020-10-09\": 0.1,\n \"2020-10-13\": 0.11,\n \"2020-10-14\": 0.12,\n \"2020-10-15\": 0.11,\n \"2020-10-16\": 0.11,\n \"2020-10-19\": 0.11,\n \"2020-10-20\": 0.1,\n \"2020-10-21\": 0.1,\n \"2020-10-22\": 0.09,\n \"2020-10-23\": 0.1,\n \"2020-10-26\": 0.11,\n \"2020-10-27\": 0.1,\n \"2020-10-28\": 0.1,\n \"2020-10-29\": 0.09,\n \"2020-10-30\": 0.09,\n \"2020-11-02\": 0.09,\n \"2020-11-03\": 0.1,\n \"2020-11-04\": 0.1,\n \"2020-11-05\": 0.1,\n \"2020-11-06\": 0.1,\n \"2020-11-09\": 0.11,\n \"2020-11-10\": 0.1,\n \"2020-11-12\": 0.1,\n \"2020-11-13\": 0.09,\n \"2020-11-16\": 0.09,\n \"2020-11-17\": 0.09,\n \"2020-11-18\": 0.09,\n \"2020-11-19\": 0.07,\n \"2020-11-20\": 0.07,\n \"2020-11-23\": 0.08,\n \"2020-11-24\": 0.09,\n \"2020-11-25\": 0.09,\n \"2020-11-27\": 0.09,\n \"2020-11-30\": 0.08,\n \"2020-12-01\": 0.09,\n \"2020-12-02\": 0.09,\n \"2020-12-03\": 0.08,\n \"2020-12-04\": 0.09,\n \"2020-12-07\": 0.08,\n \"2020-12-08\": 0.09,\n \"2020-12-09\": 0.08,\n \"2020-12-10\": 0.08,\n \"2020-12-11\": 0.08,\n \"2020-12-14\": 0.09,\n \"2020-12-15\": 0.08,\n \"2020-12-16\": 0.09,\n \"2020-12-17\": 0.08,\n \"2020-12-18\": 0.08,\n \"2020-12-21\": 0.09,\n \"2020-12-22\": 0.09,\n \"2020-12-23\": 0.09,\n \"2020-12-24\": 0.09,\n \"2020-12-28\": 0.11,\n \"2020-12-29\": 0.1,\n \"2020-12-30\": 0.08,\n \"2020-12-31\": 0.09,\n \"2021-01-04\": 0.09,\n \"2021-01-05\": 0.09,\n \"2021-01-06\": 0.09,\n \"2021-01-07\": 0.09,\n \"2021-01-08\": 0.08,\n \"2021-01-11\": 0.08,\n \"2021-01-12\": 0.09,\n \"2021-01-13\": 0.09,\n \"2021-01-14\": 0.09,\n \"2021-01-15\": 0.09,\n \"2021-01-19\": 0.09,\n \"2021-01-20\": 0.08,\n \"2021-01-21\": 0.09,\n \"2021-01-22\": 0.08,\n \"2021-01-25\": 0.09,\n \"2021-01-26\": 0.07,\n \"2021-01-27\": 0.08,\n \"2021-01-28\": 0.07,\n \"2021-01-29\": 0.06,\n \"2021-02-01\": 0.07,\n \"2021-02-02\": 0.07,\n \"2021-02-03\": 0.04,\n \"2021-02-04\": 0.04,\n \"2021-02-05\": 0.03,\n \"2021-02-08\": 0.05,\n \"2021-02-09\": 0.04,\n \"2021-02-10\": 0.05,\n \"2021-02-11\": 0.05,\n \"2021-02-12\": 0.04,\n \"2021-02-16\": 0.04,\n \"2021-02-17\": 0.04,\n \"2021-02-18\": 0.03,\n \"2021-02-19\": 0.04,\n \"2021-02-22\": 0.03,\n \"2021-02-23\": 0.04,\n \"2021-02-24\": 0.03,\n \"2021-02-25\": 0.04,\n \"2021-02-26\": 0.04,\n \"2021-03-01\": 0.05,\n \"2021-03-02\": 0.04,\n \"2021-03-03\": 0.05,\n \"2021-03-04\": 0.04,\n \"2021-03-05\": 0.04,\n \"2021-03-08\": 0.05,\n \"2021-03-09\": 0.05,\n \"2021-03-10\": 0.04,\n \"2021-03-11\": 0.04,\n \"2021-03-12\": 0.04,\n \"2021-03-15\": 0.04,\n \"2021-03-16\": 0.02,\n \"2021-03-17\": 0.02,\n \"2021-03-18\": 0.01,\n \"2021-03-19\": 0.01,\n \"2021-03-22\": 0.03,\n \"2021-03-23\": 0.01,\n \"2021-03-24\": 0.02,\n \"2021-03-25\": 0.02,\n \"2021-03-26\": 0.02,\n \"2021-03-29\": 0.03,\n \"2021-03-30\": 0.02,\n \"2021-03-31\": 0.03,\n \"2021-04-01\": 0.02,\n \"2021-04-02\": 0.02,\n \"2021-04-05\": 0.03,\n \"2021-04-06\": 0.02,\n \"2021-04-07\": 0.02,\n \"2021-04-08\": 0.01,\n \"2021-04-09\": 0.02,\n \"2021-04-12\": 0.02,\n \"2021-04-13\": 0.03,\n \"2021-04-14\": 0.02,\n \"2021-04-15\": 0.02,\n \"2021-04-16\": 0.02,\n \"2021-04-19\": 0.02,\n \"2021-04-20\": 0.03,\n \"2021-04-21\": 0.03,\n \"2021-04-22\": 0.03,\n \"2021-04-23\": 0.03,\n \"2021-04-26\": 0.03,\n \"2021-04-27\": 0.01,\n \"2021-04-28\": 0.01,\n \"2021-04-29\": 0.01,\n \"2021-04-30\": 0.01,\n \"2021-05-03\": 0.04,\n \"2021-05-04\": 0.02,\n \"2021-05-05\": 0.02,\n \"2021-05-06\": 0.02,\n \"2021-05-07\": 0.02,\n \"2021-05-10\": 0.02,\n \"2021-05-11\": 0.01,\n \"2021-05-12\": 0.02,\n \"2021-05-13\": 0.02,\n \"2021-05-14\": 0.01,\n \"2021-05-17\": 0.02,\n \"2021-05-18\": 0.02,\n \"2021-05-19\": 0.01,\n \"2021-05-20\": 0.01,\n \"2021-05-21\": 0.01,\n \"2021-05-24\": 0.02,\n \"2021-05-25\": 0.02,\n \"2021-05-26\": 0.02,\n \"2021-05-27\": 0.02,\n \"2021-05-28\": 0.01,\n \"2021-06-01\": 0.02,\n \"2021-06-02\": 0.02,\n \"2021-06-03\": 0.02,\n \"2021-06-04\": 0.02,\n \"2021-06-07\": 0.02,\n \"2021-06-08\": 0.02,\n \"2021-06-09\": 0.03,\n \"2021-06-10\": 0.03,\n \"2021-06-11\": 0.03,\n \"2021-06-14\": 0.03,\n \"2021-06-15\": 0.03,\n \"2021-06-16\": 0.04,\n \"2021-06-17\": 0.04,\n \"2021-06-18\": 0.05,\n \"2021-06-21\": 0.05,\n \"2021-06-22\": 0.04,\n \"2021-06-23\": 0.05,\n \"2021-06-24\": 0.05,\n \"2021-06-25\": 0.06,\n \"2021-06-28\": 0.05,\n \"2021-06-29\": 0.04,\n \"2021-06-30\": 0.05,\n \"2021-07-01\": 0.05,\n \"2021-07-02\": 0.05,\n \"2021-07-06\": 0.05,\n \"2021-07-07\": 0.05,\n \"2021-07-08\": 0.06,\n \"2021-07-09\": 0.06,\n \"2021-07-12\": 0.05,\n \"2021-07-13\": 0.05,\n \"2021-07-14\": 0.06,\n \"2021-07-15\": 0.05,\n \"2021-07-16\": 0.05,\n \"2021-07-19\": 0.05,\n \"2021-07-20\": 0.05,\n \"2021-07-21\": 0.05,\n \"2021-07-22\": 0.05,\n \"2021-07-23\": 0.05,\n \"2021-07-26\": 0.05,\n \"2021-07-27\": 0.05,\n \"2021-07-28\": 0.05,\n \"2021-07-29\": 0.06,\n \"2021-07-30\": 0.06,\n \"2021-08-02\": 0.05,\n \"2021-08-03\": 0.05,\n \"2021-08-04\": 0.05,\n \"2021-08-05\": 0.05,\n \"2021-08-06\": 0.06,\n \"2021-08-09\": 0.06,\n \"2021-08-10\": 0.05,\n \"2021-08-11\": 0.05,\n \"2021-08-12\": 0.06,\n \"2021-08-13\": 0.06,\n \"2021-08-16\": 0.06,\n \"2021-08-17\": 0.07,\n \"2021-08-18\": 0.07,\n \"2021-08-19\": 0.06,\n \"2021-08-20\": 0.05,\n \"2021-08-23\": 0.05,\n \"2021-08-24\": 0.05,\n \"2021-08-25\": 0.06,\n \"2021-08-26\": 0.05,\n \"2021-08-27\": 0.05,\n \"2021-08-30\": 0.05,\n \"2021-08-31\": 0.04,\n \"2021-09-01\": 0.05,\n \"2021-09-02\": 0.05,\n \"2021-09-03\": 0.05,\n \"2021-09-07\": 0.05,\n \"2021-09-08\": 0.05,\n \"2021-09-09\": 0.04,\n \"2021-09-10\": 0.05,\n \"2021-09-13\": 0.06,\n \"2021-09-14\": 0.04,\n \"2021-09-15\": 0.04,\n \"2021-09-16\": 0.04,\n \"2021-09-17\": 0.04,\n \"2021-09-20\": 0.04,\n \"2021-09-21\": 0.03,\n \"2021-09-22\": 0.03,\n \"2021-09-23\": 0.03,\n \"2021-09-24\": 0.03,\n \"2021-09-27\": 0.04,\n \"2021-09-28\": 0.04,\n \"2021-09-29\": 0.04,\n \"2021-09-30\": 0.04,\n \"2021-10-01\": 0.04,\n \"2021-10-04\": 0.04,\n \"2021-10-05\": 0.04,\n \"2021-10-06\": 0.04,\n \"2021-10-07\": 0.05,\n \"2021-10-08\": 0.05,\n \"2021-10-12\": 0.06,\n \"2021-10-13\": 0.05,\n \"2021-10-14\": 0.05,\n \"2021-10-15\": 0.05,\n \"2021-10-18\": 0.06,\n \"2021-10-19\": 0.05,\n \"2021-10-20\": 0.05,\n \"2021-10-21\": 0.06,\n \"2021-10-22\": 0.06,\n \"2021-10-25\": 0.06,\n \"2021-10-26\": 0.06,\n \"2021-10-27\": 0.06,\n \"2021-10-28\": 0.06,\n \"2021-10-29\": 0.05,\n \"2021-11-01\": 0.05,\n \"2021-11-02\": 0.05,\n \"2021-11-03\": 0.05,\n \"2021-11-04\": 0.04,\n \"2021-11-05\": 0.05,\n \"2021-11-08\": 0.06,\n \"2021-11-09\": 0.04,\n \"2021-11-10\": 0.05,\n \"2021-11-12\": 0.05,\n \"2021-11-15\": 0.05,\n \"2021-11-16\": 0.05,\n \"2021-11-17\": 0.05,\n \"2021-11-18\": 0.05,\n \"2021-11-19\": 0.05,\n \"2021-11-22\": 0.05,\n \"2021-11-23\": 0.06,\n \"2021-11-24\": 0.06,\n \"2021-11-26\": 0.06,\n \"2021-11-29\": 0.06,\n \"2021-11-30\": 0.05,\n \"2021-12-01\": 0.06,\n \"2021-12-02\": 0.05,\n \"2021-12-03\": 0.06,\n \"2021-12-06\": 0.06,\n \"2021-12-07\": 0.06,\n \"2021-12-08\": 0.07,\n \"2021-12-09\": 0.06,\n \"2021-12-10\": 0.06,\n \"2021-12-13\": 0.05,\n \"2021-12-14\": 0.05,\n \"2021-12-15\": 0.06,\n \"2021-12-16\": 0.05,\n \"2021-12-17\": 0.05,\n \"2021-12-20\": 0.07,\n \"2021-12-21\": 0.07,\n \"2021-12-22\": 0.08,\n \"2021-12-23\": 0.08,\n \"2021-12-27\": 0.06,\n \"2021-12-28\": 0.06,\n \"2021-12-29\": 0.05,\n \"2021-12-30\": 0.05,\n \"2021-12-31\": 0.06,\n \"2022-01-03\": 0.09,\n \"2022-01-04\": 0.08,\n \"2022-01-05\": 0.09,\n \"2022-01-06\": 0.1,\n \"2022-01-07\": 0.1,\n \"2022-01-10\": 0.13,\n \"2022-01-11\": 0.12,\n \"2022-01-12\": 0.12,\n \"2022-01-13\": 0.12,\n \"2022-01-14\": 0.13,\n \"2022-01-18\": 0.17,\n \"2022-01-19\": 0.17,\n \"2022-01-20\": 0.18,\n \"2022-01-21\": 0.17,\n \"2022-01-24\": 0.2,\n \"2022-01-25\": 0.2,\n \"2022-01-26\": 0.19,\n \"2022-01-27\": 0.2,\n \"2022-01-28\": 0.19,\n \"2022-01-31\": 0.24,\n \"2022-02-01\": 0.2,\n \"2022-02-02\": 0.2,\n \"2022-02-03\": 0.21,\n \"2022-02-04\": 0.23,\n \"2022-02-07\": 0.28,\n \"2022-02-08\": 0.27,\n \"2022-02-09\": 0.27,\n \"2022-02-10\": 0.41,\n \"2022-02-11\": 0.37,\n \"2022-02-14\": 0.45,\n \"2022-02-15\": 0.41,\n \"2022-02-16\": 0.39,\n \"2022-02-17\": 0.37,\n \"2022-02-18\": 0.35,\n \"2022-02-22\": 0.39,\n \"2022-02-23\": 0.36,\n \"2022-02-24\": 0.33,\n \"2022-02-25\": 0.33,\n \"2022-02-28\": 0.37,\n \"2022-03-01\": 0.32,\n \"2022-03-02\": 0.33,\n \"2022-03-03\": 0.37,\n \"2022-03-04\": 0.33,\n \"2022-03-07\": 0.38,\n \"2022-03-08\": 0.36,\n \"2022-03-09\": 0.38,\n \"2022-03-10\": 0.38,\n \"2022-03-11\": 0.39,\n \"2022-03-14\": 0.45,\n \"2022-03-15\": 0.46,\n \"2022-03-16\": 0.43,\n \"2022-03-17\": 0.4,\n \"2022-03-18\": 0.41,\n \"2022-03-21\": 0.55,\n \"2022-03-22\": 0.51,\n \"2022-03-23\": 0.5,\n \"2022-03-24\": 0.5,\n \"2022-03-25\": 0.53,\n \"2022-03-28\": 0.6,\n \"2022-03-29\": 0.56,\n \"2022-03-30\": 0.55,\n \"2022-03-31\": 0.51,\n \"2022-04-01\": 0.52,\n \"2022-04-04\": 0.67,\n \"2022-04-05\": 0.65,\n \"2022-04-06\": 0.67,\n \"2022-04-07\": 0.68,\n \"2022-04-08\": 0.69,\n \"2022-04-11\": 0.78,\n \"2022-04-12\": 0.74,\n \"2022-04-13\": 0.75,\n \"2022-04-14\": 0.78,\n \"2022-04-18\": 0.82,\n \"2022-04-19\": 0.82,\n \"2022-04-20\": 0.82,\n \"2022-04-21\": 0.82,\n \"2022-04-22\": 0.82,\n \"2022-04-25\": 0.93,\n \"2022-04-26\": 0.84,\n \"2022-04-27\": 0.82,\n \"2022-04-28\": 0.81,\n \"2022-04-29\": 0.83,\n \"2022-05-02\": 0.9,\n \"2022-05-03\": 0.9,\n \"2022-05-04\": 0.88,\n \"2022-05-05\": 0.84,\n \"2022-05-06\": 0.84,\n \"2022-05-09\": 0.92,\n \"2022-05-10\": 0.89,\n \"2022-05-11\": 0.9,\n \"2022-05-12\": 0.95,\n \"2022-05-13\": 1.01,\n \"2022-05-16\": 1.07,\n \"2022-05-17\": 1.06,\n \"2022-05-18\": 1.02,\n \"2022-05-19\": 1.04,\n \"2022-05-20\": 1.01,\n \"2022-05-23\": 1.07,\n \"2022-05-24\": 1.05,\n \"2022-05-25\": 1.05,\n \"2022-05-26\": 1.06,\n \"2022-05-27\": 1.06,\n \"2022-05-31\": 1.13,\n \"2022-06-01\": 1.12,\n \"2022-06-02\": 1.13,\n \"2022-06-03\": 1.17,\n \"2022-06-06\": 1.23,\n \"2022-06-07\": 1.24,\n \"2022-06-08\": 1.25,\n \"2022-06-09\": 1.26,\n \"2022-06-10\": 1.34,\n \"2022-06-13\": 1.69,\n \"2022-06-14\": 1.78,\n \"2022-06-15\": 1.69,\n \"2022-06-16\": 1.54,\n \"2022-06-17\": 1.58,\n \"2022-06-21\": 1.66,\n \"2022-06-22\": 1.57,\n \"2022-06-23\": 1.59,\n \"2022-06-24\": 1.66,\n \"2022-06-27\": 1.75,\n \"2022-06-28\": 1.75,\n \"2022-06-29\": 1.73,\n \"2022-06-30\": 1.66,\n \"2022-07-01\": 1.66,\n \"2022-07-05\": 1.86,\n \"2022-07-06\": 1.85,\n \"2022-07-07\": 1.89,\n \"2022-07-08\": 1.91,\n \"2022-07-11\": 2.13,\n \"2022-07-12\": 2.16,\n \"2022-07-13\": 2.33,\n \"2022-07-14\": 2.33,\n \"2022-07-15\": 2.29,\n \"2022-07-18\": 2.44,\n \"2022-07-19\": 2.46,\n \"2022-07-20\": 2.44,\n \"2022-07-21\": 2.4,\n \"2022-07-22\": 2.41,\n \"2022-07-25\": 2.55,\n \"2022-07-26\": 2.48,\n \"2022-07-27\": 2.37,\n \"2022-07-28\": 2.35,\n \"2022-07-29\": 2.34,\n \"2022-08-01\": 2.48,\n \"2022-08-02\": 2.48,\n \"2022-08-03\": 2.44,\n \"2022-08-04\": 2.41,\n \"2022-08-05\": 2.48,\n \"2022-08-08\": 2.57,\n \"2022-08-09\": 2.58,\n \"2022-08-10\": 2.56,\n \"2022-08-11\": 2.52,\n \"2022-08-12\": 2.53,\n \"2022-08-15\": 2.63,\n \"2022-08-16\": 2.61,\n \"2022-08-17\": 2.59,\n \"2022-08-18\": 2.61,\n \"2022-08-19\": 2.64,\n \"2022-08-22\": 2.74,\n \"2022-08-23\": 2.71,\n \"2022-08-24\": 2.73,\n \"2022-08-25\": 2.78,\n \"2022-08-26\": 2.78,\n \"2022-08-29\": 2.89,\n \"2022-08-30\": 2.88,\n \"2022-08-31\": 2.87,\n \"2022-09-01\": 2.88,\n \"2022-09-02\": 2.85,\n \"2022-09-06\": 2.96,\n \"2022-09-07\": 2.98,\n \"2022-09-08\": 2.97,\n \"2022-09-09\": 2.98,\n \"2022-09-12\": 3.09,\n \"2022-09-13\": 3.19,\n \"2022-09-14\": 3.14,\n \"2022-09-15\": 3.12,\n \"2022-09-16\": 3.1,\n \"2022-09-19\": 3.29,\n \"2022-09-20\": 3.26,\n \"2022-09-21\": 3.21,\n \"2022-09-22\": 3.19,\n \"2022-09-23\": 3.12,\n \"2022-09-26\": 3.3,\n \"2022-09-27\": 3.26,\n \"2022-09-28\": 3.29,\n \"2022-09-29\": 3.26,\n \"2022-09-30\": 3.22,\n \"2022-10-03\": 3.34,\n \"2022-10-04\": 3.32,\n \"2022-10-05\": 3.33,\n \"2022-10-06\": 3.32,\n \"2022-10-07\": 3.31,\n \"2022-10-11\": 3.53,\n \"2022-10-12\": 3.56,\n \"2022-10-13\": 3.64,\n \"2022-10-14\": 3.65,\n \"2022-10-17\": 3.82,\n \"2022-10-18\": 3.89,\n \"2022-10-19\": 3.91,\n \"2022-10-20\": 3.91,\n \"2022-10-21\": 3.9,\n \"2022-10-24\": 4.0,\n \"2022-10-25\": 3.97,\n \"2022-10-26\": 3.94,\n \"2022-10-27\": 3.95,\n \"2022-10-28\": 3.99,\n \"2022-10-31\": 4.06,\n \"2022-11-01\": 4.06,\n \"2022-11-02\": 4.04,\n \"2022-11-03\": 4.06,\n \"2022-11-04\": 4.02,\n \"2022-11-07\": 4.12,\n \"2022-11-08\": 4.1,\n \"2022-11-09\": 4.11,\n \"2022-11-10\": 4.09,\n \"2022-11-14\": 4.16,\n \"2022-11-15\": 4.14,\n \"2022-11-16\": 4.14,\n \"2022-11-17\": 4.13,\n \"2022-11-18\": 4.15,\n \"2022-11-21\": 4.23,\n \"2022-11-22\": 4.21,\n \"2022-11-23\": 4.21,\n \"2022-11-25\": 4.22,\n \"2022-11-28\": 4.3,\n \"2022-11-29\": 4.27,\n \"2022-11-30\": 4.27,\n \"2022-12-01\": 4.22,\n \"2022-12-02\": 4.22,\n \"2022-12-05\": 4.27,\n \"2022-12-06\": 4.27,\n \"2022-12-07\": 4.2,\n \"2022-12-08\": 4.17,\n \"2022-12-09\": 4.19,\n \"2022-12-12\": 4.29,\n \"2022-12-13\": 4.26,\n \"2022-12-14\": 4.23,\n \"2022-12-15\": 4.22,\n \"2022-12-16\": 4.2,\n \"2022-12-19\": 4.28,\n \"2022-12-20\": 4.25,\n \"2022-12-21\": 4.22,\n \"2022-12-22\": 4.24,\n \"2022-12-23\": 4.23,\n \"2022-12-27\": 4.35,\n \"2022-12-28\": 4.35,\n \"2022-12-29\": 4.34,\n \"2022-12-30\": 4.3,\n \"2023-01-03\": 4.4,\n \"2023-01-04\": 4.41,\n \"2023-01-05\": 4.51,\n \"2023-01-06\": 4.51,\n \"2023-01-09\": 4.55,\n \"2023-01-10\": 4.57,\n \"2023-01-11\": 4.57,\n \"2023-01-12\": 4.5,\n \"2023-01-13\": 4.51,\n \"2023-01-17\": 4.56,\n \"2023-01-18\": 4.54,\n \"2023-01-19\": 4.55,\n \"2023-01-20\": 4.57,\n \"2023-01-23\": 4.58,\n \"2023-01-24\": 4.57,\n \"2023-01-25\": 4.56,\n \"2023-01-26\": 4.55,\n \"2023-01-27\": 4.57,\n \"2023-01-30\": 4.59,\n \"2023-01-31\": 4.58,\n \"2023-02-01\": 4.54,\n \"2023-02-02\": 4.53,\n \"2023-02-03\": 4.57,\n \"2023-02-06\": 4.59,\n \"2023-02-07\": 4.59,\n \"2023-02-08\": 4.59,\n \"2023-02-09\": 4.64,\n \"2023-02-10\": 4.66,\n \"2023-02-13\": 4.68,\n \"2023-02-14\": 4.67,\n \"2023-02-15\": 4.66,\n \"2023-02-16\": 4.7,\n \"2023-02-17\": 4.7,\n \"2023-02-21\": 4.72,\n \"2023-02-22\": 4.71,\n \"2023-02-23\": 4.71,\n \"2023-02-24\": 4.72,\n \"2023-02-27\": 4.74,\n \"2023-02-28\": 4.72,\n \"2023-03-01\": 4.73,\n \"2023-03-02\": 4.74,\n \"2023-03-03\": 4.74,\n \"2023-03-06\": 4.76,\n \"2023-03-07\": 4.87,\n \"2023-03-08\": 4.89,\n \"2023-03-09\": 4.87,\n \"2023-03-10\": 4.83,\n \"2023-03-13\": 4.7,\n \"2023-03-14\": 4.71,\n \"2023-03-15\": 4.59,\n \"2023-03-16\": 4.57,\n \"2023-03-17\": 4.36,\n \"2023-03-20\": 4.65,\n \"2023-03-21\": 4.62,\n \"2023-03-22\": 4.63,\n \"2023-03-23\": 4.57,\n \"2023-03-24\": 4.57,\n \"2023-03-27\": 4.75,\n \"2023-03-28\": 4.64,\n \"2023-03-29\": 4.64,\n \"2023-03-30\": 4.8,\n \"2023-03-31\": 4.68,\n \"2023-04-03\": 4.77,\n \"2023-04-04\": 4.74,\n \"2023-04-05\": 4.72,\n \"2023-04-06\": 4.77,\n \"2023-04-07\": 4.81,\n \"2023-04-10\": 4.94,\n \"2023-04-11\": 4.89,\n \"2023-04-12\": 4.87,\n \"2023-04-13\": 4.95,\n \"2023-04-14\": 4.98,\n \"2023-04-17\": 5.06,\n \"2023-04-18\": 5.04,\n \"2023-04-19\": 5.01,\n \"2023-04-20\": 4.97,\n \"2023-04-21\": 4.98,\n \"2023-04-24\": 5.04,\n \"2023-04-25\": 4.97,\n \"2023-04-26\": 5.0,\n \"2023-04-27\": 5.03,\n \"2023-04-28\": 4.95,\n \"2023-05-01\": 5.1,\n \"2023-05-02\": 5.08,\n \"2023-05-03\": 5.09,\n \"2023-05-04\": 5.1,\n \"2023-05-05\": 5.1,\n \"2023-05-08\": 5.15,\n \"2023-05-09\": 5.13,\n \"2023-05-10\": 5.08,\n \"2023-05-11\": 5.04,\n \"2023-05-12\": 5.08,\n \"2023-05-15\": 5.06,\n \"2023-05-16\": 5.07,\n \"2023-05-17\": 5.1,\n \"2023-05-18\": 5.14,\n \"2023-05-19\": 5.12,\n \"2023-05-22\": 5.24,\n \"2023-05-23\": 5.18,\n \"2023-05-24\": 5.21,\n \"2023-05-25\": 5.21,\n \"2023-05-26\": 5.16,\n \"2023-05-30\": 5.28,\n \"2023-05-31\": 5.26,\n \"2023-06-01\": 5.24,\n \"2023-06-02\": 5.23,\n \"2023-06-05\": 5.2,\n \"2023-06-06\": 5.18,\n \"2023-06-07\": 5.16,\n \"2023-06-08\": 5.12,\n \"2023-06-09\": 5.11,\n \"2023-06-12\": 5.14,\n \"2023-06-13\": 5.11,\n \"2023-06-14\": 5.1,\n \"2023-06-15\": 5.07,\n \"2023-06-16\": 5.09,\n \"2023-06-20\": 5.14,\n \"2023-06-21\": 5.15,\n \"2023-06-22\": 5.15,\n \"2023-06-23\": 5.15,\n \"2023-06-26\": 5.24,\n \"2023-06-27\": 5.19,\n \"2023-06-28\": 5.18,\n \"2023-06-29\": 5.2,\n \"2023-06-30\": 5.17,\n \"2023-07-03\": 5.21,\n \"2023-07-05\": 5.21,\n \"2023-07-06\": 5.23,\n \"2023-07-07\": 5.22,\n \"2023-07-10\": 5.25,\n \"2023-07-11\": 5.25,\n \"2023-07-12\": 5.24,\n \"2023-07-13\": 5.24,\n \"2023-07-14\": 5.25,\n \"2023-07-17\": 5.26,\n \"2023-07-18\": 5.25,\n \"2023-07-19\": 5.26,\n \"2023-07-20\": 5.26,\n \"2023-07-21\": 5.27,\n \"2023-07-24\": 5.28,\n \"2023-07-25\": 5.28,\n \"2023-07-26\": 5.28,\n \"2023-07-27\": 5.28,\n \"2023-07-28\": 5.28,\n \"2023-07-31\": 5.28,\n \"2023-08-01\": 5.27,\n \"2023-08-02\": 5.27,\n \"2023-08-03\": 5.27,\n \"2023-08-04\": 5.28,\n \"2023-08-07\": 5.29,\n \"2023-08-08\": 5.3,\n \"2023-08-09\": 5.28,\n \"2023-08-10\": 5.28,\n \"2023-08-11\": 5.28,\n \"2023-08-14\": 5.29,\n \"2023-08-15\": 5.29,\n \"2023-08-16\": 5.29,\n \"2023-08-17\": 5.29,\n \"2023-08-18\": 5.28,\n \"2023-08-21\": 5.3,\n \"2023-08-22\": 5.3,\n \"2023-08-23\": 5.3,\n \"2023-08-24\": 5.31,\n \"2023-08-25\": 5.34,\n \"2023-08-28\": 5.34,\n \"2023-08-29\": 5.33,\n \"2023-08-30\": 5.32,\n \"2023-08-31\": 5.32,\n \"2023-09-01\": 5.3,\n \"2023-09-05\": 5.32,\n \"2023-09-06\": 5.31,\n \"2023-09-07\": 5.3,\n \"2023-09-08\": 5.31,\n \"2023-09-11\": 5.32,\n \"2023-09-12\": 5.32,\n \"2023-09-13\": 5.31,\n \"2023-09-14\": 5.31,\n \"2023-09-15\": 5.32,\n \"2023-09-18\": 5.31,\n \"2023-09-19\": 5.31,\n \"2023-09-20\": 5.33,\n \"2023-09-21\": 5.33,\n \"2023-09-22\": 5.32,\n \"2023-09-25\": 5.35,\n \"2023-09-26\": 5.34,\n \"2023-09-27\": 5.34,\n \"2023-09-28\": 5.32,\n \"2023-09-29\": 5.32,\n \"2023-10-02\": 5.35,\n \"2023-10-03\": 5.35,\n \"2023-10-04\": 5.34,\n \"2023-10-05\": 5.34,\n \"2023-10-06\": 5.36,\n \"2023-10-10\": 5.34,\n \"2023-10-11\": 5.34,\n \"2023-10-12\": 5.35,\n \"2023-10-13\": 5.35,\n \"2023-10-16\": 5.34,\n \"2023-10-17\": 5.35,\n \"2023-10-18\": 5.34,\n \"2023-10-19\": 5.33,\n \"2023-10-20\": 5.31,\n \"2023-10-23\": 5.32,\n \"2023-10-24\": 5.31,\n \"2023-10-25\": 5.32,\n \"2023-10-26\": 5.32,\n \"2023-10-27\": 5.32,\n \"2023-10-30\": 5.33,\n \"2023-10-31\": 5.33,\n \"2023-11-01\": 5.31,\n \"2023-11-02\": 5.28,\n \"2023-11-03\": 5.27,\n \"2023-11-06\": 5.29,\n \"2023-11-07\": 5.28,\n \"2023-11-08\": 5.28,\n \"2023-11-09\": 5.27,\n \"2023-11-10\": 5.26,\n \"2023-11-13\": 5.28,\n \"2023-11-14\": 5.26,\n \"2023-11-15\": 5.26,\n \"2023-11-16\": 5.25,\n \"2023-11-17\": 5.25,\n \"2023-11-20\": 5.27,\n \"2023-11-21\": 5.26,\n \"2023-11-22\": 5.27,\n \"2023-11-24\": 5.28,\n \"2023-11-27\": 5.28,\n \"2023-11-28\": 5.27,\n \"2023-11-29\": 5.25,\n \"2023-11-30\": 5.25,\n \"2023-12-01\": 5.23,\n \"2023-12-04\": 5.26,\n \"2023-12-05\": 5.25,\n \"2023-12-06\": 5.25,\n \"2023-12-07\": 5.24,\n \"2023-12-08\": 5.24,\n \"2023-12-11\": 5.26,\n \"2023-12-12\": 5.26,\n \"2023-12-13\": 5.24,\n \"2023-12-14\": 5.23,\n \"2023-12-15\": 5.24,\n \"2023-12-18\": 5.26,\n \"2023-12-19\": 5.23,\n \"2023-12-20\": 5.24,\n \"2023-12-21\": 5.22,\n \"2023-12-22\": 5.24,\n \"2023-12-26\": 5.25,\n \"2023-12-27\": 5.24,\n \"2023-12-28\": 5.25,\n \"2023-12-29\": 5.2,\n \"2024-01-02\": 5.22,\n \"2024-01-03\": 5.24,\n \"2024-01-04\": 5.24,\n \"2024-01-05\": 5.24,\n \"2024-01-08\": 5.25,\n \"2024-01-09\": 5.24,\n \"2024-01-10\": 5.23,\n \"2024-01-11\": 5.23,\n \"2024-01-12\": 5.22,\n \"2024-01-16\": 5.22,\n \"2024-01-17\": 5.24,\n \"2024-01-18\": 5.22,\n \"2024-01-19\": 5.22,\n \"2024-01-22\": 5.22,\n \"2024-01-23\": 5.21,\n \"2024-01-24\": 5.21,\n \"2024-01-25\": 5.21,\n \"2024-01-26\": 5.21,\n \"2024-01-29\": 5.22,\n \"2024-01-30\": 5.21,\n \"2024-01-31\": 5.22,\n \"2024-02-01\": 5.22,\n \"2024-02-02\": 5.23,\n \"2024-02-05\": 5.22,\n \"2024-02-06\": 5.23,\n \"2024-02-07\": 5.23,\n \"2024-02-08\": 5.23,\n \"2024-02-09\": 5.24,\n \"2024-02-12\": 5.23,\n \"2024-02-13\": 5.25,\n \"2024-02-14\": 5.23,\n \"2024-02-15\": 5.23,\n \"2024-02-16\": 5.24,\n \"2024-02-20\": 5.24,\n \"2024-02-21\": 5.24,\n \"2024-02-22\": 5.25,\n \"2024-02-23\": 5.26,\n \"2024-02-26\": 5.26,\n \"2024-02-27\": 5.25,\n \"2024-02-28\": 5.24,\n \"2024-02-29\": 5.25,\n \"2024-03-01\": 5.23,\n \"2024-03-04\": 5.24,\n \"2024-03-05\": 5.23,\n \"2024-03-06\": 5.24,\n \"2024-03-07\": 5.24,\n \"2024-03-08\": 5.24,\n \"2024-03-11\": 5.24,\n \"2024-03-12\": 5.25,\n \"2024-03-13\": 5.25,\n \"2024-03-14\": 5.25,\n \"2024-03-15\": 5.25,\n \"2024-03-18\": 5.25,\n \"2024-03-19\": 5.24,\n \"2024-03-20\": 5.24,\n \"2024-03-21\": 5.25,\n \"2024-03-22\": 5.24,\n \"2024-03-25\": 5.23,\n \"2024-03-26\": 5.22,\n \"2024-03-27\": 5.22,\n \"2024-03-28\": 5.23,\n \"2024-04-01\": 5.23,\n \"2024-04-02\": 5.22,\n \"2024-04-03\": 5.22,\n \"2024-04-04\": 5.21,\n \"2024-04-05\": 5.23,\n \"2024-04-08\": 5.23,\n \"2024-04-09\": 5.23,\n \"2024-04-10\": 5.25,\n \"2024-04-11\": 5.25,\n \"2024-04-12\": 5.25,\n \"2024-04-15\": 5.25,\n \"2024-04-16\": 5.25,\n \"2024-04-17\": 5.25,\n \"2024-04-18\": 5.25,\n \"2024-04-19\": 5.25,\n \"2024-04-22\": 5.22,\n \"2024-04-23\": 5.25,\n \"2024-04-24\": 5.26,\n \"2024-04-25\": 5.26,\n \"2024-04-26\": 5.25,\n \"2024-04-29\": 5.25,\n \"2024-04-30\": 5.25,\n \"2024-05-01\": 5.26,\n \"2024-05-02\": 5.25,\n \"2024-05-03\": 5.25,\n \"2024-05-06\": 5.25,\n \"2024-05-07\": 5.25,\n \"2024-05-08\": 5.25,\n \"2024-05-09\": 5.25,\n \"2024-05-10\": 5.26,\n \"2024-05-13\": 5.25,\n \"2024-05-14\": 5.24,\n \"2024-05-15\": 5.25,\n \"2024-05-16\": 5.25,\n \"2024-05-17\": 5.25,\n \"2024-05-20\": 5.25,\n \"2024-05-21\": 5.25,\n \"2024-05-22\": 5.25,\n \"2024-05-23\": 5.26,\n \"2024-05-24\": 5.26,\n \"2024-05-28\": 5.26,\n \"2024-05-29\": 5.26,\n \"2024-05-30\": 5.26,\n \"2024-05-31\": 5.25,\n \"2024-06-03\": 5.26,\n \"2024-06-04\": 5.25,\n \"2024-06-05\": 5.25,\n \"2024-06-06\": 5.25,\n \"2024-06-07\": 5.26,\n \"2024-06-10\": 5.25,\n \"2024-06-11\": 5.25,\n \"2024-06-12\": 5.25,\n \"2024-06-13\": 5.25,\n \"2024-06-14\": 5.25,\n \"2024-06-17\": 5.25,\n \"2024-06-18\": 5.24,\n \"2024-06-20\": 5.24,\n \"2024-06-21\": 5.23,\n \"2024-06-24\": 5.24,\n \"2024-06-25\": 5.23,\n \"2024-06-26\": 5.24,\n \"2024-06-27\": 5.23,\n \"2024-06-28\": 5.22,\n \"2024-07-01\": 5.24,\n \"2024-07-02\": 5.24,\n \"2024-07-03\": 5.24,\n \"2024-07-05\": 5.23,\n \"2024-07-08\": 5.23,\n \"2024-07-09\": 5.23,\n \"2024-07-10\": 5.23,\n \"2024-07-11\": 5.21,\n \"2024-07-12\": 5.21,\n \"2024-07-15\": 5.2,\n \"2024-07-16\": 5.2,\n \"2024-07-17\": 5.2,\n \"2024-07-18\": 5.21,\n \"2024-07-19\": 5.2,\n \"2024-07-22\": 5.19,\n \"2024-07-23\": 5.18,\n \"2024-07-24\": 5.18,\n \"2024-07-25\": 5.17,\n \"2024-07-26\": 5.16,\n \"2024-07-29\": 5.15,\n \"2024-07-30\": 5.14,\n \"2024-07-31\": 5.15,\n \"2024-08-01\": 5.12,\n \"2024-08-02\": 5.05,\n \"2024-08-05\": 5.09,\n \"2024-08-06\": 5.09,\n \"2024-08-07\": 5.09,\n \"2024-08-08\": 5.09,\n \"2024-08-09\": 5.09,\n \"2024-08-12\": 5.07,\n \"2024-08-13\": 5.06,\n \"2024-08-14\": 5.07,\n \"2024-08-15\": 5.09,\n \"2024-08-16\": 5.08,\n \"2024-08-19\": 5.06,\n \"2024-08-20\": 5.04,\n \"2024-08-21\": 5.02,\n \"2024-08-22\": 5.04,\n \"2024-08-23\": 5.01,\n \"2024-08-26\": 4.98,\n \"2024-08-27\": 4.98,\n \"2024-08-28\": 4.96,\n \"2024-08-29\": 4.98,\n \"2024-08-30\": 4.98,\n \"2024-09-03\": 4.97,\n \"2024-09-04\": 4.96,\n \"2024-09-05\": 4.94,\n \"2024-09-06\": 4.93,\n \"2024-09-09\": 4.89,\n \"2024-09-10\": 4.85,\n \"2024-09-11\": 4.89,\n \"2024-09-12\": 4.85,\n \"2024-09-13\": 4.78,\n \"2024-09-16\": 4.75,\n \"2024-09-17\": 4.75,\n \"2024-09-18\": 4.65,\n \"2024-09-19\": 4.61,\n \"2024-09-20\": 4.56,\n \"2024-09-23\": 4.53,\n \"2024-09-24\": 4.5,\n \"2024-09-25\": 4.51,\n \"2024-09-26\": 4.5,\n \"2024-09-27\": 4.5,\n \"2024-09-30\": 4.52,\n \"2024-10-01\": 4.5,\n \"2024-10-02\": 4.48,\n \"2024-10-03\": 4.48,\n \"2024-10-04\": 4.53,\n \"2024-10-07\": 4.55,\n \"2024-10-08\": 4.53,\n \"2024-10-09\": 4.54,\n \"2024-10-10\": 4.54,\n \"2024-10-11\": 4.53,\n \"2024-10-15\": 4.52,\n \"2024-10-16\": 4.51,\n \"2024-10-17\": 4.54,\n \"2024-10-18\": 4.53,\n \"2024-10-21\": 4.51,\n \"2024-10-22\": 4.51,\n \"2024-10-23\": 4.52,\n \"2024-10-24\": 4.5,\n \"2024-10-25\": 4.52,\n \"2024-10-28\": 4.49,\n \"2024-10-29\": 4.49,\n \"2024-10-30\": 4.47,\n \"2024-10-31\": 4.44,\n \"2024-11-01\": 4.41,\n \"2024-11-04\": 4.44,\n \"2024-11-05\": 4.43,\n \"2024-11-06\": 4.44,\n \"2024-11-07\": 4.43,\n \"2024-11-08\": 4.43,\n \"2024-11-12\": 4.43,\n \"2024-11-13\": 4.4,\n \"2024-11-14\": 4.41,\n \"2024-11-15\": 4.41,\n \"2024-11-18\": 4.42,\n \"2024-11-19\": 4.41,\n \"2024-11-20\": 4.42,\n \"2024-11-21\": 4.43,\n \"2024-11-22\": 4.43,\n \"2024-11-25\": 4.42,\n \"2024-11-26\": 4.4,\n \"2024-11-27\": 4.4,\n \"2024-11-29\": 4.39,\n \"2024-12-02\": 4.38,\n \"2024-12-03\": 4.36,\n \"2024-12-04\": 4.35,\n \"2024-12-05\": 4.34,\n \"2024-12-06\": 4.31,\n \"2024-12-09\": 4.3,\n \"2024-12-10\": 4.29,\n \"2024-12-11\": 4.26,\n \"2024-12-12\": 4.23,\n \"2024-12-13\": 4.23,\n \"2024-12-16\": 4.25,\n \"2024-12-17\": 4.26,\n \"2024-12-18\": 4.25,\n \"2024-12-19\": 4.23,\n \"2024-12-20\": 4.23,\n \"2024-12-23\": 4.24,\n \"2024-12-24\": 4.28,\n \"2024-12-26\": 4.24,\n \"2024-12-27\": 4.19,\n \"2024-12-30\": 4.23,\n \"2024-12-31\": 4.23,\n \"2025-01-02\": 4.22,\n \"2025-01-03\": 4.2,\n \"2025-01-06\": 4.21,\n \"2025-01-07\": 4.21,\n \"2025-01-08\": 4.21,\n \"2025-01-09\": 4.21,\n \"2025-01-10\": 4.22,\n \"2025-01-13\": 4.23,\n \"2025-01-14\": 4.22,\n \"2025-01-15\": 4.21,\n \"2025-01-16\": 4.21,\n \"2025-01-17\": 4.2,\n \"2025-01-21\": 4.22,\n \"2025-01-22\": 4.22,\n \"2025-01-23\": 4.22,\n \"2025-01-24\": 4.21,\n \"2025-01-27\": 4.2,\n \"2025-01-28\": 4.2,\n \"2025-01-29\": 4.2,\n \"2025-01-30\": 4.19,\n \"2025-01-31\": 4.2,\n \"2025-02-03\": 4.22,\n \"2025-02-04\": 4.22,\n \"2025-02-05\": 4.22,\n \"2025-02-06\": 4.22,\n \"2025-02-07\": 4.24,\n \"2025-02-10\": 4.23,\n \"2025-02-11\": 4.23,\n \"2025-02-12\": 4.23,\n \"2025-02-13\": 4.22,\n \"2025-02-14\": 4.22,\n \"2025-02-18\": 4.23,\n \"2025-02-19\": 4.22,\n \"2025-02-20\": 4.21,\n \"2025-02-21\": 4.21,\n \"2025-02-24\": 4.19,\n \"2025-02-25\": 4.19,\n \"2025-02-26\": 4.2,\n \"2025-02-27\": 4.2,\n \"2025-02-28\": 4.2,\n \"2025-03-03\": 4.21,\n \"2025-03-04\": 4.2,\n \"2025-03-05\": 4.21,\n \"2025-03-06\": 4.2,\n \"2025-03-07\": 4.2,\n \"2025-03-10\": 4.19,\n \"2025-03-11\": 4.2,\n \"2025-03-12\": 4.21,\n \"2025-03-13\": 4.2,\n \"2025-03-14\": 4.2,\n \"2025-03-17\": 4.2,\n \"2025-03-18\": 4.2,\n \"2025-03-19\": 4.2,\n \"2025-03-20\": 4.19,\n \"2025-03-21\": 4.19,\n \"2025-03-24\": 4.19,\n \"2025-03-25\": 4.19,\n \"2025-03-26\": 4.2,\n \"2025-03-27\": 4.2,\n \"2025-03-28\": 4.2,\n \"2025-03-31\": 4.21,\n \"2025-04-01\": 4.2,\n \"2025-04-02\": 4.21,\n \"2025-04-03\": 4.2,\n \"2025-04-04\": 4.17,\n \"2025-04-07\": 4.17,\n \"2025-04-08\": 4.19,\n \"2025-04-09\": 4.24,\n \"2025-04-10\": 4.22,\n \"2025-04-11\": 4.23,\n \"2025-04-14\": 4.22,\n \"2025-04-15\": 4.22,\n \"2025-04-16\": 4.21,\n \"2025-04-17\": 4.23,\n \"2025-04-21\": 4.22,\n \"2025-04-22\": 4.22,\n \"2025-04-23\": 4.22,\n \"2025-04-24\": 4.21,\n \"2025-04-25\": 4.21,\n \"2025-04-28\": 4.2,\n \"2025-04-29\": 4.2,\n \"2025-04-30\": 4.2,\n \"2025-05-01\": 4.2,\n \"2025-05-02\": 4.22,\n \"2025-05-05\": 4.22,\n \"2025-05-06\": 4.22,\n \"2025-05-07\": 4.22,\n \"2025-05-08\": 4.23,\n \"2025-05-09\": 4.22,\n \"2025-05-12\": 4.31,\n \"2025-05-13\": 4.29,\n \"2025-05-14\": 4.29,\n \"2025-05-15\": 4.27,\n \"2025-05-16\": 4.25,\n \"2025-05-19\": 4.28,\n \"2025-05-20\": 4.26,\n \"2025-05-21\": 4.24,\n \"2025-05-22\": 4.25,\n \"2025-05-23\": 4.24,\n \"2025-05-27\": 4.24,\n \"2025-05-28\": 4.24,\n \"2025-05-29\": 4.25,\n \"2025-05-30\": 4.25,\n \"2025-06-02\": 4.25,\n \"2025-06-03\": 4.24,\n \"2025-06-04\": 4.25,\n \"2025-06-05\": 4.25,\n \"2025-06-06\": 4.25,\n \"2025-06-09\": 4.25,\n \"2025-06-10\": 4.26,\n \"2025-06-11\": 4.26,\n \"2025-06-12\": 4.27,\n \"2025-06-13\": 4.26,\n \"2025-06-16\": 4.24,\n \"2025-06-17\": 4.23,\n \"2025-06-18\": 4.23,\n \"2025-06-20\": 4.21,\n \"2025-06-23\": 4.19,\n \"2025-06-24\": 4.19,\n \"2025-06-25\": 4.19,\n \"2025-06-26\": 4.21,\n \"2025-06-27\": 4.2,\n \"2025-06-30\": 4.24,\n \"2025-07-01\": 4.24,\n \"2025-07-02\": 4.24,\n \"2025-07-03\": 4.26,\n \"2025-07-07\": 4.26,\n \"2025-07-08\": 4.26,\n \"2025-07-09\": 4.26,\n \"2025-07-10\": 4.25,\n \"2025-07-11\": 4.25,\n \"2025-07-14\": 4.26,\n \"2025-07-15\": 4.25,\n \"2025-07-16\": 4.24,\n \"2025-07-17\": 4.24,\n \"2025-07-18\": 4.24,\n \"2025-07-21\": 4.24,\n \"2025-07-22\": 4.24,\n \"2025-07-23\": 4.25,\n \"2025-07-24\": 4.25,\n \"2025-07-25\": 4.25,\n \"2025-07-28\": 4.24,\n \"2025-07-29\": 4.24,\n \"2025-07-30\": 4.25,\n \"2025-07-31\": 4.24,\n \"2025-08-01\": 4.19,\n \"2025-08-04\": 4.16,\n \"2025-08-05\": 4.16,\n \"2025-08-06\": 4.14,\n \"2025-08-07\": 4.14,\n \"2025-08-08\": 4.14,\n \"2025-08-11\": 4.15,\n \"2025-08-12\": 4.14,\n \"2025-08-13\": 4.11,\n \"2025-08-14\": 4.12,\n \"2025-08-15\": 4.12,\n \"2025-08-18\": 4.14,\n \"2025-08-19\": 4.12,\n \"2025-08-20\": 4.12,\n \"2025-08-21\": 4.14,\n \"2025-08-22\": 4.1,\n \"2025-08-25\": 4.1,\n \"2025-08-26\": 4.1,\n \"2025-08-27\": 4.08,\n \"2025-08-28\": 4.08,\n \"2025-08-29\": 4.05,\n \"2025-09-02\": 4.05,\n \"2025-09-03\": 4.03,\n \"2025-09-04\": 4.01,\n \"2025-09-05\": 3.92,\n \"2025-09-08\": 3.95,\n \"2025-09-09\": 3.95,\n \"2025-09-10\": 3.94,\n \"2025-09-11\": 3.94,\n \"2025-09-12\": 3.94,\n \"2025-09-15\": 3.91,\n \"2025-09-16\": 3.9,\n \"2025-09-17\": 3.88,\n \"2025-09-18\": 3.89,\n \"2025-09-19\": 3.89,\n \"2025-09-22\": 3.86,\n \"2025-09-23\": 3.86,\n \"2025-09-24\": 3.87,\n \"2025-09-25\": 3.89,\n \"2025-09-26\": 3.87,\n \"2025-09-29\": 3.86,\n \"2025-09-30\": 3.86,\n \"2025-10-01\": 3.85,\n \"2025-10-02\": 3.86,\n \"2025-10-03\": 3.87,\n \"2025-10-06\": 3.86,\n \"2025-10-07\": 3.85,\n \"2025-10-08\": 3.85,\n \"2025-10-09\": 3.87,\n \"2025-10-10\": 3.86,\n \"2025-10-14\": 3.85,\n \"2025-10-15\": 3.87,\n \"2025-10-16\": 3.86,\n \"2025-10-17\": 3.84,\n \"2025-10-20\": 3.81,\n \"2025-10-21\": 3.8,\n \"2025-10-22\": 3.8,\n \"2025-10-23\": 3.8,\n \"2025-10-24\": 3.77,\n \"2025-10-27\": 3.73,\n \"2025-10-28\": 3.73,\n \"2025-10-29\": 3.77,\n \"2025-10-30\": 3.76,\n \"2025-10-31\": 3.73,\n \"2025-11-03\": 3.82,\n \"2025-11-04\": 3.8,\n \"2025-11-05\": 3.8,\n \"2025-11-06\": 3.77,\n \"2025-11-07\": 3.77,\n \"2025-11-10\": 3.79,\n \"2025-11-12\": 3.79,\n \"2025-11-13\": 3.8,\n \"2025-11-14\": 3.8,\n \"2025-11-17\": 3.8,\n \"2025-11-18\": 3.78,\n \"2025-11-19\": 3.79,\n \"2025-11-20\": 3.78,\n \"2025-11-21\": 3.75,\n \"2025-11-24\": 3.75,\n \"2025-11-25\": 3.74,\n \"2025-11-26\": 3.76,\n \"2025-11-28\": 3.73,\n \"2025-12-01\": 3.71,\n \"2025-12-02\": 3.68,\n \"2025-12-03\": 3.64,\n \"2025-12-04\": 3.63,\n \"2025-12-05\": 3.62,\n \"2025-12-08\": 3.64,\n \"2025-12-09\": 3.64,\n \"2025-12-10\": 3.6,\n \"2025-12-11\": 3.58,\n \"2025-12-12\": 3.54,\n \"2025-12-15\": 3.56,\n \"2025-12-16\": 3.56,\n \"2025-12-17\": 3.55,\n \"2025-12-18\": 3.53,\n \"2025-12-19\": 3.54,\n \"2025-12-22\": 3.56,\n \"2025-12-23\": 3.56,\n \"2025-12-24\": 3.6,\n \"2025-12-26\": 3.56,\n \"2025-12-29\": 3.57,\n \"2025-12-30\": 3.55,\n \"2025-12-31\": 3.57,\n // 2026\n \"2026-01-02\": 3.54,\n \"2026-01-05\": 3.54,\n \"2026-01-06\": 3.53,\n \"2026-01-07\": 3.52,\n \"2026-01-08\": 3.52,\n \"2026-01-09\": 3.52,\n \"2026-01-12\": 3.56,\n \"2026-01-13\": 3.57,\n \"2026-01-14\": 3.57,\n \"2026-01-15\": 3.57,\n \"2026-01-16\": 3.57,\n \"2026-01-20\": 3.59,\n \"2026-01-21\": 3.59,\n \"2026-01-22\": 3.6,\n \"2026-01-23\": 3.59,\n \"2026-01-26\": 3.59,\n \"2026-01-27\": 3.58,\n \"2026-01-28\": 3.59,\n \"2026-01-29\": 3.59,\n \"2026-01-30\": 3.58,\n \"2026-02-02\": 3.6,\n \"2026-02-03\": 3.6,\n \"2026-02-04\": 3.6,\n \"2026-02-05\": 3.59,\n \"2026-02-06\": 3.6,\n \"2026-02-09\": 3.6,\n \"2026-02-10\": 3.6,\n \"2026-02-11\": 3.61,\n \"2026-02-12\": 3.61,\n \"2026-02-13\": 3.6,\n \"2026-02-17\": 3.61,\n \"2026-02-18\": 3.61,\n \"2026-02-19\": 3.61,\n \"2026-02-20\": 3.6,\n \"2026-02-23\": 3.6,\n \"2026-02-24\": 3.6,\n \"2026-02-25\": 3.6,\n \"2026-02-26\": 3.6,\n \"2026-02-27\": 3.59,\n \"2026-03-02\": 3.61,\n \"2026-03-03\": 3.6,\n \"2026-03-04\": 3.6,\n \"2026-03-05\": 3.59,\n \"2026-03-06\": 3.58,\n \"2026-03-09\": 3.61,\n \"2026-03-10\": 3.6,\n \"2026-03-11\": 3.61,\n \"2026-03-12\": 3.61,\n \"2026-03-13\": 3.61,\n \"2026-03-16\": 3.61,\n \"2026-03-17\": 3.61,\n \"2026-03-18\": 3.62,\n \"2026-03-19\": 3.62,\n \"2026-03-20\": 3.63,\n \"2026-03-23\": 3.63,\n \"2026-03-24\": 3.63,\n \"2026-03-25\": 3.63,\n \"2026-03-26\": 3.63,\n \"2026-03-27\": 3.62,\n \"2026-03-30\": 3.62,\n \"2026-03-31\": 3.61,\n \"2026-04-01\": 3.61,\n \"2026-04-02\": 3.61,\n \"2026-04-03\": 3.62,\n \"2026-04-06\": 3.64,\n \"2026-04-07\": 3.62,\n \"2026-04-08\": 3.61,\n \"2026-04-09\": 3.6,\n \"2026-04-10\": 3.6,\n \"2026-04-13\": 3.62,\n \"2026-04-14\": 3.62,\n \"2026-04-15\": 3.62,\n \"2026-04-16\": 3.62,\n \"2026-04-17\": 3.61,\n \"2026-04-20\": 3.62,\n \"2026-04-21\": 3.6,\n \"2026-04-22\": 3.6,\n \"2026-04-23\": 3.6,\n \"2026-04-24\": 3.6,\n \"2026-04-27\": 3.6,\n \"2026-04-28\": 3.6,\n \"2026-04-29\": 3.6,\n \"2026-04-30\": 3.59,\n \"2026-05-01\": 3.59,\n \"2026-05-04\": 3.61,\n \"2026-05-05\": 3.61,\n \"2026-05-06\": 3.61,\n \"2026-05-07\": 3.61,\n \"2026-05-08\": 3.6,\n \"2026-05-11\": 3.61,\n \"2026-05-12\": 3.61,\n \"2026-05-13\": 3.61,\n \"2026-05-14\": 3.6,\n \"2026-05-15\": 3.6,\n \"2026-05-18\": 3.6,\n \"2026-05-19\": 3.59,\n \"2026-05-20\": 3.57,\n \"2026-05-21\": 3.59,\n \"2026-05-22\": 3.59,\n \"2026-05-26\": 3.6,\n \"2026-05-27\": 3.59,\n \"2026-05-28\": 3.6,\n \"2026-05-29\": 3.6,\n \"2026-06-01\": 3.63,\n \"2026-06-02\": 3.63,\n \"2026-06-03\": 3.63,\n \"2026-06-04\": 3.63,\n \"2026-06-05\": 3.63,\n \"2026-06-08\": 3.65,\n \"2026-06-09\": 3.64,\n \"2026-06-10\": 3.64,\n \"2026-06-11\": 3.63,\n \"2026-06-12\": 3.63,\n \"2026-06-15\": 3.64,\n \"2026-06-16\": 3.64,\n \"2026-06-17\": 3.68,\n \"2026-06-18\": 3.67,\n \"2026-06-22\": 3.7,\n \"2026-06-23\": 3.7,\n \"2026-06-24\": 3.7,\n \"2026-06-25\": 3.69,\n \"2026-06-26\": 3.67,\n \"2026-06-29\": 3.74,\n \"2026-06-30\": 3.74,\n \"2026-07-01\": 3.71,\n \"2026-07-02\": 3.68,\n \"2026-07-06\": 3.74,\n \"2026-07-07\": 3.73,\n \"2026-07-08\": 3.73,\n \"2026-07-09\": 3.69,\n \"2026-07-10\": 3.71,\n \"2026-07-13\": 3.76,\n \"2026-07-14\": 3.71,\n \"2026-07-15\": 3.7,\n \"2026-07-16\": 3.7,\n \"2026-07-17\": 3.71,\n \"2026-07-20\": 3.73,\n \"2026-07-21\": 3.74,\n \"2026-07-22\": 3.75,\n \"2026-07-23\": 3.81,\n \"2026-07-24\": 3.81,\n \"2026-07-27\": 3.82,\n \"2026-07-28\": 3.77,\n \"2026-07-29\": 3.7,\n \"2026-07-30\": 3.69,\n \"2026-07-31\": 3.69,\n \"2026-08-03\": 3.75,\n \"2026-08-04\": 3.74,\n \"2026-08-05\": 3.74,\n \"2026-08-06\": 3.74,\n \"2026-08-07\": 3.72,\n \"2026-08-10\": 3.74,\n \"2026-08-11\": 3.74,\n \"2026-08-12\": 3.72,\n \"2026-08-13\": 3.71,\n \"2026-08-14\": 3.71,\n \"2026-08-17\": 3.72,\n \"2026-08-18\": 3.71,\n \"2026-08-19\": 3.71,\n \"2026-08-20\": 3.71,\n \"2026-08-21\": 3.72,\n \"2026-08-24\": 3.72,\n \"2026-08-25\": 3.71,\n \"2026-08-26\": 3.7,\n \"2026-08-27\": 3.69,\n \"2026-08-28\": 3.74,\n \"2026-08-31\": 3.78,\n \"2026-09-01\": 3.78,\n \"2026-09-02\": 3.78,\n \"2026-09-03\": 3.75,\n \"2026-09-04\": 3.77,\n \"2026-09-08\": 3.8,\n \"2026-09-09\": 3.81,\n \"2026-09-10\": 3.86,\n \"2026-09-11\": 3.92,\n \"2026-09-14\": 3.97,\n \"2026-09-15\": 3.97,\n \"2026-09-16\": 3.99,\n \"2026-09-17\": 3.97,\n \"2026-09-18\": 3.99,\n \"2026-09-21\": 4.02,\n \"2026-09-22\": 4.01,\n \"2026-09-23\": 4.04,\n \"2026-09-24\": 4.08,\n \"2026-09-25\": 4.08,\n \"2026-09-28\": 4.1,\n \"2026-09-29\": 4.07,\n \"2026-09-30\": 4.03,\n \"2026-10-01\": 4,\n \"2026-10-02\": 4.01,\n \"2026-10-05\": 4.05,\n \"2026-10-06\": 4.04,\n};\n","/**\n * Historical SOFR Overnight Rates\n *\n * Source: Federal Reserve Bank of New York / FRED (SOFR series).\n * Rates are stored as annual percentages (e.g., 3.60 = 3.60% annual).\n *\n * This is the rate series used when computing option greeks under the\n * SOFR + q=0 convention. Distinct from treasury-rates.ts, which holds\n * 3-month T-bill yields used for portfolio Sharpe/Sortino calculations.\n *\n * SOFR is not published on US bank holidays — those rows are absent and the\n * lookup falls back to the most recent prior trading day's rate.\n *\n * To update the bundled SOFR and DTB3 together from the published rates file,\n * run `node scripts/rates.mjs seed` during a reviewed release.\n */\n\nexport const SOFR_RATES: Record<string, number> = {\n \"2022-01-03\": 0.05,\n \"2022-01-04\": 0.05,\n \"2022-01-05\": 0.05,\n \"2022-01-06\": 0.05,\n \"2022-01-07\": 0.05,\n \"2022-01-10\": 0.05,\n \"2022-01-11\": 0.05,\n \"2022-01-12\": 0.05,\n \"2022-01-13\": 0.05,\n \"2022-01-14\": 0.05,\n \"2022-01-18\": 0.05,\n \"2022-01-19\": 0.05,\n \"2022-01-20\": 0.04,\n \"2022-01-21\": 0.05,\n \"2022-01-24\": 0.04,\n \"2022-01-25\": 0.05,\n \"2022-01-26\": 0.04,\n \"2022-01-27\": 0.04,\n \"2022-01-28\": 0.05,\n \"2022-01-31\": 0.05,\n \"2022-02-01\": 0.05,\n \"2022-02-02\": 0.05,\n \"2022-02-03\": 0.05,\n \"2022-02-04\": 0.05,\n \"2022-02-07\": 0.05,\n \"2022-02-08\": 0.05,\n \"2022-02-09\": 0.04,\n \"2022-02-10\": 0.05,\n \"2022-02-11\": 0.05,\n \"2022-02-14\": 0.05,\n \"2022-02-15\": 0.05,\n \"2022-02-16\": 0.05,\n \"2022-02-17\": 0.05,\n \"2022-02-18\": 0.05,\n \"2022-02-22\": 0.05,\n \"2022-02-23\": 0.05,\n \"2022-02-24\": 0.05,\n \"2022-02-25\": 0.05,\n \"2022-02-28\": 0.05,\n \"2022-03-01\": 0.05,\n \"2022-03-02\": 0.05,\n \"2022-03-03\": 0.05,\n \"2022-03-04\": 0.05,\n \"2022-03-07\": 0.05,\n \"2022-03-08\": 0.05,\n \"2022-03-09\": 0.05,\n \"2022-03-10\": 0.05,\n \"2022-03-11\": 0.05,\n \"2022-03-14\": 0.05,\n \"2022-03-15\": 0.05,\n \"2022-03-16\": 0.05,\n \"2022-03-17\": 0.3,\n \"2022-03-18\": 0.3,\n \"2022-03-21\": 0.29,\n \"2022-03-22\": 0.28,\n \"2022-03-23\": 0.27,\n \"2022-03-24\": 0.27,\n \"2022-03-25\": 0.28,\n \"2022-03-28\": 0.28,\n \"2022-03-29\": 0.28,\n \"2022-03-30\": 0.27,\n \"2022-03-31\": 0.29,\n \"2022-04-01\": 0.3,\n \"2022-04-04\": 0.3,\n \"2022-04-05\": 0.3,\n \"2022-04-06\": 0.3,\n \"2022-04-07\": 0.3,\n \"2022-04-08\": 0.3,\n \"2022-04-11\": 0.3,\n \"2022-04-12\": 0.29,\n \"2022-04-13\": 0.29,\n \"2022-04-14\": 0.29,\n \"2022-04-18\": 0.29,\n \"2022-04-19\": 0.28,\n \"2022-04-20\": 0.27,\n \"2022-04-21\": 0.26,\n \"2022-04-22\": 0.27,\n \"2022-04-25\": 0.27,\n \"2022-04-26\": 0.27,\n \"2022-04-27\": 0.28,\n \"2022-04-28\": 0.28,\n \"2022-04-29\": 0.28,\n \"2022-05-02\": 0.3,\n \"2022-05-03\": 0.3,\n \"2022-05-04\": 0.3,\n \"2022-05-05\": 0.79,\n \"2022-05-06\": 0.78,\n \"2022-05-09\": 0.78,\n \"2022-05-10\": 0.78,\n \"2022-05-11\": 0.78,\n \"2022-05-12\": 0.79,\n \"2022-05-13\": 0.79,\n \"2022-05-16\": 0.8,\n \"2022-05-17\": 0.8,\n \"2022-05-18\": 0.79,\n \"2022-05-19\": 0.79,\n \"2022-05-20\": 0.78,\n \"2022-05-23\": 0.78,\n \"2022-05-24\": 0.78,\n \"2022-05-25\": 0.78,\n \"2022-05-26\": 0.78,\n \"2022-05-27\": 0.78,\n \"2022-05-31\": 0.79,\n \"2022-06-01\": 0.8,\n \"2022-06-02\": 0.79,\n \"2022-06-03\": 0.78,\n \"2022-06-06\": 0.78,\n \"2022-06-07\": 0.77,\n \"2022-06-08\": 0.76,\n \"2022-06-09\": 0.75,\n \"2022-06-10\": 0.75,\n \"2022-06-13\": 0.73,\n \"2022-06-14\": 0.69,\n \"2022-06-15\": 0.7,\n \"2022-06-16\": 1.45,\n \"2022-06-17\": 1.45,\n \"2022-06-21\": 1.45,\n \"2022-06-22\": 1.45,\n \"2022-06-23\": 1.44,\n \"2022-06-24\": 1.46,\n \"2022-06-27\": 1.5,\n \"2022-06-28\": 1.52,\n \"2022-06-29\": 1.51,\n \"2022-06-30\": 1.5,\n \"2022-07-01\": 1.52,\n \"2022-07-05\": 1.54,\n \"2022-07-06\": 1.54,\n \"2022-07-07\": 1.54,\n \"2022-07-08\": 1.53,\n \"2022-07-11\": 1.53,\n \"2022-07-12\": 1.54,\n \"2022-07-13\": 1.53,\n \"2022-07-14\": 1.53,\n \"2022-07-15\": 1.54,\n \"2022-07-18\": 1.54,\n \"2022-07-19\": 1.54,\n \"2022-07-20\": 1.53,\n \"2022-07-21\": 1.53,\n \"2022-07-22\": 1.52,\n \"2022-07-25\": 1.53,\n \"2022-07-26\": 1.53,\n \"2022-07-27\": 1.53,\n \"2022-07-28\": 2.28,\n \"2022-07-29\": 2.27,\n \"2022-08-01\": 2.28,\n \"2022-08-02\": 2.3,\n \"2022-08-03\": 2.29,\n \"2022-08-04\": 2.29,\n \"2022-08-05\": 2.28,\n \"2022-08-08\": 2.28,\n \"2022-08-09\": 2.29,\n \"2022-08-10\": 2.28,\n \"2022-08-11\": 2.28,\n \"2022-08-12\": 2.28,\n \"2022-08-15\": 2.29,\n \"2022-08-16\": 2.29,\n \"2022-08-17\": 2.29,\n \"2022-08-18\": 2.28,\n \"2022-08-19\": 2.28,\n \"2022-08-22\": 2.28,\n \"2022-08-23\": 2.27,\n \"2022-08-24\": 2.27,\n \"2022-08-25\": 2.28,\n \"2022-08-26\": 2.28,\n \"2022-08-29\": 2.28,\n \"2022-08-30\": 2.29,\n \"2022-08-31\": 2.29,\n \"2022-09-01\": 2.29,\n \"2022-09-02\": 2.29,\n \"2022-09-06\": 2.29,\n \"2022-09-07\": 2.28,\n \"2022-09-08\": 2.28,\n \"2022-09-09\": 2.28,\n \"2022-09-12\": 2.28,\n \"2022-09-13\": 2.28,\n \"2022-09-14\": 2.27,\n \"2022-09-15\": 2.28,\n \"2022-09-16\": 2.27,\n \"2022-09-19\": 2.27,\n \"2022-09-20\": 2.26,\n \"2022-09-21\": 2.25,\n \"2022-09-22\": 2.99,\n \"2022-09-23\": 2.99,\n \"2022-09-26\": 2.99,\n \"2022-09-27\": 2.98,\n \"2022-09-28\": 2.98,\n \"2022-09-29\": 2.96,\n \"2022-09-30\": 2.98,\n \"2022-10-03\": 3.0,\n \"2022-10-04\": 3.04,\n \"2022-10-05\": 3.04,\n \"2022-10-06\": 3.05,\n \"2022-10-07\": 3.05,\n \"2022-10-11\": 3.05,\n \"2022-10-12\": 3.04,\n \"2022-10-13\": 3.04,\n \"2022-10-14\": 3.04,\n \"2022-10-17\": 3.05,\n \"2022-10-18\": 3.04,\n \"2022-10-19\": 3.04,\n \"2022-10-20\": 3.03,\n \"2022-10-21\": 3.02,\n \"2022-10-24\": 3.01,\n \"2022-10-25\": 3.02,\n \"2022-10-26\": 3.03,\n \"2022-10-27\": 3.04,\n \"2022-10-28\": 3.05,\n \"2022-10-31\": 3.05,\n \"2022-11-01\": 3.05,\n \"2022-11-02\": 3.05,\n \"2022-11-03\": 3.8,\n \"2022-11-04\": 3.8,\n \"2022-11-07\": 3.78,\n \"2022-11-08\": 3.78,\n \"2022-11-09\": 3.78,\n \"2022-11-10\": 3.78,\n \"2022-11-14\": 3.79,\n \"2022-11-15\": 3.8,\n \"2022-11-16\": 3.81,\n \"2022-11-17\": 3.8,\n \"2022-11-18\": 3.8,\n \"2022-11-21\": 3.8,\n \"2022-11-22\": 3.8,\n \"2022-11-23\": 3.79,\n \"2022-11-25\": 3.8,\n \"2022-11-28\": 3.8,\n \"2022-11-29\": 3.81,\n \"2022-11-30\": 3.82,\n \"2022-12-01\": 3.82,\n \"2022-12-02\": 3.81,\n \"2022-12-05\": 3.81,\n \"2022-12-06\": 3.8,\n \"2022-12-07\": 3.8,\n \"2022-12-08\": 3.8,\n \"2022-12-09\": 3.8,\n \"2022-12-12\": 3.8,\n \"2022-12-13\": 3.8,\n \"2022-12-14\": 3.8,\n \"2022-12-15\": 4.32,\n \"2022-12-16\": 4.32,\n \"2022-12-19\": 4.3,\n \"2022-12-20\": 4.3,\n \"2022-12-21\": 4.3,\n \"2022-12-22\": 4.3,\n \"2022-12-23\": 4.3,\n \"2022-12-27\": 4.3,\n \"2022-12-28\": 4.3,\n \"2022-12-29\": 4.3,\n \"2022-12-30\": 4.3,\n \"2023-01-03\": 4.31,\n \"2023-01-04\": 4.3,\n \"2023-01-05\": 4.31,\n \"2023-01-06\": 4.31,\n \"2023-01-09\": 4.31,\n \"2023-01-10\": 4.31,\n \"2023-01-11\": 4.3,\n \"2023-01-12\": 4.3,\n \"2023-01-13\": 4.3,\n \"2023-01-17\": 4.31,\n \"2023-01-18\": 4.3,\n \"2023-01-19\": 4.31,\n \"2023-01-20\": 4.3,\n \"2023-01-23\": 4.3,\n \"2023-01-24\": 4.3,\n \"2023-01-25\": 4.31,\n \"2023-01-26\": 4.3,\n \"2023-01-27\": 4.3,\n \"2023-01-30\": 4.3,\n \"2023-01-31\": 4.31,\n \"2023-02-01\": 4.31,\n \"2023-02-02\": 4.56,\n \"2023-02-03\": 4.55,\n \"2023-02-06\": 4.55,\n \"2023-02-07\": 4.55,\n \"2023-02-08\": 4.55,\n \"2023-02-09\": 4.55,\n \"2023-02-10\": 4.55,\n \"2023-02-13\": 4.55,\n \"2023-02-14\": 4.55,\n \"2023-02-15\": 4.55,\n \"2023-02-16\": 4.55,\n \"2023-02-17\": 4.55,\n \"2023-02-21\": 4.55,\n \"2023-02-22\": 4.55,\n \"2023-02-23\": 4.55,\n \"2023-02-24\": 4.55,\n \"2023-02-27\": 4.55,\n \"2023-02-28\": 4.55,\n \"2023-03-01\": 4.55,\n \"2023-03-02\": 4.55,\n \"2023-03-03\": 4.55,\n \"2023-03-06\": 4.55,\n \"2023-03-07\": 4.55,\n \"2023-03-08\": 4.55,\n \"2023-03-09\": 4.55,\n \"2023-03-10\": 4.55,\n \"2023-03-13\": 4.55,\n \"2023-03-14\": 4.55,\n \"2023-03-15\": 4.58,\n \"2023-03-16\": 4.57,\n \"2023-03-17\": 4.55,\n \"2023-03-20\": 4.55,\n \"2023-03-21\": 4.55,\n \"2023-03-22\": 4.55,\n \"2023-03-23\": 4.8,\n \"2023-03-24\": 4.8,\n \"2023-03-27\": 4.81,\n \"2023-03-28\": 4.84,\n \"2023-03-29\": 4.83,\n \"2023-03-30\": 4.82,\n \"2023-03-31\": 4.87,\n \"2023-04-03\": 4.84,\n \"2023-04-04\": 4.83,\n \"2023-04-05\": 4.81,\n \"2023-04-06\": 4.81,\n \"2023-04-10\": 4.81,\n \"2023-04-11\": 4.8,\n \"2023-04-12\": 4.8,\n \"2023-04-13\": 4.8,\n \"2023-04-14\": 4.8,\n \"2023-04-17\": 4.8,\n \"2023-04-18\": 4.8,\n \"2023-04-19\": 4.8,\n \"2023-04-20\": 4.8,\n \"2023-04-21\": 4.8,\n \"2023-04-24\": 4.8,\n \"2023-04-25\": 4.8,\n \"2023-04-26\": 4.8,\n \"2023-04-27\": 4.81,\n \"2023-04-28\": 4.81,\n \"2023-05-01\": 4.81,\n \"2023-05-02\": 4.81,\n \"2023-05-03\": 4.81,\n \"2023-05-04\": 5.06,\n \"2023-05-05\": 5.06,\n \"2023-05-08\": 5.06,\n \"2023-05-09\": 5.06,\n \"2023-05-10\": 5.06,\n \"2023-05-11\": 5.05,\n \"2023-05-12\": 5.05,\n \"2023-05-15\": 5.06,\n \"2023-05-16\": 5.05,\n \"2023-05-17\": 5.05,\n \"2023-05-18\": 5.05,\n \"2023-05-19\": 5.05,\n \"2023-05-22\": 5.05,\n \"2023-05-23\": 5.05,\n \"2023-05-24\": 5.05,\n \"2023-05-25\": 5.06,\n \"2023-05-26\": 5.06,\n \"2023-05-30\": 5.06,\n \"2023-05-31\": 5.08,\n \"2023-06-01\": 5.08,\n \"2023-06-02\": 5.07,\n \"2023-06-05\": 5.06,\n \"2023-06-06\": 5.05,\n \"2023-06-07\": 5.05,\n \"2023-06-08\": 5.05,\n \"2023-06-09\": 5.05,\n \"2023-06-12\": 5.05,\n \"2023-06-13\": 5.05,\n \"2023-06-14\": 5.05,\n \"2023-06-15\": 5.06,\n \"2023-06-16\": 5.05,\n \"2023-06-20\": 5.05,\n \"2023-06-21\": 5.05,\n \"2023-06-22\": 5.05,\n \"2023-06-23\": 5.05,\n \"2023-06-26\": 5.05,\n \"2023-06-27\": 5.05,\n \"2023-06-28\": 5.06,\n \"2023-06-29\": 5.06,\n \"2023-06-30\": 5.09,\n \"2023-07-03\": 5.06,\n \"2023-07-05\": 5.06,\n \"2023-07-06\": 5.06,\n \"2023-07-07\": 5.06,\n \"2023-07-10\": 5.06,\n \"2023-07-11\": 5.06,\n \"2023-07-12\": 5.05,\n \"2023-07-13\": 5.06,\n \"2023-07-14\": 5.05,\n \"2023-07-17\": 5.06,\n \"2023-07-18\": 5.06,\n \"2023-07-19\": 5.05,\n \"2023-07-20\": 5.06,\n \"2023-07-21\": 5.05,\n \"2023-07-24\": 5.05,\n \"2023-07-25\": 5.06,\n \"2023-07-26\": 5.06,\n \"2023-07-27\": 5.31,\n \"2023-07-28\": 5.3,\n \"2023-07-31\": 5.31,\n \"2023-08-01\": 5.31,\n \"2023-08-02\": 5.3,\n \"2023-08-03\": 5.3,\n \"2023-08-04\": 5.3,\n \"2023-08-07\": 5.3,\n \"2023-08-08\": 5.3,\n \"2023-08-09\": 5.3,\n \"2023-08-10\": 5.3,\n \"2023-08-11\": 5.3,\n \"2023-08-14\": 5.3,\n \"2023-08-15\": 5.3,\n \"2023-08-16\": 5.3,\n \"2023-08-17\": 5.3,\n \"2023-08-18\": 5.3,\n \"2023-08-21\": 5.3,\n \"2023-08-22\": 5.3,\n \"2023-08-23\": 5.3,\n \"2023-08-24\": 5.3,\n \"2023-08-25\": 5.3,\n \"2023-08-28\": 5.3,\n \"2023-08-29\": 5.3,\n \"2023-08-30\": 5.3,\n \"2023-08-31\": 5.31,\n \"2023-09-01\": 5.31,\n \"2023-09-05\": 5.31,\n \"2023-09-06\": 5.3,\n \"2023-09-07\": 5.31,\n \"2023-09-08\": 5.3,\n \"2023-09-11\": 5.3,\n \"2023-09-12\": 5.3,\n \"2023-09-13\": 5.3,\n \"2023-09-14\": 5.3,\n \"2023-09-15\": 5.31,\n \"2023-09-18\": 5.31,\n \"2023-09-19\": 5.31,\n \"2023-09-20\": 5.3,\n \"2023-09-21\": 5.3,\n \"2023-09-22\": 5.3,\n \"2023-09-25\": 5.31,\n \"2023-09-26\": 5.31,\n \"2023-09-27\": 5.32,\n \"2023-09-28\": 5.31,\n \"2023-09-29\": 5.31,\n \"2023-10-02\": 5.32,\n \"2023-10-03\": 5.33,\n \"2023-10-04\": 5.32,\n \"2023-10-05\": 5.32,\n \"2023-10-06\": 5.31,\n \"2023-10-10\": 5.31,\n \"2023-10-11\": 5.31,\n \"2023-10-12\": 5.31,\n \"2023-10-13\": 5.31,\n \"2023-10-16\": 5.31,\n \"2023-10-17\": 5.31,\n \"2023-10-18\": 5.3,\n \"2023-10-19\": 5.3,\n \"2023-10-20\": 5.3,\n \"2023-10-23\": 5.3,\n \"2023-10-24\": 5.3,\n \"2023-10-25\": 5.3,\n \"2023-10-26\": 5.31,\n \"2023-10-27\": 5.31,\n \"2023-10-30\": 5.31,\n \"2023-10-31\": 5.35,\n \"2023-11-01\": 5.32,\n \"2023-11-02\": 5.33,\n \"2023-11-03\": 5.32,\n \"2023-11-06\": 5.32,\n \"2023-11-07\": 5.32,\n \"2023-11-08\": 5.32,\n \"2023-11-09\": 5.32,\n \"2023-11-10\": 5.32,\n \"2023-11-13\": 5.32,\n \"2023-11-14\": 5.32,\n \"2023-11-15\": 5.32,\n \"2023-11-16\": 5.32,\n \"2023-11-17\": 5.32,\n \"2023-11-20\": 5.31,\n \"2023-11-21\": 5.31,\n \"2023-11-22\": 5.31,\n \"2023-11-24\": 5.32,\n \"2023-11-27\": 5.32,\n \"2023-11-28\": 5.32,\n \"2023-11-29\": 5.31,\n \"2023-11-30\": 5.33,\n \"2023-12-01\": 5.39,\n \"2023-12-04\": 5.37,\n \"2023-12-05\": 5.33,\n \"2023-12-06\": 5.32,\n \"2023-12-07\": 5.32,\n \"2023-12-08\": 5.32,\n \"2023-12-11\": 5.32,\n \"2023-12-12\": 5.31,\n \"2023-12-13\": 5.31,\n \"2023-12-14\": 5.31,\n \"2023-12-15\": 5.32,\n \"2023-12-18\": 5.32,\n \"2023-12-19\": 5.31,\n \"2023-12-20\": 5.31,\n \"2023-12-21\": 5.31,\n \"2023-12-22\": 5.32,\n \"2023-12-26\": 5.35,\n \"2023-12-27\": 5.39,\n \"2023-12-28\": 5.4,\n \"2023-12-29\": 5.38,\n \"2024-01-02\": 5.4,\n \"2024-01-03\": 5.39,\n \"2024-01-04\": 5.32,\n \"2024-01-05\": 5.31,\n \"2024-01-08\": 5.31,\n \"2024-01-09\": 5.31,\n \"2024-01-10\": 5.31,\n \"2024-01-11\": 5.31,\n \"2024-01-12\": 5.31,\n \"2024-01-16\": 5.32,\n \"2024-01-17\": 5.32,\n \"2024-01-18\": 5.31,\n \"2024-01-19\": 5.31,\n \"2024-01-22\": 5.31,\n \"2024-01-23\": 5.31,\n \"2024-01-24\": 5.31,\n \"2024-01-25\": 5.32,\n \"2024-01-26\": 5.32,\n \"2024-01-29\": 5.31,\n \"2024-01-30\": 5.31,\n \"2024-01-31\": 5.32,\n \"2024-02-01\": 5.32,\n \"2024-02-02\": 5.32,\n \"2024-02-05\": 5.31,\n \"2024-02-06\": 5.31,\n \"2024-02-07\": 5.31,\n \"2024-02-08\": 5.31,\n \"2024-02-09\": 5.31,\n \"2024-02-12\": 5.31,\n \"2024-02-13\": 5.31,\n \"2024-02-14\": 5.3,\n \"2024-02-15\": 5.31,\n \"2024-02-16\": 5.3,\n \"2024-02-20\": 5.3,\n \"2024-02-21\": 5.3,\n \"2024-02-22\": 5.3,\n \"2024-02-23\": 5.31,\n \"2024-02-26\": 5.31,\n \"2024-02-27\": 5.31,\n \"2024-02-28\": 5.31,\n \"2024-02-29\": 5.32,\n \"2024-03-01\": 5.31,\n \"2024-03-04\": 5.31,\n \"2024-03-05\": 5.31,\n \"2024-03-06\": 5.31,\n \"2024-03-07\": 5.31,\n \"2024-03-08\": 5.31,\n \"2024-03-11\": 5.31,\n \"2024-03-12\": 5.31,\n \"2024-03-13\": 5.31,\n \"2024-03-14\": 5.31,\n \"2024-03-15\": 5.31,\n \"2024-03-18\": 5.31,\n \"2024-03-19\": 5.31,\n \"2024-03-20\": 5.31,\n \"2024-03-21\": 5.31,\n \"2024-03-22\": 5.31,\n \"2024-03-25\": 5.31,\n \"2024-03-26\": 5.32,\n \"2024-03-27\": 5.33,\n \"2024-03-28\": 5.34,\n \"2024-04-01\": 5.35,\n \"2024-04-02\": 5.34,\n \"2024-04-03\": 5.32,\n \"2024-04-04\": 5.32,\n \"2024-04-05\": 5.32,\n \"2024-04-08\": 5.31,\n \"2024-04-09\": 5.31,\n \"2024-04-10\": 5.31,\n \"2024-04-11\": 5.31,\n \"2024-04-12\": 5.31,\n \"2024-04-15\": 5.32,\n \"2024-04-16\": 5.31,\n \"2024-04-17\": 5.31,\n \"2024-04-18\": 5.3,\n \"2024-04-19\": 5.31,\n \"2024-04-22\": 5.31,\n \"2024-04-23\": 5.31,\n \"2024-04-24\": 5.31,\n \"2024-04-25\": 5.31,\n \"2024-04-26\": 5.32,\n \"2024-04-29\": 5.32,\n \"2024-04-30\": 5.34,\n \"2024-05-01\": 5.32,\n \"2024-05-02\": 5.31,\n \"2024-05-03\": 5.31,\n \"2024-05-06\": 5.31,\n \"2024-05-07\": 5.31,\n \"2024-05-08\": 5.31,\n \"2024-05-09\": 5.31,\n \"2024-05-10\": 5.31,\n \"2024-05-13\": 5.31,\n \"2024-05-14\": 5.31,\n \"2024-05-15\": 5.31,\n \"2024-05-16\": 5.31,\n \"2024-05-17\": 5.31,\n \"2024-05-20\": 5.31,\n \"2024-05-21\": 5.31,\n \"2024-05-22\": 5.31,\n \"2024-05-23\": 5.31,\n \"2024-05-24\": 5.32,\n \"2024-05-28\": 5.32,\n \"2024-05-29\": 5.33,\n \"2024-05-30\": 5.33,\n \"2024-05-31\": 5.34,\n \"2024-06-03\": 5.35,\n \"2024-06-04\": 5.33,\n \"2024-06-05\": 5.33,\n \"2024-06-06\": 5.33,\n \"2024-06-07\": 5.33,\n \"2024-06-10\": 5.32,\n \"2024-06-11\": 5.32,\n \"2024-06-12\": 5.31,\n \"2024-06-13\": 5.31,\n \"2024-06-14\": 5.31,\n \"2024-06-17\": 5.33,\n \"2024-06-18\": 5.33,\n \"2024-06-20\": 5.32,\n \"2024-06-21\": 5.31,\n \"2024-06-24\": 5.31,\n \"2024-06-25\": 5.33,\n \"2024-06-26\": 5.34,\n \"2024-06-27\": 5.34,\n \"2024-06-28\": 5.33,\n \"2024-07-01\": 5.4,\n \"2024-07-02\": 5.35,\n \"2024-07-03\": 5.33,\n \"2024-07-05\": 5.32,\n \"2024-07-08\": 5.32,\n \"2024-07-09\": 5.34,\n \"2024-07-10\": 5.34,\n \"2024-07-11\": 5.34,\n \"2024-07-12\": 5.34,\n \"2024-07-15\": 5.34,\n \"2024-07-16\": 5.35,\n \"2024-07-17\": 5.35,\n \"2024-07-18\": 5.34,\n \"2024-07-19\": 5.34,\n \"2024-07-22\": 5.33,\n \"2024-07-23\": 5.34,\n \"2024-07-24\": 5.34,\n \"2024-07-25\": 5.35,\n \"2024-07-26\": 5.35,\n \"2024-07-29\": 5.33,\n \"2024-07-30\": 5.33,\n \"2024-07-31\": 5.38,\n \"2024-08-01\": 5.35,\n \"2024-08-02\": 5.35,\n \"2024-08-05\": 5.32,\n \"2024-08-06\": 5.33,\n \"2024-08-07\": 5.33,\n \"2024-08-08\": 5.34,\n \"2024-08-09\": 5.34,\n \"2024-08-12\": 5.34,\n \"2024-08-13\": 5.34,\n \"2024-08-14\": 5.33,\n \"2024-08-15\": 5.35,\n \"2024-08-16\": 5.32,\n \"2024-08-19\": 5.32,\n \"2024-08-20\": 5.32,\n \"2024-08-21\": 5.31,\n \"2024-08-22\": 5.31,\n \"2024-08-23\": 5.33,\n \"2024-08-26\": 5.34,\n \"2024-08-27\": 5.35,\n \"2024-08-28\": 5.35,\n \"2024-08-29\": 5.33,\n \"2024-08-30\": 5.32,\n \"2024-09-03\": 5.34,\n \"2024-09-04\": 5.35,\n \"2024-09-05\": 5.35,\n \"2024-09-06\": 5.34,\n \"2024-09-09\": 5.34,\n \"2024-09-10\": 5.33,\n \"2024-09-11\": 5.32,\n \"2024-09-12\": 5.33,\n \"2024-09-13\": 5.33,\n \"2024-09-16\": 5.38,\n \"2024-09-17\": 5.38,\n \"2024-09-18\": 5.33,\n \"2024-09-19\": 4.82,\n \"2024-09-20\": 4.83,\n \"2024-09-23\": 4.83,\n \"2024-09-24\": 4.84,\n \"2024-09-25\": 4.84,\n \"2024-09-26\": 4.83,\n \"2024-09-27\": 4.84,\n \"2024-09-30\": 4.96,\n \"2024-10-01\": 5.05,\n \"2024-10-02\": 4.92,\n \"2024-10-03\": 4.85,\n \"2024-10-04\": 4.83,\n \"2024-10-07\": 4.83,\n \"2024-10-08\": 4.84,\n \"2024-10-09\": 4.83,\n \"2024-10-10\": 4.82,\n \"2024-10-11\": 4.81,\n \"2024-10-15\": 4.86,\n \"2024-10-16\": 4.86,\n \"2024-10-17\": 4.85,\n \"2024-10-18\": 4.84,\n \"2024-10-21\": 4.82,\n \"2024-10-22\": 4.83,\n \"2024-10-23\": 4.83,\n \"2024-10-24\": 4.83,\n \"2024-10-25\": 4.83,\n \"2024-10-28\": 4.82,\n \"2024-10-29\": 4.82,\n \"2024-10-30\": 4.81,\n \"2024-10-31\": 4.9,\n \"2024-11-01\": 4.86,\n \"2024-11-04\": 4.82,\n \"2024-11-05\": 4.82,\n \"2024-11-06\": 4.81,\n \"2024-11-07\": 4.82,\n \"2024-11-08\": 4.6,\n \"2024-11-12\": 4.6,\n \"2024-11-13\": 4.59,\n \"2024-11-14\": 4.58,\n \"2024-11-15\": 4.57,\n \"2024-11-18\": 4.57,\n \"2024-11-19\": 4.57,\n \"2024-11-20\": 4.56,\n \"2024-11-21\": 4.57,\n \"2024-11-22\": 4.57,\n \"2024-11-25\": 4.58,\n \"2024-11-26\": 4.58,\n \"2024-11-27\": 4.57,\n \"2024-11-29\": 4.59,\n \"2024-12-02\": 4.64,\n \"2024-12-03\": 4.64,\n \"2024-12-04\": 4.59,\n \"2024-12-05\": 4.59,\n \"2024-12-06\": 4.6,\n \"2024-12-09\": 4.63,\n \"2024-12-10\": 4.64,\n \"2024-12-11\": 4.62,\n \"2024-12-12\": 4.62,\n \"2024-12-13\": 4.6,\n \"2024-12-16\": 4.65,\n \"2024-12-17\": 4.62,\n \"2024-12-18\": 4.57,\n \"2024-12-19\": 4.3,\n \"2024-12-20\": 4.3,\n \"2024-12-23\": 4.31,\n \"2024-12-24\": 4.4,\n \"2024-12-26\": 4.53,\n \"2024-12-27\": 4.46,\n \"2024-12-30\": 4.37,\n \"2024-12-31\": 4.49,\n \"2025-01-02\": 4.4,\n \"2025-01-03\": 4.31,\n \"2025-01-06\": 4.27,\n \"2025-01-07\": 4.27,\n \"2025-01-08\": 4.29,\n \"2025-01-09\": 4.3,\n \"2025-01-10\": 4.3,\n \"2025-01-13\": 4.29,\n \"2025-01-14\": 4.28,\n \"2025-01-15\": 4.28,\n \"2025-01-16\": 4.29,\n \"2025-01-17\": 4.29,\n \"2025-01-21\": 4.29,\n \"2025-01-22\": 4.3,\n \"2025-01-23\": 4.35,\n \"2025-01-24\": 4.34,\n \"2025-01-27\": 4.34,\n \"2025-01-28\": 4.35,\n \"2025-01-29\": 4.35,\n \"2025-01-30\": 4.36,\n \"2025-01-31\": 4.38,\n \"2025-02-03\": 4.35,\n \"2025-02-04\": 4.33,\n \"2025-02-05\": 4.33,\n \"2025-02-06\": 4.36,\n \"2025-02-07\": 4.35,\n \"2025-02-10\": 4.35,\n \"2025-02-11\": 4.34,\n \"2025-02-12\": 4.32,\n \"2025-02-13\": 4.33,\n \"2025-02-14\": 4.33,\n \"2025-02-18\": 4.37,\n \"2025-02-19\": 4.35,\n \"2025-02-20\": 4.33,\n \"2025-02-21\": 4.34,\n \"2025-02-24\": 4.34,\n \"2025-02-25\": 4.33,\n \"2025-02-26\": 4.33,\n \"2025-02-27\": 4.36,\n \"2025-02-28\": 4.39,\n \"2025-03-03\": 4.33,\n \"2025-03-04\": 4.33,\n \"2025-03-05\": 4.34,\n \"2025-03-06\": 4.35,\n \"2025-03-07\": 4.34,\n \"2025-03-10\": 4.33,\n \"2025-03-11\": 4.32,\n \"2025-03-12\": 4.31,\n \"2025-03-13\": 4.3,\n \"2025-03-14\": 4.3,\n \"2025-03-17\": 4.32,\n \"2025-03-18\": 4.31,\n \"2025-03-19\": 4.29,\n \"2025-03-20\": 4.29,\n \"2025-03-21\": 4.3,\n \"2025-03-24\": 4.31,\n \"2025-03-25\": 4.33,\n \"2025-03-26\": 4.35,\n \"2025-03-27\": 4.36,\n \"2025-03-28\": 4.34,\n \"2025-03-31\": 4.41,\n \"2025-04-01\": 4.39,\n \"2025-04-02\": 4.37,\n \"2025-04-03\": 4.39,\n \"2025-04-04\": 4.35,\n \"2025-04-07\": 4.33,\n \"2025-04-08\": 4.4,\n \"2025-04-09\": 4.42,\n \"2025-04-10\": 4.37,\n \"2025-04-11\": 4.33,\n \"2025-04-14\": 4.33,\n \"2025-04-15\": 4.36,\n \"2025-04-16\": 4.31,\n \"2025-04-17\": 4.32,\n \"2025-04-21\": 4.32,\n \"2025-04-22\": 4.3,\n \"2025-04-23\": 4.28,\n \"2025-04-24\": 4.29,\n \"2025-04-25\": 4.33,\n \"2025-04-28\": 4.36,\n \"2025-04-29\": 4.36,\n \"2025-04-30\": 4.41,\n \"2025-05-01\": 4.39,\n \"2025-05-02\": 4.36,\n \"2025-05-05\": 4.33,\n \"2025-05-06\": 4.32,\n \"2025-05-07\": 4.3,\n \"2025-05-08\": 4.29,\n \"2025-05-09\": 4.28,\n \"2025-05-12\": 4.28,\n \"2025-05-13\": 4.3,\n \"2025-05-14\": 4.29,\n \"2025-05-15\": 4.31,\n \"2025-05-16\": 4.3,\n \"2025-05-19\": 4.29,\n \"2025-05-20\": 4.27,\n \"2025-05-21\": 4.26,\n \"2025-05-22\": 4.26,\n \"2025-05-23\": 4.26,\n \"2025-05-27\": 4.31,\n \"2025-05-28\": 4.33,\n \"2025-05-29\": 4.33,\n \"2025-05-30\": 4.35,\n \"2025-06-02\": 4.35,\n \"2025-06-03\": 4.32,\n \"2025-06-04\": 4.28,\n \"2025-06-05\": 4.29,\n \"2025-06-06\": 4.29,\n \"2025-06-09\": 4.29,\n \"2025-06-10\": 4.28,\n \"2025-06-11\": 4.28,\n \"2025-06-12\": 4.28,\n \"2025-06-13\": 4.28,\n \"2025-06-16\": 4.32,\n \"2025-06-17\": 4.31,\n \"2025-06-18\": 4.28,\n \"2025-06-20\": 4.29,\n \"2025-06-23\": 4.29,\n \"2025-06-24\": 4.3,\n \"2025-06-25\": 4.36,\n \"2025-06-26\": 4.4,\n \"2025-06-27\": 4.39,\n \"2025-06-30\": 4.45,\n \"2025-07-01\": 4.44,\n \"2025-07-02\": 4.4,\n \"2025-07-03\": 4.35,\n \"2025-07-07\": 4.33,\n \"2025-07-08\": 4.34,\n \"2025-07-09\": 4.32,\n \"2025-07-10\": 4.31,\n \"2025-07-11\": 4.31,\n \"2025-07-14\": 4.33,\n \"2025-07-15\": 4.37,\n \"2025-07-16\": 4.34,\n \"2025-07-17\": 4.34,\n \"2025-07-18\": 4.3,\n \"2025-07-21\": 4.28,\n \"2025-07-22\": 4.28,\n \"2025-07-23\": 4.28,\n \"2025-07-24\": 4.3,\n \"2025-07-25\": 4.36,\n \"2025-07-28\": 4.36,\n \"2025-07-29\": 4.36,\n \"2025-07-30\": 4.32,\n \"2025-07-31\": 4.39,\n \"2025-08-01\": 4.34,\n \"2025-08-04\": 4.33,\n \"2025-08-05\": 4.34,\n \"2025-08-06\": 4.34,\n \"2025-08-07\": 4.35,\n \"2025-08-08\": 4.35,\n \"2025-08-11\": 4.34,\n \"2025-08-12\": 4.36,\n \"2025-08-13\": 4.33,\n \"2025-08-14\": 4.34,\n \"2025-08-15\": 4.36,\n \"2025-08-18\": 4.34,\n \"2025-08-19\": 4.33,\n \"2025-08-20\": 4.31,\n \"2025-08-21\": 4.32,\n \"2025-08-22\": 4.36,\n \"2025-08-25\": 4.37,\n \"2025-08-26\": 4.38,\n \"2025-08-27\": 4.36,\n \"2025-08-28\": 4.34,\n \"2025-08-29\": 4.34,\n \"2025-09-02\": 4.39,\n \"2025-09-03\": 4.39,\n \"2025-09-04\": 4.41,\n \"2025-09-05\": 4.42,\n \"2025-09-08\": 4.4,\n \"2025-09-09\": 4.4,\n \"2025-09-10\": 4.39,\n \"2025-09-11\": 4.41,\n \"2025-09-12\": 4.42,\n \"2025-09-15\": 4.51,\n \"2025-09-16\": 4.39,\n \"2025-09-17\": 4.38,\n \"2025-09-18\": 4.14,\n \"2025-09-19\": 4.14,\n \"2025-09-22\": 4.14,\n \"2025-09-23\": 4.12,\n \"2025-09-24\": 4.13,\n \"2025-09-25\": 4.18,\n \"2025-09-26\": 4.16,\n \"2025-09-29\": 4.13,\n \"2025-09-30\": 4.24,\n \"2025-10-01\": 4.2,\n \"2025-10-02\": 4.2,\n \"2025-10-03\": 4.18,\n \"2025-10-06\": 4.15,\n \"2025-10-07\": 4.14,\n \"2025-10-08\": 4.12,\n \"2025-10-09\": 4.13,\n \"2025-10-10\": 4.15,\n \"2025-10-14\": 4.19,\n \"2025-10-15\": 4.29,\n \"2025-10-16\": 4.3,\n \"2025-10-17\": 4.18,\n \"2025-10-20\": 4.16,\n \"2025-10-21\": 4.23,\n \"2025-10-22\": 4.21,\n \"2025-10-23\": 4.24,\n \"2025-10-24\": 4.24,\n \"2025-10-27\": 4.27,\n \"2025-10-28\": 4.31,\n \"2025-10-29\": 4.27,\n \"2025-10-30\": 4.04,\n \"2025-10-31\": 4.22,\n \"2025-11-03\": 4.13,\n \"2025-11-04\": 4.0,\n \"2025-11-05\": 3.91,\n \"2025-11-06\": 3.92,\n \"2025-11-07\": 3.93,\n \"2025-11-10\": 3.95,\n \"2025-11-12\": 3.98,\n \"2025-11-13\": 4.0,\n \"2025-11-14\": 3.95,\n \"2025-11-17\": 4.0,\n \"2025-11-18\": 3.94,\n \"2025-11-19\": 3.91,\n \"2025-11-20\": 3.91,\n \"2025-11-21\": 3.93,\n \"2025-11-24\": 3.96,\n \"2025-11-25\": 4.01,\n \"2025-11-26\": 4.05,\n \"2025-11-28\": 4.12,\n \"2025-12-01\": 4.12,\n \"2025-12-02\": 4.01,\n \"2025-12-03\": 3.95,\n \"2025-12-04\": 3.92,\n \"2025-12-05\": 3.93,\n \"2025-12-08\": 3.95,\n \"2025-12-09\": 3.93,\n \"2025-12-10\": 3.9,\n \"2025-12-11\": 3.66,\n \"2025-12-12\": 3.67,\n \"2025-12-15\": 3.75,\n \"2025-12-16\": 3.69,\n \"2025-12-17\": 3.69,\n \"2025-12-18\": 3.66,\n \"2025-12-19\": 3.66,\n \"2025-12-22\": 3.68,\n \"2025-12-23\": 3.66,\n \"2025-12-24\": 3.66,\n \"2025-12-26\": 3.76,\n \"2025-12-29\": 3.77,\n \"2025-12-30\": 3.71,\n \"2025-12-31\": 3.87,\n \"2026-01-02\": 3.75,\n \"2026-01-05\": 3.7,\n \"2026-01-06\": 3.66,\n \"2026-01-07\": 3.65,\n \"2026-01-08\": 3.64,\n \"2026-01-09\": 3.64,\n \"2026-01-12\": 3.64,\n \"2026-01-13\": 3.65,\n \"2026-01-14\": 3.64,\n \"2026-01-15\": 3.66,\n \"2026-01-16\": 3.65,\n \"2026-01-20\": 3.64,\n \"2026-01-21\": 3.63,\n \"2026-01-22\": 3.64,\n \"2026-01-23\": 3.65,\n \"2026-01-26\": 3.66,\n \"2026-01-27\": 3.66,\n \"2026-01-28\": 3.64,\n \"2026-01-29\": 3.65,\n \"2026-01-30\": 3.68,\n \"2026-02-02\": 3.69,\n \"2026-02-03\": 3.69,\n \"2026-02-04\": 3.65,\n \"2026-02-05\": 3.65,\n \"2026-02-06\": 3.64,\n \"2026-02-09\": 3.63,\n \"2026-02-10\": 3.65,\n \"2026-02-11\": 3.65,\n \"2026-02-12\": 3.65,\n \"2026-02-13\": 3.66,\n \"2026-02-17\": 3.71,\n \"2026-02-18\": 3.73,\n \"2026-02-19\": 3.67,\n \"2026-02-20\": 3.66,\n \"2026-02-23\": 3.66,\n \"2026-02-24\": 3.67,\n \"2026-02-25\": 3.67,\n \"2026-02-26\": 3.67,\n \"2026-02-27\": 3.68,\n \"2026-03-02\": 3.71,\n \"2026-03-03\": 3.7,\n \"2026-03-04\": 3.67,\n \"2026-03-05\": 3.66,\n \"2026-03-06\": 3.65,\n \"2026-03-09\": 3.65,\n \"2026-03-10\": 3.64,\n \"2026-03-11\": 3.64,\n \"2026-03-12\": 3.65,\n \"2026-03-13\": 3.65,\n \"2026-03-16\": 3.7,\n \"2026-03-17\": 3.65,\n \"2026-03-18\": 3.62,\n \"2026-03-19\": 3.62,\n \"2026-03-20\": 3.62,\n \"2026-03-23\": 3.62,\n \"2026-03-24\": 3.63,\n \"2026-03-25\": 3.64,\n \"2026-03-26\": 3.65,\n \"2026-03-27\": 3.63,\n \"2026-03-30\": 3.63,\n \"2026-03-31\": 3.68,\n \"2026-04-01\": 3.65,\n \"2026-04-02\": 3.66,\n \"2026-04-06\": 3.65,\n \"2026-04-07\": 3.62,\n \"2026-04-08\": 3.59,\n \"2026-04-09\": 3.57,\n \"2026-04-10\": 3.61,\n \"2026-04-13\": 3.63,\n \"2026-04-14\": 3.66,\n \"2026-04-15\": 3.72,\n \"2026-04-16\": 3.67,\n \"2026-04-17\": 3.65,\n \"2026-04-20\": 3.63,\n \"2026-04-21\": 3.63,\n \"2026-04-22\": 3.64,\n \"2026-04-23\": 3.65,\n \"2026-04-24\": 3.66,\n \"2026-04-27\": 3.66,\n \"2026-04-28\": 3.64,\n \"2026-04-29\": 3.63,\n \"2026-04-30\": 3.66,\n \"2026-05-01\": 3.64,\n \"2026-05-04\": 3.63,\n \"2026-05-05\": 3.62,\n \"2026-05-06\": 3.61,\n \"2026-05-07\": 3.6,\n \"2026-05-08\": 3.6,\n \"2026-05-11\": 3.6,\n \"2026-05-12\": 3.6,\n \"2026-05-13\": 3.59,\n \"2026-05-14\": 3.56,\n \"2026-05-15\": 3.55,\n \"2026-05-18\": 3.53,\n \"2026-05-19\": 3.51,\n \"2026-05-20\": 3.5,\n \"2026-05-21\": 3.51,\n \"2026-05-22\": 3.55,\n \"2026-05-26\": 3.63,\n \"2026-05-27\": 3.63,\n \"2026-05-28\": 3.62,\n \"2026-05-29\": 3.63,\n \"2026-06-01\": 3.65,\n \"2026-06-02\": 3.63,\n \"2026-06-03\": 3.61,\n \"2026-06-04\": 3.62,\n \"2026-06-05\": 3.63,\n \"2026-06-08\": 3.63,\n \"2026-06-09\": 3.6,\n \"2026-06-10\": 3.59,\n \"2026-06-11\": 3.6,\n \"2026-06-12\": 3.65,\n \"2026-06-15\": 3.69,\n \"2026-06-16\": 3.63,\n \"2026-06-17\": 3.63,\n \"2026-06-18\": 3.62,\n \"2026-06-22\": 3.61,\n \"2026-06-23\": 3.62,\n \"2026-06-24\": 3.62,\n \"2026-06-25\": 3.64,\n \"2026-06-26\": 3.62,\n \"2026-06-29\": 3.62,\n \"2026-06-30\": 3.68,\n \"2026-07-01\": 3.66,\n \"2026-07-02\": 3.64,\n \"2026-07-06\": 3.63,\n \"2026-07-07\": 3.62,\n \"2026-07-08\": 3.58,\n \"2026-07-09\": 3.53,\n \"2026-07-10\": 3.55,\n \"2026-07-13\": 3.6,\n \"2026-07-14\": 3.63,\n \"2026-07-15\": 3.64,\n \"2026-07-16\": 3.62,\n \"2026-07-17\": 3.59,\n \"2026-07-20\": 3.57,\n \"2026-07-21\": 3.61,\n \"2026-07-22\": 3.62,\n \"2026-07-23\": 3.64,\n \"2026-07-24\": 3.64,\n \"2026-07-27\": 3.64,\n \"2026-07-28\": 3.65,\n \"2026-07-29\": 3.65,\n \"2026-07-30\": 3.65,\n \"2026-07-31\": 3.66,\n \"2026-08-03\": 3.65,\n \"2026-08-04\": 3.66,\n \"2026-08-05\": 3.64,\n \"2026-08-06\": 3.65,\n \"2026-08-07\": 3.62,\n \"2026-08-10\": 3.63,\n \"2026-08-11\": 3.64,\n \"2026-08-12\": 3.62,\n \"2026-08-13\": 3.62,\n \"2026-08-14\": 3.62,\n \"2026-08-17\": 3.66,\n \"2026-08-18\": 3.65,\n \"2026-08-19\": 3.62,\n \"2026-08-20\": 3.63,\n \"2026-08-21\": 3.65,\n \"2026-08-24\": 3.65,\n \"2026-08-25\": 3.66,\n \"2026-08-26\": 3.64,\n \"2026-08-27\": 3.64,\n \"2026-08-28\": 3.65,\n \"2026-08-31\": 3.68,\n \"2026-09-01\": 3.66,\n \"2026-09-02\": 3.65,\n \"2026-09-03\": 3.66,\n \"2026-09-04\": 3.65,\n \"2026-09-08\": 3.64,\n \"2026-09-09\": 3.64,\n \"2026-09-10\": 3.62,\n \"2026-09-11\": 3.62,\n \"2026-09-14\": 3.62,\n \"2026-09-15\": 3.64,\n \"2026-09-16\": 3.62,\n \"2026-09-17\": 3.85,\n \"2026-09-18\": 3.85,\n \"2026-09-21\": 3.85,\n \"2026-09-22\": 3.87,\n \"2026-09-23\": 3.87,\n \"2026-09-24\": 3.88,\n \"2026-09-25\": 3.9,\n \"2026-09-28\": 3.9,\n \"2026-09-29\": 3.88,\n \"2026-09-30\": 3.9,\n \"2026-10-01\": 3.87,\n \"2026-10-02\": 3.88,\n \"2026-10-05\": 3.89,\n \"2026-10-06\": 3.9,\n \"2026-10-07\": 3.88,\n};\n","import { z } from \"zod\";\nimport { SOFR_RATES } from \"../data/sofr-rates.ts\";\nimport { TREASURY_RATES } from \"../data/treasury-rates.ts\";\n\nexport const PUBLISHED_RATES_URL =\n \"https://raw.githubusercontent.com/tradeblocks-org/tradeblocks/rates-data/rates.json\";\n\nconst SeriesSchema = z.object({\n unit: z.literal(\"annual-percent\"),\n firstDate: z.string(),\n lastDate: z.string(),\n rates: z.record(z.string(), z.number()),\n});\nconst PublishedRatesSchema = z.object({\n schemaVersion: z.literal(1),\n source: z.literal(\"Federal Reserve Economic Data (FRED), Federal Reserve Bank of St. Louis\"),\n fetchedAt: z.iso.datetime(),\n series: z.object({ DTB3: SeriesSchema, SOFR: SeriesSchema }),\n});\nexport type PublishedRates = z.infer<typeof PublishedRatesSchema>;\n\nfunction validateSeries(\n name: \"DTB3\" | \"SOFR\",\n series: PublishedRates[\"series\"][\"DTB3\"],\n bundled: Record<string, number>,\n): void {\n const keys = Object.keys(series.rates);\n if (!keys.length || series.firstDate !== keys[0] || series.lastDate !== keys.at(-1)) {\n throw new Error(`Invalid published ${name} date range`);\n }\n let previous = \"\";\n for (const date of keys) {\n const rate = series.rates[date];\n const timestamp = Date.parse(`${date}T00:00:00Z`);\n if (\n !/^\\d{4}-\\d{2}-\\d{2}$/.test(date) ||\n !Number.isFinite(timestamp) ||\n new Date(timestamp).toISOString().slice(0, 10) !== date ||\n date <= previous ||\n !Number.isFinite(rate) ||\n !Number.isSafeInteger(Math.round(rate * 100)) ||\n Math.round(rate * 100) / 100 !== rate\n ) {\n throw new Error(`Invalid published ${name} observation: ${date}`);\n }\n previous = date;\n }\n for (const [date, rate] of Object.entries(bundled)) {\n if (series.rates[date] !== rate) {\n throw new Error(`Published ${name} disagrees with bundled rate on ${date}`);\n }\n }\n}\n\nexport function validatePublishedRates(input: unknown): PublishedRates {\n const parsed = PublishedRatesSchema.parse(input);\n validateSeries(\"DTB3\", parsed.series.DTB3, TREASURY_RATES);\n validateSeries(\"SOFR\", parsed.series.SOFR, SOFR_RATES);\n return parsed;\n}\n","/**\n * Risk-Free Rate Lookup Utility\n *\n * Provides date-based lookup for 3-month Treasury bill rates,\n * used as the risk-free rate in Sharpe/Sortino ratio calculations.\n *\n * Data source: FRED DTB3 series (Federal Reserve Economic Data)\n * Rates are stored as annual percentages (e.g., 4.32 = 4.32% annual)\n */\n\nimport { TREASURY_RATES } from \"../data/treasury-rates.ts\";\nimport { SOFR_RATES } from \"../data/sofr-rates.ts\";\nimport { validatePublishedRates } from \"./published-rates.ts\";\n\ninterface ActiveRates {\n treasury: Readonly<Record<string, number>>;\n sofr: Readonly<Record<string, number>>;\n treasuryKeys: string[] | null;\n sofrKeys: string[] | null;\n}\n\n// MCP dist can inline the library in multiple chunks; one realm must still use one rate source.\nconst slot = globalThis as typeof globalThis & { __tradeblocksActiveRates?: ActiveRates };\nconst active = (slot.__tradeblocksActiveRates ??= {\n treasury: TREASURY_RATES,\n sofr: SOFR_RATES,\n treasuryKeys: null,\n sofrKeys: null,\n});\n\n/** Install a validated published superset for both series; invalid input leaves the active rates unchanged. */\nexport function setPublishedRates(input: unknown): void {\n const published = validatePublishedRates(input);\n active.treasury = published.series.DTB3.rates;\n active.sofr = published.series.SOFR.rates;\n active.treasuryKeys = null;\n active.sofrKeys = null;\n}\n\n/** Restore exactly the bundled series (for offline mode or an invalid remote file). */\nexport function clearPublishedRates(): void {\n active.treasury = TREASURY_RATES;\n active.sofr = SOFR_RATES;\n active.treasuryKeys = null;\n active.sofrKeys = null;\n}\n\nexport function getEffectiveRateDate(series: \"DTB3\" | \"SOFR\"): string {\n const keys = series === \"DTB3\" ? getSortedKeys() : getSortedSofrKeys();\n return keys[keys.length - 1];\n}\n\nexport type RateResolution = \"exact\" | \"prior\" | \"clamped-earliest\" | \"stale-after-latest\";\n\nexport interface ResolvedRateByKey {\n requestedDate: string;\n effectiveDate: string;\n /** Integer hundredths of one percentage point (for example 3.60% = 360). */\n annualRateBasisPoints: number;\n resolution: RateResolution;\n}\n\n/**\n * Get all rate date keys sorted in ascending order\n */\nfunction getSortedKeys(): string[] {\n if (!active.treasuryKeys) {\n active.treasuryKeys = Object.keys(active.treasury).sort();\n }\n return active.treasuryKeys;\n}\n\n/**\n * Format a Date object to YYYY-MM-DD string key\n * Uses the date's local values (not UTC) to match US Eastern timezone handling\n */\nexport function formatDateToKey(date: Date): string {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n return `${year}-${month}-${day}`;\n}\n\n/**\n * Parse a YYYY-MM-DD string to a Date object\n * Creates date in local timezone (matching project convention for US Eastern time)\n */\nfunction parseKeyToDate(key: string): Date {\n const [year, month, day] = key.split(\"-\").map(Number);\n return new Date(year, month - 1, day);\n}\n\n/**\n * Get the risk-free rate (3-month T-bill rate) for a given date.\n *\n * Lookup behavior:\n * - If exact date exists in data, returns that rate\n * - If date is a weekend/holiday (no data), returns most recent prior trading day's rate\n * - If date is before data range, returns earliest available rate\n * - If date is after data range, returns latest available rate\n *\n * @param date - The date to look up the rate for\n * @returns Annual risk-free rate as a percentage (e.g., 4.32 for 4.32%)\n */\nexport function getRiskFreeRate(date: Date): number {\n const keys = getSortedKeys();\n const dateKey = formatDateToKey(date);\n\n // Direct lookup first (most common case for trading days)\n if (active.treasury[dateKey] !== undefined) {\n return active.treasury[dateKey];\n }\n\n // Date is before our data range - return earliest rate\n if (dateKey < keys[0]) {\n return active.treasury[keys[0]];\n }\n\n // Date is after our data range - return latest rate\n if (dateKey > keys[keys.length - 1]) {\n return active.treasury[keys[keys.length - 1]];\n }\n\n // Date is within range but not found (weekend/holiday)\n // Binary search to find the nearest prior trading day\n let left = 0;\n let right = keys.length - 1;\n\n while (left < right) {\n const mid = Math.floor((left + right + 1) / 2);\n if (keys[mid] <= dateKey) {\n left = mid;\n } else {\n right = mid - 1;\n }\n }\n\n // Return the rate from the most recent prior trading day\n return active.treasury[keys[left]];\n}\n\nfunction getSortedSofrKeys(): string[] {\n if (!active.sofrKeys) {\n active.sofrKeys = Object.keys(active.sofr).sort();\n }\n return active.sofrKeys;\n}\n\nfunction resolveRateByKey(\n rates: Readonly<Record<string, number>>,\n keys: readonly string[],\n requestedDate: string,\n): ResolvedRateByKey {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(requestedDate)) {\n throw new TypeError(`Rate date must be YYYY-MM-DD: ${JSON.stringify(requestedDate)}`);\n }\n let effectiveDate: string;\n let resolution: RateResolution;\n if (rates[requestedDate] !== undefined) {\n effectiveDate = requestedDate;\n resolution = \"exact\";\n } else if (requestedDate < keys[0]) {\n effectiveDate = keys[0];\n resolution = \"clamped-earliest\";\n } else if (requestedDate > keys[keys.length - 1]) {\n effectiveDate = keys[keys.length - 1];\n resolution = \"stale-after-latest\";\n } else {\n let left = 0;\n let right = keys.length - 1;\n while (left < right) {\n const mid = Math.floor((left + right + 1) / 2);\n if (keys[mid] <= requestedDate) left = mid;\n else right = mid - 1;\n }\n effectiveDate = keys[left];\n resolution = \"prior\";\n }\n const annualRateBasisPoints = Math.round(rates[effectiveDate] * 100);\n if (\n !Number.isSafeInteger(annualRateBasisPoints) ||\n annualRateBasisPoints / 100 !== rates[effectiveDate]\n ) {\n throw new Error(`Rate table value is not exact to one basis point: ${effectiveDate}`);\n }\n return { requestedDate, effectiveDate, annualRateBasisPoints, resolution };\n}\n\n/** Resolve SOFR with explicit prior-day and stale-tail semantics. */\nexport function resolveSofrRateByKey(dateKey: string): ResolvedRateByKey {\n return resolveRateByKey(active.sofr, getSortedSofrKeys(), dateKey);\n}\n\n/** Resolve the 3-month Treasury rate with explicit prior-day and stale-tail semantics. */\nexport function resolveTreasuryRateByKey(dateKey: string): ResolvedRateByKey {\n return resolveRateByKey(active.treasury, getSortedKeys(), dateKey);\n}\n\n/**\n * Get the SOFR overnight rate for a date specified as a YYYY-MM-DD string key.\n *\n * Behavior mirrors getRiskFreeRateByKey: exact lookup, then nearest prior\n * trading day via binary search, with edge-clamping to the available range.\n *\n * Use this when computing option greeks under the SOFR + q=0 convention.\n * Use getRiskFreeRateByKey instead for portfolio Sharpe/Sortino calculations.\n *\n * @param dateKey - The date as YYYY-MM-DD string\n * @returns Annual SOFR rate as a percentage (e.g., 3.60 for 3.60%)\n */\nexport function getSofrRateByKey(dateKey: string): number {\n return resolveSofrRateByKey(dateKey).annualRateBasisPoints / 100;\n}\n\n/**\n * Get the earliest date that has rate data available.\n *\n * @returns Date object for the first available rate date\n */\nexport function getEarliestRateDate(): Date {\n const keys = getSortedKeys();\n return parseKeyToDate(keys[0]);\n}\n\n/**\n * Get the latest date that has rate data available.\n *\n * @returns Date object for the last available rate date\n */\nexport function getLatestRateDate(): Date {\n const keys = getSortedKeys();\n return parseKeyToDate(keys[keys.length - 1]);\n}\n\n/**\n * Get the date range of available rate data.\n *\n * @returns Object with start and end dates\n */\nexport function getRateDataRange(): { start: Date; end: Date } {\n return {\n start: getEarliestRateDate(),\n end: getLatestRateDate(),\n };\n}\n\n/**\n * Get the total number of rate entries in the dataset.\n * Useful for data validation and reporting.\n *\n * @returns Number of daily rate entries\n */\nexport function getRateEntryCount(): number {\n return getSortedKeys().length;\n}\n\n/**\n * Get the risk-free rate for a date specified as a YYYY-MM-DD string key.\n * Avoids Date parsing issues by working directly with string keys.\n *\n * @param dateKey - The date as YYYY-MM-DD string\n * @returns Annual risk-free rate as a percentage (e.g., 4.32 for 4.32%)\n */\nexport function getRiskFreeRateByKey(dateKey: string): number {\n return resolveTreasuryRateByKey(dateKey).annualRateBasisPoints / 100;\n}\n","/**\n * Performance Snapshot Cache\n *\n * Caches pre-calculated performance snapshots in IndexedDB\n * to avoid expensive recalculation on every page load.\n */\n\nimport type { PortfolioStats } from \"../models/portfolio-stats.ts\";\nimport type { Trade } from \"../models/trade.ts\";\nimport type { DailyLogEntry } from \"../models/daily-log.ts\";\nimport type { SnapshotChartData } from \"../services/performance-snapshot.ts\";\nimport type { MFEMAEDataPoint } from \"../calculations/mfe-mae.ts\";\nimport { promisifyRequest, STORES, withReadTransaction, withWriteTransaction } from \"./index.ts\";\nimport { getEffectiveRateDate } from \"../utils/risk-free-rate.ts\";\nimport {\n DATED_ROW_DAY_FIELDS,\n decodeCalendarDays,\n encodeCalendarDays,\n type StoredCalendarDays,\n TRADE_DAY_FIELDS,\n type TradeDayField,\n} from \"./calendar-days.ts\";\n\n/**\n * Cache entry for performance snapshot\n */\ninterface PerformanceSnapshotCache {\n id: string; // Format: `performance_snapshot_v4_${blockId}`\n blockId: string;\n calculationType: \"performance_snapshot\";\n portfolioStats: PortfolioStats;\n chartData: Omit<SnapshotChartData, \"mfeMaeData\"> & {\n mfeMaeData: StoredCalendarDays<MFEMAEDataPoint, \"date\">[];\n };\n filteredTrades: StoredCalendarDays<Trade, TradeDayField>[];\n filteredDailyLogs: StoredCalendarDays<DailyLogEntry, \"date\">[];\n calculatedAt: Date;\n riskFreeRatesThrough: string;\n}\n\n/**\n * Public interface for cached snapshot data\n */\nexport interface CachedPerformanceSnapshot {\n portfolioStats: PortfolioStats;\n chartData: SnapshotChartData;\n filteredTrades: Trade[];\n filteredDailyLogs: DailyLogEntry[];\n calculatedAt: Date;\n}\n\n/**\n * Generate the cache ID for a block\n */\nfunction getCacheId(blockId: string): string {\n return `performance_snapshot_v4_${blockId}`;\n}\n\n/**\n * Store pre-calculated performance snapshot for a block\n */\nexport async function storePerformanceSnapshotCache(\n blockId: string,\n snapshot: {\n portfolioStats: PortfolioStats;\n chartData: SnapshotChartData;\n filteredTrades: Trade[];\n filteredDailyLogs: DailyLogEntry[];\n },\n): Promise<void> {\n const cacheEntry: PerformanceSnapshotCache = {\n id: getCacheId(blockId),\n blockId,\n calculationType: \"performance_snapshot\",\n portfolioStats: snapshot.portfolioStats,\n chartData: {\n ...snapshot.chartData,\n mfeMaeData: snapshot.chartData.mfeMaeData.map((point) =>\n encodeCalendarDays(point, DATED_ROW_DAY_FIELDS),\n ),\n },\n filteredTrades: snapshot.filteredTrades.map((trade) =>\n encodeCalendarDays(trade, TRADE_DAY_FIELDS),\n ),\n filteredDailyLogs: snapshot.filteredDailyLogs.map((log) =>\n encodeCalendarDays(log, DATED_ROW_DAY_FIELDS),\n ),\n calculatedAt: new Date(),\n riskFreeRatesThrough: getEffectiveRateDate(\"DTB3\"),\n };\n\n await withWriteTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n await promisifyRequest(store.put(cacheEntry));\n });\n}\n\n/**\n * Get cached performance snapshot for a block\n * Returns null if cache doesn't exist\n */\nexport async function getPerformanceSnapshotCache(\n blockId: string,\n): Promise<CachedPerformanceSnapshot | null> {\n return withReadTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n const cacheId = getCacheId(blockId);\n const result = await promisifyRequest(store.get(cacheId));\n\n if (!result || result.calculationType !== \"performance_snapshot\") {\n return null;\n }\n\n const cache = result as PerformanceSnapshotCache;\n if (cache.riskFreeRatesThrough !== getEffectiveRateDate(\"DTB3\")) return null;\n\n return {\n portfolioStats: cache.portfolioStats,\n chartData: {\n ...cache.chartData,\n mfeMaeData: cache.chartData.mfeMaeData.map((point) =>\n decodeCalendarDays<MFEMAEDataPoint, \"date\">(point, DATED_ROW_DAY_FIELDS),\n ),\n },\n filteredTrades: cache.filteredTrades.map((trade) =>\n decodeCalendarDays<Trade, TradeDayField>(trade, TRADE_DAY_FIELDS),\n ),\n filteredDailyLogs: cache.filteredDailyLogs.map((log) =>\n decodeCalendarDays<DailyLogEntry, \"date\">(log, DATED_ROW_DAY_FIELDS),\n ),\n calculatedAt: new Date(cache.calculatedAt),\n };\n });\n}\n\n/**\n * Delete cached performance snapshot for a block\n */\nexport async function deletePerformanceSnapshotCache(blockId: string): Promise<void> {\n await withWriteTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n const cacheId = getCacheId(blockId);\n\n // Check if entry exists before trying to delete\n const existing = await promisifyRequest(store.get(cacheId));\n if (existing) {\n await promisifyRequest(store.delete(cacheId));\n }\n });\n}\n\n/**\n * Check if performance snapshot cache exists for a block\n */\nexport async function hasPerformanceSnapshotCache(blockId: string): Promise<boolean> {\n return withReadTransaction(STORES.CALCULATIONS, async (transaction) => {\n const store = transaction.objectStore(STORES.CALCULATIONS);\n const cacheId = getCacheId(blockId);\n const result = await promisifyRequest(store.get(cacheId));\n return result?.calculationType === \"performance_snapshot\";\n });\n}\n","/**\n * Trades Store - CRUD operations for trade data\n */\n\nimport type { Trade } from \"../models/trade.ts\";\nimport { combineAllLegGroups, type CombinedTrade } from \"../utils/combine-leg-groups.ts\";\nimport {\n INDEXES,\n promisifyRequest,\n STORES,\n withReadTransaction,\n withWriteTransaction,\n} from \"./index.ts\";\nimport {\n deleteCombinedTradesCache,\n getCombinedTradesCache,\n storeCombinedTradesCache,\n} from \"./combined-trades-cache.ts\";\nimport { deletePerformanceSnapshotCache } from \"./performance-snapshot-cache.ts\";\nimport { clearUnverifiedCalendarDays } from \"./blocks-store.ts\";\nimport {\n decodeCalendarDays,\n encodeCalendarDay,\n encodeCalendarDays,\n type StoredCalendarDays,\n TRADE_DAY_FIELDS,\n type TradeDayField,\n} from \"./calendar-days.ts\";\n\n// Track in-flight combined cache writes to avoid redundant work when multiple callers miss the cache simultaneously.\nconst combinedCacheInflight = new Map<string, Promise<void>>();\n\n/**\n * Extended trade with block association\n */\nexport interface StoredTrade extends Trade {\n blockId: string;\n id?: number; // Auto-generated by IndexedDB\n}\n\ntype PersistedTrade = StoredCalendarDays<StoredTrade, TradeDayField>;\n\nconst fromPersisted = (trades: PersistedTrade[]): StoredTrade[] =>\n trades.map((trade) => decodeCalendarDays<StoredTrade, TradeDayField>(trade, TRADE_DAY_FIELDS));\n\n/**\n * Add trades for a block (batch operation)\n */\nexport async function addTrades(blockId: string, trades: Trade[]): Promise<void> {\n if (trades.length === 0) return;\n\n await withWriteTransaction(STORES.TRADES, async (transaction) => {\n const store = transaction.objectStore(STORES.TRADES);\n\n // Use Promise.all for better performance with large datasets\n const promises = trades.map((trade) =>\n promisifyRequest(store.add(encodeCalendarDays({ ...trade, blockId }, TRADE_DAY_FIELDS))),\n );\n\n await Promise.all(promises);\n });\n\n // Invalidate caches since trades changed\n await deleteCombinedTradesCache(blockId);\n await deletePerformanceSnapshotCache(blockId);\n}\n\n/**\n * Get all trades for a block\n */\nexport async function getTradesByBlock(blockId: string): Promise<StoredTrade[]> {\n return withReadTransaction(STORES.TRADES, async (transaction) => {\n const store = transaction.objectStore(STORES.TRADES);\n const index = store.index(INDEXES.TRADES_BY_BLOCK);\n const result: PersistedTrade[] = await promisifyRequest(index.getAll(blockId));\n\n // Chronological order: `YYYY-MM-DD` days sort as text, then by time opened.\n result.sort((a, b) => {\n if (a.dateOpened !== b.dateOpened) return a.dateOpened < b.dateOpened ? -1 : 1;\n return a.timeOpened.localeCompare(b.timeOpened);\n });\n return fromPersisted(result);\n });\n}\n\n/**\n * Get all trades for a block with optional leg group combining\n *\n * Uses cached combined trades when available for better performance.\n * Falls back to on-demand calculation if cache is missing.\n *\n * @param blockId - Block ID to fetch trades for\n * @param options.combineLegGroups - Whether to combine trades with same entry timestamp\n * @param options.skipCache - Force recalculation (bypass cache)\n * @returns Array of trades (combined or raw)\n */\nexport async function getTradesByBlockWithOptions(\n blockId: string,\n options: { combineLegGroups?: boolean; skipCache?: boolean } = {},\n): Promise<(StoredTrade | (CombinedTrade & { blockId: string }))[]> {\n // If combining is enabled, check cache FIRST before fetching raw trades\n // This avoids the expensive raw trade fetch when we have cached data\n if (options.combineLegGroups && !options.skipCache) {\n const cachedTrades = await getCombinedTradesCache(blockId);\n if (cachedTrades) {\n // Add blockId back to cached trades\n return cachedTrades.map((trade) => ({ ...trade, blockId }));\n }\n }\n\n // Fetch raw trades (only if not combining, or cache miss)\n const trades = await getTradesByBlock(blockId);\n\n if (!options.combineLegGroups) {\n return trades;\n }\n\n // Cache miss: calculate combined trades on-demand\n const tradesWithoutBlockId = trades.map((storedTrade) => {\n const { blockId: _ignored, ...trade } = storedTrade;\n void _ignored;\n return trade as Trade;\n });\n const combined = combineAllLegGroups(tradesWithoutBlockId);\n\n queueCombinedTradesCache(blockId, combined);\n\n // Add blockId back to combined trades\n return combined.map((trade) => ({ ...trade, blockId }));\n}\n\nfunction queueCombinedTradesCache(blockId: string, combinedTrades: CombinedTrade[]) {\n if (combinedCacheInflight.has(blockId)) {\n return;\n }\n\n const task = storeCombinedTradesCache(blockId, combinedTrades)\n .catch((err) => {\n console.warn(\"Failed to cache combined trades:\", err);\n })\n .finally(() => {\n combinedCacheInflight.delete(blockId);\n });\n\n combinedCacheInflight.set(blockId, task);\n}\n\n/**\n * Get trades opened on the calendar days from `startDate` through `endDate` (inclusive)\n */\nexport async function getTradesByDateRange(\n blockId: string,\n startDate: Date,\n endDate: Date,\n): Promise<StoredTrade[]> {\n return withReadTransaction(STORES.TRADES, async (transaction) => {\n const store = transaction.objectStore(STORES.TRADES);\n const index = store.index(\"composite_block_date\");\n\n const range = IDBKeyRange.bound(\n [blockId, encodeCalendarDay(startDate)],\n [blockId, encodeCalendarDay(endDate)],\n );\n return fromPersisted(await promisifyRequest(index.getAll(range)));\n });\n}\n\n/**\n * Get trades by strategy for a block\n */\nexport async function getTradesByStrategy(\n blockId: string,\n strategy: string,\n): Promise<StoredTrade[]> {\n return withReadTransaction(STORES.TRADES, async (transaction) => {\n const store = transaction.objectStore(STORES.TRADES);\n const blockIndex = store.index(INDEXES.TRADES_BY_BLOCK);\n const blockTrades: PersistedTrade[] = await promisifyRequest(blockIndex.getAll(blockId));\n\n // Filter by strategy (IndexedDB doesn't support compound queries easily)\n return fromPersisted(blockTrades.filter((trade) => trade.strategy === strategy));\n });\n}\n\n/**\n * Get unique strategies for a block\n */\nexport async function getStrategiesByBlock(blockId: string): Promise<string[]> {\n const trades = await getTradesByBlock(blockId);\n const strategies = new Set(trades.map((trade) => trade.strategy));\n return Array.from(strategies).sort();\n}\n\n/**\n * Get trade count by block\n */\nexport async function getTradeCountByBlock(blockId: string): Promise<number> {\n return withReadTransaction(STORES.TRADES, async (transaction) => {\n const store = transaction.objectStore(STORES.TRADES);\n const index = store.index(INDEXES.TRADES_BY_BLOCK);\n const result = await promisifyRequest(index.count(blockId));\n return result;\n });\n}\n\n/**\n * Delete all trades for a block\n */\nexport async function deleteTradesByBlock(blockId: string): Promise<void> {\n await withWriteTransaction([STORES.TRADES, STORES.BLOCKS], async (transaction) => {\n const store = transaction.objectStore(STORES.TRADES);\n const index = store.index(INDEXES.TRADES_BY_BLOCK);\n const request = index.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n request.onerror = () => reject(request.error);\n });\n await clearUnverifiedCalendarDays(transaction, blockId, STORES.TRADES);\n });\n\n // Invalidate caches since trades changed\n await deleteCombinedTradesCache(blockId);\n await deletePerformanceSnapshotCache(blockId);\n}\n\n/**\n * Update trades for a block (replace all)\n */\nexport async function updateTradesForBlock(blockId: string, trades: Trade[]): Promise<void> {\n await withWriteTransaction([STORES.TRADES, STORES.BLOCKS], async (transaction) => {\n // First delete existing trades\n const store = transaction.objectStore(STORES.TRADES);\n const index = store.index(INDEXES.TRADES_BY_BLOCK);\n const deleteRequest = index.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n deleteRequest.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n deleteRequest.onerror = () => reject(deleteRequest.error);\n });\n\n // Then add new trades\n const promises = trades.map((trade) =>\n promisifyRequest(store.add(encodeCalendarDays({ ...trade, blockId }, TRADE_DAY_FIELDS))),\n );\n\n await Promise.all(promises);\n await clearUnverifiedCalendarDays(transaction, blockId, STORES.TRADES);\n });\n\n // Invalidate caches since trades changed\n await deleteCombinedTradesCache(blockId);\n await deletePerformanceSnapshotCache(blockId);\n}\n\n/**\n * Get trade statistics for a block (aggregated)\n */\nexport async function getTradeStatistics(blockId: string): Promise<{\n totalTrades: number;\n totalPl: number;\n winningTrades: number;\n losingTrades: number;\n totalCommissions: number;\n dateRange: { start: Date | null; end: Date | null };\n strategies: string[];\n}> {\n const trades = await getTradesByBlock(blockId);\n\n if (trades.length === 0) {\n return {\n totalTrades: 0,\n totalPl: 0,\n winningTrades: 0,\n losingTrades: 0,\n totalCommissions: 0,\n dateRange: { start: null, end: null },\n strategies: [],\n };\n }\n\n const totalTrades = trades.length;\n const totalPl = trades.reduce((sum, trade) => sum + trade.pl, 0);\n const winningTrades = trades.filter((trade) => trade.pl > 0).length;\n const losingTrades = trades.filter((trade) => trade.pl < 0).length;\n const totalCommissions = trades.reduce(\n (sum, trade) => sum + trade.openingCommissionsFees + trade.closingCommissionsFees,\n 0,\n );\n\n // Get date range\n const dates = trades.map((trade) => new Date(trade.dateOpened));\n const start = new Date(Math.min(...dates.map((d) => d.getTime())));\n const end = new Date(Math.max(...dates.map((d) => d.getTime())));\n\n // Get unique strategies\n const strategies = Array.from(new Set(trades.map((trade) => trade.strategy))).sort();\n\n return {\n totalTrades,\n totalPl,\n winningTrades,\n losingTrades,\n totalCommissions,\n dateRange: { start, end },\n strategies,\n };\n}\n\n/**\n * Search trades by text (strategy, legs, reason for close)\n */\nexport async function searchTrades(blockId: string, query: string): Promise<StoredTrade[]> {\n const trades = await getTradesByBlock(blockId);\n const lowerQuery = query.toLowerCase();\n\n return trades.filter(\n (trade) =>\n trade.strategy.toLowerCase().includes(lowerQuery) ||\n trade.legs.toLowerCase().includes(lowerQuery) ||\n (trade.reasonForClose && trade.reasonForClose.toLowerCase().includes(lowerQuery)),\n );\n}\n\n/**\n * Get trades with pagination\n */\nexport async function getTradesPage(\n blockId: string,\n offset: number,\n limit: number,\n): Promise<{ trades: StoredTrade[]; total: number }> {\n const allTrades = await getTradesByBlock(blockId);\n const total = allTrades.length;\n const trades = allTrades.slice(offset, offset + limit);\n\n return { trades, total };\n}\n","import type { Trade } from \"../models/trade.ts\";\n\nexport const MIN_TRADES_PER_YEAR = 10;\nconst MS_PER_DAY = 1000 * 60 * 60 * 24;\n\n/**\n * Estimate annual trade frequency from a sample of trades.\n *\n * Ensures realistic pacing for strategy-filtered simulations where the global\n * portfolio frequency would otherwise overstate the number of opportunities.\n */\nexport function estimateTradesPerYear(sampleTrades: Trade[], fallback: number): number {\n if (sampleTrades.length < 2) {\n return Math.max(MIN_TRADES_PER_YEAR, fallback);\n }\n\n const sortedTrades = [...sampleTrades].sort(\n (a, b) => a.dateOpened.getTime() - b.dateOpened.getTime(),\n );\n\n const firstDate = sortedTrades[0].dateOpened;\n const lastDate = sortedTrades[sortedTrades.length - 1].dateOpened;\n const daysElapsed = (lastDate.getTime() - firstDate.getTime()) / MS_PER_DAY;\n\n if (daysElapsed <= 0) {\n return Math.max(MIN_TRADES_PER_YEAR, fallback);\n }\n\n const yearsElapsed = daysElapsed / 365.25;\n if (yearsElapsed < 0.01) {\n return Math.max(MIN_TRADES_PER_YEAR, fallback);\n }\n\n const computed = Math.round(sampleTrades.length / yearsElapsed);\n return Math.max(MIN_TRADES_PER_YEAR, computed);\n}\n","/**\n * Bounded full-day XNYS session calendar used by the market-data provenance\n * authority. Early closes remain sessions: this calendar answers only whether\n * a complete daily partition is expected for a date.\n *\n * The revision changes whenever supported bounds or closure semantics change.\n */\nexport const XNYS_SESSION_CALENDAR_REVISION = \"xnys-full-day-2022-2030-v1\" as const;\nexport const XNYS_SESSION_CALENDAR_SUPPORTED_FROM = \"2022-01-01\" as const;\nexport const XNYS_SESSION_CALENDAR_SUPPORTED_THROUGH = \"2030-12-31\" as const;\n\nconst ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}$/;\nconst MS_PER_DAY = 24 * 60 * 60 * 1_000;\n\n/** Non-recurring full-day XNYS closures inside this calendar revision. */\nconst SPECIAL_CLOSURES = new Set([\"2025-01-09\"]);\n\nfunction isoDate(date: Date): string {\n return date.toISOString().slice(0, 10);\n}\n\nfunction utcDate(year: number, monthIndex: number, day: number): Date {\n return new Date(Date.UTC(year, monthIndex, day));\n}\n\nfunction parseSupportedDate(value: string, label: string): Date {\n if (!ISO_DATE_RE.test(value)) {\n throw new TypeError(\n `${label} must be an ISO calendar date (YYYY-MM-DD): ${JSON.stringify(value)}`,\n );\n }\n const parsed = new Date(`${value}T00:00:00.000Z`);\n if (!Number.isFinite(parsed.getTime()) || isoDate(parsed) !== value) {\n throw new TypeError(`${label} is not a real calendar date: ${JSON.stringify(value)}`);\n }\n if (\n value < XNYS_SESSION_CALENDAR_SUPPORTED_FROM ||\n value > XNYS_SESSION_CALENDAR_SUPPORTED_THROUGH\n ) {\n throw new RangeError(\n `${label} ${JSON.stringify(value)} is outside XNYS calendar revision ${XNYS_SESSION_CALENDAR_REVISION} ` +\n `[${XNYS_SESSION_CALENDAR_SUPPORTED_FROM}, ${XNYS_SESSION_CALENDAR_SUPPORTED_THROUGH}]`,\n );\n }\n return parsed;\n}\n\nfunction nthWeekdayOfMonth(\n year: number,\n monthIndex: number,\n weekday: number,\n occurrence: number,\n): Date {\n const first = utcDate(year, monthIndex, 1);\n const offset = (weekday - first.getUTCDay() + 7) % 7;\n return utcDate(year, monthIndex, 1 + offset + (occurrence - 1) * 7);\n}\n\nfunction lastWeekdayOfMonth(year: number, monthIndex: number, weekday: number): Date {\n const last = utcDate(year, monthIndex + 1, 0);\n const offset = (last.getUTCDay() - weekday + 7) % 7;\n return utcDate(year, monthIndex, last.getUTCDate() - offset);\n}\n\n/** Meeus/Jones/Butcher Gregorian Easter calculation. */\nfunction easterSunday(year: number): Date {\n const a = year % 19;\n const b = Math.floor(year / 100);\n const c = year % 100;\n const d = Math.floor(b / 4);\n const e = b % 4;\n const f = Math.floor((b + 8) / 25);\n const g = Math.floor((b - f + 1) / 3);\n const h = (19 * a + b - d - g + 15) % 30;\n const i = Math.floor(c / 4);\n const k = c % 4;\n const l = (32 + 2 * e + 2 * i - h - k) % 7;\n const m = Math.floor((a + 11 * h + 22 * l) / 451);\n const month = Math.floor((h + l - 7 * m + 114) / 31);\n const day = ((h + l - 7 * m + 114) % 31) + 1;\n return utcDate(year, month - 1, day);\n}\n\nfunction addDays(date: Date, days: number): Date {\n return new Date(date.getTime() + days * MS_PER_DAY);\n}\n\nfunction observedFixedHoliday(year: number, monthIndex: number, day: number): Date {\n const holiday = utcDate(year, monthIndex, day);\n if (holiday.getUTCDay() === 6) return addDays(holiday, -1);\n if (holiday.getUTCDay() === 0) return addDays(holiday, 1);\n return holiday;\n}\n\nfunction addNewYearsClosure(closures: Set<string>, holidayYear: number): void {\n const holiday = utcDate(holidayYear, 0, 1);\n if (holiday.getUTCDay() === 6) {\n // XNYS does not observe a Saturday January 1 on the preceding Friday.\n // This exception keeps year-end accounting open (for example 2027-12-31).\n return;\n }\n closures.add(isoDate(holiday.getUTCDay() === 0 ? addDays(holiday, 1) : holiday));\n}\n\nfunction holidayClosures(year: number): ReadonlySet<string> {\n const closures = new Set<string>();\n const add = (date: Date): void => {\n closures.add(isoDate(date));\n };\n\n // Include both holiday years so an observation that crosses into this\n // calendar year cannot escape the year-local closure set.\n addNewYearsClosure(closures, year);\n addNewYearsClosure(closures, year + 1);\n add(nthWeekdayOfMonth(year, 0, 1, 3)); // Martin Luther King Jr. Day\n add(nthWeekdayOfMonth(year, 1, 1, 3)); // Washington's Birthday\n add(addDays(easterSunday(year), -2)); // Good Friday\n add(lastWeekdayOfMonth(year, 4, 1)); // Memorial Day\n add(observedFixedHoliday(year, 5, 19)); // Juneteenth\n add(observedFixedHoliday(year, 6, 4)); // Independence Day\n add(nthWeekdayOfMonth(year, 8, 1, 1)); // Labor Day\n add(nthWeekdayOfMonth(year, 10, 4, 4)); // Thanksgiving Day\n add(observedFixedHoliday(year, 11, 25)); // Christmas Day\n\n for (const date of SPECIAL_CLOSURES) {\n if (date.startsWith(`${year}-`)) closures.add(date);\n }\n return closures;\n}\n\nconst CLOSURES_BY_YEAR = new Map<number, ReadonlySet<string>>();\n\nfunction closuresForYear(year: number): ReadonlySet<string> {\n let closures = CLOSURES_BY_YEAR.get(year);\n if (!closures) {\n closures = holidayClosures(year);\n CLOSURES_BY_YEAR.set(year, closures);\n }\n return closures;\n}\n\n/**\n * Return whether a supported calendar date is a full XNYS market session.\n * Invalid or unsupported dates throw so provenance completeness cannot turn an\n * unknown date into a presumed non-session.\n */\nexport function isXnysSessionDate(value: string): boolean {\n const date = parseSupportedDate(value, \"XNYS session date\");\n const weekday = date.getUTCDay();\n if (weekday === 0 || weekday === 6) return false;\n return !closuresForYear(date.getUTCFullYear()).has(value);\n}\n/** Equity early closes are 13:00 ET; full-day closures are never early sessions. */\nexport function isEarlyCloseSession(value: string): boolean {\n if (!isXnysSessionDate(value)) return false;\n const date = new Date(`${value}T12:00:00Z`);\n const year = date.getUTCFullYear();\n const month = date.getUTCMonth();\n const day = date.getUTCDate();\n if ((month === 6 && day === 3) || (month === 11 && day === 24)) return true;\n return value === isoDate(addDays(nthWeekdayOfMonth(year, 10, 4, 4), 1));\n}\n\n/** Deterministically enumerate XNYS sessions in the inclusive supported range. */\nexport function enumerateXnysSessions(from: string, through: string): readonly string[] {\n const first = parseSupportedDate(from, \"XNYS session range from\");\n const last = parseSupportedDate(through, \"XNYS session range through\");\n if (first.getTime() > last.getTime()) {\n throw new RangeError(\n `XNYS session range from ${JSON.stringify(from)} exceeds through ${JSON.stringify(through)}`,\n );\n }\n\n const sessions: string[] = [];\n for (let cursor = first; cursor.getTime() <= last.getTime(); cursor = addDays(cursor, 1)) {\n const date = isoDate(cursor);\n if (isXnysSessionDate(date)) sessions.push(date);\n }\n return Object.freeze(sessions);\n}\n","/**\n * IndexedDB Database Service for TradeBlocks\n *\n * Manages the client-side database for storing blocks, trades, and daily logs.\n * Uses a versioned schema with migration support.\n */\n\nimport type { ProcessedBlock } from \"../models/block.ts\";\nimport {\n DATED_ROW_DAY_FIELDS,\n encodeCalendarDay,\n isDate,\n recoverCalendarDay,\n TRADE_DAY_FIELDS,\n} from \"./calendar-days.ts\";\n\n// Database configuration\nexport const DB_NAME = \"TradeBlocksDB\";\nexport const DB_VERSION = 7;\n\n// Object store names\nexport const STORES = {\n BLOCKS: \"blocks\",\n TRADES: \"trades\",\n DAILY_LOGS: \"dailyLogs\",\n CALCULATIONS: \"calculations\",\n REPORTING_LOGS: \"reportingLogs\",\n WALK_FORWARD: \"walkForwardAnalyses\",\n STATIC_DATASETS: \"staticDatasets\",\n STATIC_DATASET_ROWS: \"staticDatasetRows\",\n PUBLISHED_RATES: \"publishedRates\",\n} as const;\n\n// Index names\nexport const INDEXES = {\n TRADES_BY_BLOCK: \"blockId\",\n TRADES_BY_DATE: \"dateOpened\",\n TRADES_BY_STRATEGY: \"strategy\",\n DAILY_LOGS_BY_BLOCK: \"blockId\",\n DAILY_LOGS_BY_DATE: \"date\",\n CALCULATIONS_BY_BLOCK: \"blockId\",\n REPORTING_LOGS_BY_BLOCK: \"blockId\",\n REPORTING_LOGS_BY_STRATEGY: \"strategy\",\n WALK_FORWARD_BY_BLOCK: \"blockId\",\n STATIC_DATASET_ROWS_BY_DATASET: \"datasetId\",\n STATIC_DATASET_ROWS_BY_TIMESTAMP: \"timestamp\",\n} as const;\n\n/**\n * Database instance singleton\n */\nlet dbInstance: IDBDatabase | null = null;\n\ntype UnverifiedCalendarDays = NonNullable<ProcessedBlock[\"unverifiedCalendarDays\"]>;\n\n/** Calculation caches whose rows carry calendar days; rebuilt from the upgraded records. */\nconst DATED_CALCULATION_TYPES: Record<string, true> = {\n combined_trades: true,\n enriched_trades: true,\n performance_snapshot: true,\n};\n\n/**\n * v5 divided \"cents\"-tagged premiums by 100, then applied its option-multiplier heuristic to\n * every record. Rescale each premium so existing blocks keep the totals v5 displayed.\n */\nfunction rescaleLegacyPremium(trade: Record<string, unknown>): boolean {\n let changed = Object.hasOwn(trade, \"premiumPrecision\");\n if (typeof trade.premium === \"number\" && isFinite(trade.premium)) {\n const cents = trade.premiumPrecision === \"cents\";\n const count =\n typeof trade.numContracts === \"number\" && isFinite(trade.numContracts)\n ? Math.abs(trade.numContracts)\n : 0;\n const contracts = count > 0 ? count : 1;\n const total = (Math.abs(trade.premium) / (cents ? 100 : 1)) * contracts;\n const margin =\n typeof trade.marginReq === \"number\" && isFinite(trade.marginReq)\n ? Math.abs(trade.marginReq)\n : 0;\n const multiplied =\n isFinite(total) &&\n total > 0 &&\n (margin > 0 ? total / margin > 0 && total / margin < 0.5 : total < 5000);\n if (cents && !multiplied) {\n trade.premium /= 100;\n changed = true;\n } else if (!cents && multiplied) {\n trade.premium *= 100;\n changed = true;\n }\n }\n if (changed) delete trade.premiumPrecision;\n return changed;\n}\n\n/**\n * The CSV cell each reporting-log day was parsed from. Option Omega strategy logs write\n * `Date Opened` with a time (`2025-05-30T10:15:40.546199`); the importer parsed that as an\n * instant, but the cell's `YYYY-MM-DD` prefix is the exact day. Rows imported since v3.2.0 keep\n * their cells in `sourceFields`.\n */\nconst REPORTING_SOURCE_CELLS: Record<string, string> = {\n dateOpened: \"Date Opened\",\n dateClosed: \"Date Closed\",\n};\n\n/**\n * A day with an optional clock time (hours 00-23) and no time zone. A cell with `Z` or an offset\n * was read as that instant, so its prefix is not necessarily the day the user saw; `T24:00` was\n * read as the next day's midnight.\n */\nconst ZONELESS_SOURCE_DAY =\n /^(\\d{4}-\\d{2}-\\d{2})(?:[T ](?:[01]?\\d|2[0-3]):\\d{2}(?::\\d{2}(?:\\.\\d+)?)?)?$/;\n\n/** A cell with a time after its day, or any clock time: the instant parsed from it is no midnight. */\nconst TIMED_SOURCE_CELL = /^\\d{4}-\\d{2}-\\d{2}[T ]|\\d:\\d{2}/;\n\n/**\n * What a saved source cell proves about its day: the exact day of a zone-less cell naming a real\n * day (`2025-02-30` is none); `\"timed\"` for any other cell that carried a time, since its stored\n * instant is known not to be a midnight; otherwise `undefined` (no cell, or a whole-day cell\n * that names no real day).\n */\nfunction sourceCellDay(cell: unknown): string | \"timed\" | undefined {\n if (typeof cell !== \"string\") return undefined;\n const text = cell.trim();\n const day = ZONELESS_SOURCE_DAY.exec(text)?.[1];\n const parsed = day ? new Date(`${day}T00:00:00Z`) : undefined;\n if (day && parsed && !Number.isNaN(parsed.getTime()) && parsed.toISOString().startsWith(day)) {\n return day;\n }\n return TIMED_SOURCE_CELL.test(text) ? \"timed\" : undefined;\n}\n\n/**\n * Rewrite pre-v7 `Date` calendar days as `YYYY-MM-DD`. The day comes from the record's saved\n * zone-less source cell when it has one; a saved cell that carried a time but proves no day leaves\n * the day unproven; otherwise the day comes from `recoverCalendarDay`. An unproven day keeps the\n * local day this browser shows and is returned in `unproven`. Strings are skipped, so a repeated\n * pass changes nothing.\n */\nfunction storeCalendarDays(\n record: Record<string, unknown>,\n fields: readonly string[],\n sourceCells: Record<string, string> = {},\n): { changed: boolean; unproven: number } {\n const source = record.sourceFields as Record<string, unknown> | undefined;\n let changed = false;\n let unproven = 0;\n for (const field of fields) {\n const value = record[field];\n if (!isDate(value)) continue;\n const fromCell = sourceCellDay(sourceCells[field] ? source?.[sourceCells[field]] : undefined);\n const day = fromCell === \"timed\" ? null : (fromCell ?? recoverCalendarDay(value));\n if (day === null) unproven++;\n record[field] = day ?? encodeCalendarDay(value);\n changed = true;\n }\n return { changed, unproven };\n}\n\n/**\n * Upgrade existing records in the version-change transaction: one cursor pass per store, since two\n * cursors updating the same record would overwrite each other. Blocks are visited after the data\n * stores so they can record their unverified-day counts. Any failure aborts the transaction, which\n * leaves the database at its previous version.\n */\nfunction upgradeStoredRecords(transaction: IDBTransaction, oldVersion: number): void {\n const unverified = new Map<string, UnverifiedCalendarDays>();\n\n const eachRecord = (\n storeName: string,\n visit: (cursor: IDBCursorWithValue) => void,\n done?: () => void,\n ) => {\n const request = transaction.objectStore(storeName).openCursor();\n request.onsuccess = () => {\n try {\n const cursor = request.result;\n if (!cursor) {\n done?.();\n return;\n }\n visit(cursor);\n cursor.continue();\n } catch (error) {\n console.error(`IndexedDB upgrade of ${storeName} failed:`, error);\n transaction.abort();\n }\n };\n };\n\n const migrateCollection = (\n storeName: typeof STORES.TRADES | typeof STORES.DAILY_LOGS | typeof STORES.REPORTING_LOGS,\n fields: readonly string[],\n done: () => void,\n ) =>\n eachRecord(\n storeName,\n (cursor) => {\n const record = cursor.value;\n const premiumChanged =\n storeName === STORES.TRADES && oldVersion < 6 && rescaleLegacyPremium(record);\n const days = storeCalendarDays(\n record,\n fields,\n storeName === STORES.REPORTING_LOGS ? REPORTING_SOURCE_CELLS : undefined,\n );\n if (days.unproven > 0) {\n const blockId = String(record.blockId);\n const counts = unverified.get(blockId) ?? {};\n counts[storeName] = (counts[storeName] ?? 0) + days.unproven;\n unverified.set(blockId, counts);\n }\n if (premiumChanged || days.changed) cursor.update(record);\n },\n done,\n );\n\n let pendingCollections = 3;\n const collectionDone = () => {\n pendingCollections--;\n if (pendingCollections > 0) return;\n eachRecord(STORES.BLOCKS, (cursor) => {\n const block = cursor.value;\n // The block's date range copies its trades' dates; it adds no count of its own.\n const changed = block.dateRange\n ? storeCalendarDays(block.dateRange, [\"start\", \"end\"]).changed\n : false;\n const counts = unverified.get(block.id);\n if (counts) block.unverifiedCalendarDays = counts;\n if (changed || counts) cursor.update(block);\n });\n };\n migrateCollection(STORES.TRADES, TRADE_DAY_FIELDS, collectionDone);\n migrateCollection(STORES.DAILY_LOGS, DATED_ROW_DAY_FIELDS, collectionDone);\n migrateCollection(STORES.REPORTING_LOGS, TRADE_DAY_FIELDS, collectionDone);\n\n eachRecord(STORES.CALCULATIONS, (cursor) => {\n if (Object.hasOwn(DATED_CALCULATION_TYPES, cursor.value.calculationType)) cursor.delete();\n });\n}\n\n/**\n * Initialize the IndexedDB database\n */\nexport async function initializeDatabase(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n if (dbInstance) {\n resolve(dbInstance);\n return;\n }\n\n const request = indexedDB.open(DB_NAME, DB_VERSION);\n\n request.onerror = () => {\n reject(new Error(`Failed to open database: ${request.error?.message}`));\n };\n\n request.onsuccess = () => {\n dbInstance = request.result;\n resolve(dbInstance);\n };\n\n request.onupgradeneeded = (event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n const transaction = (event.target as IDBOpenDBRequest).transaction!;\n\n // Create blocks store\n if (!db.objectStoreNames.contains(STORES.BLOCKS)) {\n const blocksStore = db.createObjectStore(STORES.BLOCKS, {\n keyPath: \"id\",\n });\n blocksStore.createIndex(\"name\", \"name\", { unique: false });\n blocksStore.createIndex(\"isActive\", \"isActive\", { unique: false });\n blocksStore.createIndex(\"created\", \"created\", { unique: false });\n blocksStore.createIndex(\"lastModified\", \"lastModified\", {\n unique: false,\n });\n }\n\n // Create trades store\n if (!db.objectStoreNames.contains(STORES.TRADES)) {\n const tradesStore = db.createObjectStore(STORES.TRADES, {\n autoIncrement: true,\n });\n tradesStore.createIndex(INDEXES.TRADES_BY_BLOCK, \"blockId\", {\n unique: false,\n });\n tradesStore.createIndex(INDEXES.TRADES_BY_DATE, \"dateOpened\", {\n unique: false,\n });\n tradesStore.createIndex(INDEXES.TRADES_BY_STRATEGY, \"strategy\", {\n unique: false,\n });\n tradesStore.createIndex(\"pl\", \"pl\", { unique: false });\n tradesStore.createIndex(\"composite_block_date\", [\"blockId\", \"dateOpened\"], {\n unique: false,\n });\n }\n\n // Create daily logs store\n if (!db.objectStoreNames.contains(STORES.DAILY_LOGS)) {\n const dailyLogsStore = db.createObjectStore(STORES.DAILY_LOGS, {\n autoIncrement: true,\n });\n dailyLogsStore.createIndex(INDEXES.DAILY_LOGS_BY_BLOCK, \"blockId\", {\n unique: false,\n });\n dailyLogsStore.createIndex(INDEXES.DAILY_LOGS_BY_DATE, \"date\", {\n unique: false,\n });\n dailyLogsStore.createIndex(\"composite_block_date\", [\"blockId\", \"date\"], { unique: false });\n }\n\n // Create reporting logs store\n if (!db.objectStoreNames.contains(STORES.REPORTING_LOGS)) {\n const reportingStore = db.createObjectStore(STORES.REPORTING_LOGS, {\n autoIncrement: true,\n });\n reportingStore.createIndex(INDEXES.REPORTING_LOGS_BY_BLOCK, \"blockId\", {\n unique: false,\n });\n reportingStore.createIndex(INDEXES.REPORTING_LOGS_BY_STRATEGY, \"strategy\", {\n unique: false,\n });\n reportingStore.createIndex(\"composite_block_date\", [\"blockId\", \"dateOpened\"], {\n unique: false,\n });\n }\n\n // Create calculations store (for cached computations)\n if (!db.objectStoreNames.contains(STORES.CALCULATIONS)) {\n const calculationsStore = db.createObjectStore(STORES.CALCULATIONS, {\n keyPath: \"id\",\n });\n calculationsStore.createIndex(INDEXES.CALCULATIONS_BY_BLOCK, \"blockId\", { unique: false });\n calculationsStore.createIndex(\"calculationType\", \"calculationType\", {\n unique: false,\n });\n calculationsStore.createIndex(\"calculatedAt\", \"calculatedAt\", {\n unique: false,\n });\n }\n\n // Create walk-forward analysis store\n if (!db.objectStoreNames.contains(STORES.WALK_FORWARD)) {\n const walkForwardStore = db.createObjectStore(STORES.WALK_FORWARD, {\n keyPath: \"id\",\n });\n walkForwardStore.createIndex(INDEXES.WALK_FORWARD_BY_BLOCK, \"blockId\", {\n unique: false,\n });\n walkForwardStore.createIndex(\"createdAt\", \"createdAt\", { unique: false });\n }\n\n // Create static datasets store (metadata)\n if (!db.objectStoreNames.contains(STORES.STATIC_DATASETS)) {\n const staticDatasetsStore = db.createObjectStore(STORES.STATIC_DATASETS, {\n keyPath: \"id\",\n });\n staticDatasetsStore.createIndex(\"name\", \"name\", { unique: true });\n staticDatasetsStore.createIndex(\"uploadedAt\", \"uploadedAt\", { unique: false });\n }\n\n // Create static dataset rows store (data rows)\n if (!db.objectStoreNames.contains(STORES.STATIC_DATASET_ROWS)) {\n const staticDatasetRowsStore = db.createObjectStore(STORES.STATIC_DATASET_ROWS, {\n autoIncrement: true,\n });\n staticDatasetRowsStore.createIndex(INDEXES.STATIC_DATASET_ROWS_BY_DATASET, \"datasetId\", {\n unique: false,\n });\n staticDatasetRowsStore.createIndex(INDEXES.STATIC_DATASET_ROWS_BY_TIMESTAMP, \"timestamp\", {\n unique: false,\n });\n staticDatasetRowsStore.createIndex(\n \"composite_dataset_timestamp\",\n [\"datasetId\", \"timestamp\"],\n { unique: false },\n );\n }\n\n if (!db.objectStoreNames.contains(STORES.PUBLISHED_RATES)) {\n db.createObjectStore(STORES.PUBLISHED_RATES);\n }\n\n if (event.oldVersion < 7) {\n upgradeStoredRecords(transaction, event.oldVersion);\n }\n\n transaction.oncomplete = () => {\n dbInstance = db;\n resolve(db);\n };\n };\n });\n}\n\n/**\n * Get database instance (initialize if needed)\n */\nexport async function getDatabase(): Promise<IDBDatabase> {\n if (dbInstance) {\n return dbInstance;\n }\n return initializeDatabase();\n}\n\n/**\n * Close database connection\n */\nexport function closeDatabase(): void {\n if (dbInstance) {\n dbInstance.close();\n dbInstance = null;\n }\n}\n\n/**\n * Delete the entire database (for testing/reset)\n * This version is more robust for corrupted databases:\n * - Doesn't require opening the database first\n * - Has timeout to prevent hanging forever\n * - Resolves on blocked (since deletion completes after reload)\n */\nexport async function deleteDatabase(): Promise<void> {\n return new Promise((resolve) => {\n // Close any existing connection (don't wait for it)\n if (dbInstance) {\n try {\n dbInstance.close();\n } catch {\n // Ignore close errors - database might be in bad state\n }\n dbInstance = null;\n }\n\n const deleteRequest = indexedDB.deleteDatabase(DB_NAME);\n\n // Timeout to prevent hanging forever on corrupted database\n const timeout = setTimeout(() => {\n console.warn(\"Database deletion timed out - will retry after reload\");\n resolve(); // Resolve anyway so we can reload\n }, 5000);\n\n deleteRequest.onsuccess = () => {\n clearTimeout(timeout);\n resolve();\n };\n\n deleteRequest.onerror = () => {\n clearTimeout(timeout);\n console.error(\"Failed to delete database:\", deleteRequest.error);\n // Still resolve - user can retry after page reload\n resolve();\n };\n\n deleteRequest.onblocked = () => {\n clearTimeout(timeout);\n console.warn(\"Database deletion blocked - will complete after reload\");\n // Resolve instead of reject - the deletion will complete once all connections close\n // After page reload, there will be no connections blocking it\n resolve();\n };\n });\n}\n\n/**\n * Transaction helper for read operations\n */\nexport async function withReadTransaction<T>(\n stores: string | string[],\n callback: (transaction: IDBTransaction) => Promise<T>,\n): Promise<T> {\n const db = await getDatabase();\n const storeNames = Array.isArray(stores) ? stores : [stores];\n const transaction = db.transaction(storeNames, \"readonly\");\n\n return callback(transaction);\n}\n\n/**\n * Transaction helper for write operations\n */\nexport async function withWriteTransaction<T>(\n stores: string | string[],\n callback: (transaction: IDBTransaction) => Promise<T>,\n): Promise<T> {\n const db = await getDatabase();\n const storeNames = Array.isArray(stores) ? stores : [stores];\n const transaction = db.transaction(storeNames, \"readwrite\");\n\n return callback(transaction);\n}\n\n/**\n * Generic helper for promisifying IDBRequest\n */\nexport function promisifyRequest<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\n/**\n * Storage quota management\n */\nexport interface StorageInfo {\n quota: number;\n usage: number;\n available: number;\n persistent: boolean;\n}\n\n/**\n * Get storage quota information\n */\nexport async function getStorageInfo(): Promise<StorageInfo> {\n if (\"storage\" in navigator && \"estimate\" in navigator.storage) {\n const estimate = await navigator.storage.estimate();\n const persistent = await navigator.storage.persisted();\n\n return {\n quota: estimate.quota || 0,\n usage: estimate.usage || 0,\n available: (estimate.quota || 0) - (estimate.usage || 0),\n persistent,\n };\n }\n\n // Fallback for browsers without storage API\n return {\n quota: 0,\n usage: 0,\n available: 0,\n persistent: false,\n };\n}\n\n/**\n * Request persistent storage\n */\nexport async function requestPersistentStorage(): Promise<boolean> {\n if (\"storage\" in navigator && \"persist\" in navigator.storage) {\n return navigator.storage.persist();\n }\n return false;\n}\n\n/**\n * Database error types\n */\nexport class DatabaseError extends Error {\n readonly operation: string;\n readonly store?: string;\n override readonly cause?: Error;\n constructor(message: string, operation: string, store?: string, cause?: Error) {\n super(message);\n this.name = \"DatabaseError\";\n this.operation = operation;\n this.store = store;\n this.cause = cause;\n }\n}\n\nexport class QuotaExceededError extends DatabaseError {\n constructor(operation: string, store?: string) {\n super(\"Storage quota exceeded\", operation, store);\n this.name = \"QuotaExceededError\";\n }\n}\n\nexport class TransactionError extends DatabaseError {\n constructor(message: string, operation: string, store?: string, cause?: Error) {\n super(message, operation, store, cause);\n this.name = \"TransactionError\";\n }\n}\n\n// Re-export functions from individual stores\nexport {\n createBlock,\n deleteBlock,\n getActiveBlock,\n getAllBlocks,\n getBlock,\n updateBlock,\n updateBlockStats,\n} from \"./blocks-store.ts\";\nexport {\n addDailyLogEntries,\n deleteDailyLogsByBlock,\n getDailyLogCountByBlock,\n getDailyLogsByBlock,\n updateDailyLogsForBlock,\n} from \"./daily-logs-store.ts\";\nexport type { StoredDailyLogEntry } from \"./daily-logs-store.ts\";\nexport {\n addReportingTrades,\n deleteReportingTradesByBlock,\n getReportingStrategiesByBlock,\n getReportingTradeCountByBlock,\n getReportingTradesByBlock,\n updateReportingTradesForBlock,\n} from \"./reporting-logs-store.ts\";\nexport {\n addTrades,\n deleteTradesByBlock,\n getTradeCountByBlock,\n getTradesByBlock,\n getTradesByBlockWithOptions,\n updateTradesForBlock,\n} from \"./trades-store.ts\";\nexport type { StoredTrade } from \"./trades-store.ts\";\nexport {\n saveWalkForwardAnalysis,\n getWalkForwardAnalysis,\n getWalkForwardAnalysesByBlock,\n deleteWalkForwardAnalysis,\n deleteWalkForwardAnalysesByBlock,\n} from \"./walk-forward-store.ts\";\nexport {\n storeCombinedTradesCache,\n getCombinedTradesCache,\n deleteCombinedTradesCache,\n hasCombinedTradesCache,\n invalidateBlockCaches,\n} from \"./combined-trades-cache.ts\";\nexport {\n storePerformanceSnapshotCache,\n getPerformanceSnapshotCache,\n deletePerformanceSnapshotCache,\n hasPerformanceSnapshotCache,\n} from \"./performance-snapshot-cache.ts\";\nexport { loadBrowserPublishedRates } from \"./published-rates-store.ts\";\nexport type { CachedPerformanceSnapshot } from \"./performance-snapshot-cache.ts\";\nexport {\n storeEnrichedTradesCache,\n getEnrichedTradesCache,\n deleteEnrichedTradesCache,\n hasEnrichedTradesCache,\n} from \"./enriched-trades-cache.ts\";\nexport {\n createStaticDataset,\n getStaticDataset,\n getStaticDatasetByName,\n getAllStaticDatasets,\n updateStaticDatasetMatchStrategy,\n updateStaticDatasetName,\n updateStaticDatasetTiming,\n deleteStaticDataset,\n isDatasetNameTaken,\n getStaticDatasetCount,\n} from \"./static-datasets-store.ts\";\nexport {\n addStaticDatasetRows,\n getStaticDatasetRows,\n getStaticDatasetRowsByRange,\n getStaticDatasetRowCount,\n deleteStaticDatasetRows,\n deleteStaticDatasetWithRows,\n getStaticDatasetDateRange,\n} from \"./static-dataset-rows-store.ts\";\n","/**\n * Daily Logs Store - CRUD operations for daily log data\n */\n\nimport type { DailyLogEntry } from \"../models/daily-log.ts\";\nimport {\n STORES,\n INDEXES,\n withReadTransaction,\n withWriteTransaction,\n promisifyRequest,\n} from \"./index.ts\";\nimport { clearUnverifiedCalendarDays } from \"./blocks-store.ts\";\nimport {\n DATED_ROW_DAY_FIELDS,\n decodeCalendarDays,\n encodeCalendarDay,\n encodeCalendarDays,\n type StoredCalendarDays,\n} from \"./calendar-days.ts\";\n\n/**\n * Extended daily log entry with block association\n */\nexport interface StoredDailyLogEntry extends DailyLogEntry {\n blockId: string;\n id?: number; // Auto-generated by IndexedDB\n}\n\ntype PersistedDailyLogEntry = StoredCalendarDays<StoredDailyLogEntry, \"date\">;\n\nconst fromPersisted = (entries: PersistedDailyLogEntry[]): StoredDailyLogEntry[] =>\n entries.map((entry) =>\n decodeCalendarDays<StoredDailyLogEntry, \"date\">(entry, DATED_ROW_DAY_FIELDS),\n );\n\n/**\n * Add daily log entries for a block (batch operation)\n */\nexport async function addDailyLogEntries(blockId: string, entries: DailyLogEntry[]): Promise<void> {\n if (entries.length === 0) return;\n\n await withWriteTransaction(STORES.DAILY_LOGS, async (transaction) => {\n const store = transaction.objectStore(STORES.DAILY_LOGS);\n\n // Use Promise.all for better performance with large datasets\n const promises = entries.map((entry) =>\n promisifyRequest(store.add(encodeCalendarDays({ ...entry, blockId }, DATED_ROW_DAY_FIELDS))),\n );\n\n await Promise.all(promises);\n });\n}\n\n/**\n * Get all daily log entries for a block\n */\nexport async function getDailyLogsByBlock(blockId: string): Promise<StoredDailyLogEntry[]> {\n return withReadTransaction(STORES.DAILY_LOGS, async (transaction) => {\n const store = transaction.objectStore(STORES.DAILY_LOGS);\n const index = store.index(INDEXES.DAILY_LOGS_BY_BLOCK);\n const result: PersistedDailyLogEntry[] = await promisifyRequest(index.getAll(blockId));\n\n // Chronological order: `YYYY-MM-DD` days sort as text.\n result.sort((a, b) => (a.date < b.date ? -1 : a.date > b.date ? 1 : 0));\n return fromPersisted(result);\n });\n}\n\n/**\n * Get daily log entries dated `startDate` through `endDate` (inclusive calendar days)\n */\nexport async function getDailyLogsByDateRange(\n blockId: string,\n startDate: Date,\n endDate: Date,\n): Promise<StoredDailyLogEntry[]> {\n return withReadTransaction(STORES.DAILY_LOGS, async (transaction) => {\n const store = transaction.objectStore(STORES.DAILY_LOGS);\n const index = store.index(\"composite_block_date\");\n\n const range = IDBKeyRange.bound(\n [blockId, encodeCalendarDay(startDate)],\n [blockId, encodeCalendarDay(endDate)],\n );\n return fromPersisted(await promisifyRequest(index.getAll(range)));\n });\n}\n\n/**\n * Get daily log entry for a specific date\n */\nexport async function getDailyLogByDate(\n blockId: string,\n date: Date,\n): Promise<StoredDailyLogEntry | null> {\n const entries = await getDailyLogsByDateRange(blockId, date, date);\n return entries.length > 0 ? entries[0] : null;\n}\n\n/**\n * Get daily log count by block\n */\nexport async function getDailyLogCountByBlock(blockId: string): Promise<number> {\n return withReadTransaction(STORES.DAILY_LOGS, async (transaction) => {\n const store = transaction.objectStore(STORES.DAILY_LOGS);\n const index = store.index(INDEXES.DAILY_LOGS_BY_BLOCK);\n const result = await promisifyRequest(index.count(blockId));\n return result;\n });\n}\n\n/**\n * Delete all daily log entries for a block\n */\nexport async function deleteDailyLogsByBlock(blockId: string): Promise<void> {\n await withWriteTransaction([STORES.DAILY_LOGS, STORES.BLOCKS], async (transaction) => {\n const store = transaction.objectStore(STORES.DAILY_LOGS);\n const index = store.index(INDEXES.DAILY_LOGS_BY_BLOCK);\n const request = index.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n request.onerror = () => reject(request.error);\n });\n await clearUnverifiedCalendarDays(transaction, blockId, STORES.DAILY_LOGS);\n });\n}\n\n/**\n * Update daily log entries for a block (replace all)\n */\nexport async function updateDailyLogsForBlock(\n blockId: string,\n entries: DailyLogEntry[],\n): Promise<void> {\n await withWriteTransaction([STORES.DAILY_LOGS, STORES.BLOCKS], async (transaction) => {\n // First delete existing entries\n const store = transaction.objectStore(STORES.DAILY_LOGS);\n const index = store.index(INDEXES.DAILY_LOGS_BY_BLOCK);\n const deleteRequest = index.openCursor(IDBKeyRange.only(blockId));\n\n await new Promise<void>((resolve, reject) => {\n deleteRequest.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result;\n if (cursor) {\n cursor.delete();\n cursor.continue();\n } else {\n resolve();\n }\n };\n deleteRequest.onerror = () => reject(deleteRequest.error);\n });\n\n // Then add new entries\n const promises = entries.map((entry) =>\n promisifyRequest(store.add(encodeCalendarDays({ ...entry, blockId }, DATED_ROW_DAY_FIELDS))),\n );\n\n await Promise.all(promises);\n await clearUnverifiedCalendarDays(transaction, blockId, STORES.DAILY_LOGS);\n });\n}\n\n/**\n * Get daily log statistics for a block\n */\nexport async function getDailyLogStatistics(blockId: string): Promise<{\n totalEntries: number;\n dateRange: { start: Date | null; end: Date | null };\n finalPortfolioValue: number;\n maxDrawdown: number;\n totalPl: number;\n avgDailyPl: number;\n}> {\n const entries = await getDailyLogsByBlock(blockId);\n\n if (entries.length === 0) {\n return {\n totalEntries: 0,\n dateRange: { start: null, end: null },\n finalPortfolioValue: 0,\n maxDrawdown: 0,\n totalPl: 0,\n avgDailyPl: 0,\n };\n }\n\n const totalEntries = entries.length;\n\n // Get date range\n const dates = entries.map((entry) => new Date(entry.date));\n const start = new Date(Math.min(...dates.map((d) => d.getTime())));\n const end = new Date(Math.max(...dates.map((d) => d.getTime())));\n\n // Final portfolio value (last entry)\n const sortedEntries = entries.sort(\n (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime(),\n );\n const finalPortfolioValue = sortedEntries[0]?.netLiquidity || 0;\n\n // Calculate max drawdown (most negative value)\n const maxDrawdown = Math.min(...entries.map((entry) => entry.drawdownPct));\n\n // Total P/L (sum of all daily P/L)\n const totalPl = entries.reduce((sum, entry) => sum + entry.dailyPl, 0);\n\n // Average daily P/L\n const avgDailyPl = totalPl / totalEntries;\n\n return {\n totalEntries,\n dateRange: { start, end },\n finalPortfolioValue,\n maxDrawdown,\n totalPl,\n avgDailyPl,\n };\n}\n\n/**\n * Get portfolio value over time (for charts)\n */\nexport async function getPortfolioValueTimeSeries(blockId: string): Promise<\n Array<{\n date: Date;\n netLiquidity: number;\n dailyPl: number;\n drawdownPct: number;\n }>\n> {\n const entries = await getDailyLogsByBlock(blockId);\n\n return entries.map((entry) => ({\n date: new Date(entry.date),\n netLiquidity: entry.netLiquidity,\n dailyPl: entry.dailyPl,\n drawdownPct: entry.drawdownPct,\n }));\n}\n\n/**\n * Get daily P/L aggregated by month\n */\nexport async function getMonthlyPl(blockId: string): Promise<Record<string, number>> {\n const entries = await getDailyLogsByBlock(blockId);\n const monthlyPl: Record<string, number> = {};\n\n entries.forEach((entry) => {\n const date = new Date(entry.date);\n const monthKey = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}`;\n\n if (!monthlyPl[monthKey]) {\n monthlyPl[monthKey] = 0;\n }\n monthlyPl[monthKey] += entry.dailyPl;\n });\n\n return monthlyPl;\n}\n\n/**\n * Get daily P/L aggregated by week\n */\nexport async function getWeeklyPl(blockId: string): Promise<Record<string, number>> {\n const entries = await getDailyLogsByBlock(blockId);\n const weeklyPl: Record<string, number> = {};\n\n entries.forEach((entry) => {\n const date = new Date(entry.date);\n const year = date.getFullYear();\n const week = getWeekNumber(date);\n const weekKey = `${year}-W${String(week).padStart(2, \"0\")}`;\n\n if (!weeklyPl[weekKey]) {\n weeklyPl[weekKey] = 0;\n }\n weeklyPl[weekKey] += entry.dailyPl;\n });\n\n return weeklyPl;\n}\n\n/**\n * Helper function to get week number\n */\nfunction getWeekNumber(date: Date): number {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil(((d.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n}\n"],"mappings":"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ACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA;AAAA,EAEd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAChB;;;ACz3GO,IAAM,aAAqC;AAAA,EAChD,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA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","names":["getCacheId","getCacheId","MS_PER_DAY","fromPersisted"]}