@getmicdrop/venue-calendar 4.0.9 → 4.0.11

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 (84) hide show
  1. package/README.md +700 -700
  2. package/dist/{AirbnbSplitMain-BF9Md8qq.js → AirbnbSplitMain-BwFA51F6.js} +4 -4
  3. package/dist/AirbnbSplitMain-BwFA51F6.js.map +1 -0
  4. package/dist/{CarouselView.legacy-BFGIAx7l.js → CarouselView.legacy-BHeZe5LX.js} +3 -3
  5. package/dist/CarouselView.legacy-BHeZe5LX.js.map +1 -0
  6. package/dist/CartView-BUzE0wp2.js +1682 -0
  7. package/dist/CartView-BUzE0wp2.js.map +1 -0
  8. package/dist/{Checkout-CpPb5Ifu.js → Checkout-pzohnvrX.js} +4 -4
  9. package/dist/Checkout-pzohnvrX.js.map +1 -0
  10. package/dist/{Checkout.legacy-C9yyEf3S.js → Checkout.legacy-ZKJN-dMX.js} +4 -4
  11. package/dist/Checkout.legacy-ZKJN-dMX.js.map +1 -0
  12. package/dist/CheckoutMain-5LdQDph1.js +1436 -0
  13. package/dist/CheckoutMain-5LdQDph1.js.map +1 -0
  14. package/dist/{CheckoutTimer-DJnOIPo_.js → CheckoutTimer-D6LfPX7c.js} +2 -2
  15. package/dist/CheckoutTimer-D6LfPX7c.js.map +1 -0
  16. package/dist/{CollectionView-CYrzlsQM.js → CollectionView-BwQTF9Df.js} +5 -5
  17. package/dist/CollectionView-BwQTF9Df.js.map +1 -0
  18. package/dist/{CollectionView.legacy-Dps9inGG.js → CollectionView.legacy-Cz6XX6Ly.js} +3 -3
  19. package/dist/CollectionView.legacy-Cz6XX6Ly.js.map +1 -0
  20. package/dist/{EventDetailsView-DBbu150l.js → EventDetailsView-Cp5IRJam.js} +2 -2
  21. package/dist/EventDetailsView-Cp5IRJam.js.map +1 -0
  22. package/dist/{FeaturedView.legacy-BrtaOt9e.js → FeaturedView.legacy-DKOl806x.js} +2 -2
  23. package/dist/FeaturedView.legacy-DKOl806x.js.map +1 -0
  24. package/dist/{GalleryCard-jocj0pr5.js → GalleryCard-MO80JCq7.js} +2 -2
  25. package/dist/GalleryCard-MO80JCq7.js.map +1 -0
  26. package/dist/{GalleryView.legacy-HgqtBg4h.js → GalleryView.legacy-pSihGXaa.js} +3 -3
  27. package/dist/GalleryView.legacy-pSihGXaa.js.map +1 -0
  28. package/dist/{GroupedListView.legacy-DOE0hObl.js → GroupedListView.legacy-CC1kcrgF.js} +2 -2
  29. package/dist/GroupedListView.legacy-CC1kcrgF.js.map +1 -0
  30. package/dist/OrderSummarySkeleton-dDKUH741.js.map +1 -1
  31. package/dist/{SeriesPage-CpmkUQkM.js → SeriesPage-rUuL4Pdb.js} +5 -5
  32. package/dist/SeriesPage-rUuL4Pdb.js.map +1 -0
  33. package/dist/{SeriesPage.legacy-DdBGxKik.js → SeriesPage.legacy-BxPGQaCo.js} +2 -2
  34. package/dist/SeriesPage.legacy-BxPGQaCo.js.map +1 -0
  35. package/dist/{Success-CFFLbHnY.js → Success-BAHe8E_8.js} +5 -5
  36. package/dist/Success-BAHe8E_8.js.map +1 -0
  37. package/dist/{Success.legacy-CbRz2zxG.js → Success.legacy-COO3pzj4.js} +2 -2
  38. package/dist/Success.legacy-COO3pzj4.js.map +1 -0
  39. package/dist/{VenueCalendar-DUIJZSTv.js → VenueCalendar-Djc3e2j2.js} +14 -14
  40. package/dist/{VenueCalendar-DUIJZSTv.js.map → VenueCalendar-Djc3e2j2.js.map} +1 -1
  41. package/dist/{ViewTicketsEmbed-BtskVW7X.js → ViewTicketsEmbed-CBk3cg3u.js} +2 -2
  42. package/dist/ViewTicketsEmbed-CBk3cg3u.js.map +1 -0
  43. package/dist/api/api.cjs.map +1 -1
  44. package/dist/api/api.mjs.map +1 -1
  45. package/dist/api/types.d.ts +357 -357
  46. package/dist/colors-BZoMuXdh.js.map +1 -1
  47. package/dist/{labels-yD6EDNLO.js → labels-DySnOPVE.js} +2 -2
  48. package/dist/labels-DySnOPVE.js.map +1 -0
  49. package/dist/seo/seo.cjs.map +1 -1
  50. package/dist/seo/seo.mjs.map +1 -1
  51. package/dist/seo/types.d.ts +137 -137
  52. package/dist/{transform-D00wPQAM.js → transform-DKVmquzJ.js} +2 -2
  53. package/dist/transform-DKVmquzJ.js.map +1 -0
  54. package/dist/types/index.d.ts +387 -387
  55. package/dist/venue-calendar.es.js +1 -1
  56. package/dist/venue-calendar.iife.js +37 -37
  57. package/dist/venue-calendar.iife.js.map +1 -1
  58. package/dist/venue-calendar.umd.js +37 -37
  59. package/dist/venue-calendar.umd.js.map +1 -1
  60. package/package.json +1 -1
  61. package/src/lib/theme.js +222 -222
  62. package/dist/AirbnbSplitMain-BF9Md8qq.js.map +0 -1
  63. package/dist/CarouselView.legacy-BFGIAx7l.js.map +0 -1
  64. package/dist/CartView-C_4nNeRc.js +0 -1675
  65. package/dist/CartView-C_4nNeRc.js.map +0 -1
  66. package/dist/Checkout-CpPb5Ifu.js.map +0 -1
  67. package/dist/Checkout.legacy-C9yyEf3S.js.map +0 -1
  68. package/dist/CheckoutMain-BRBejJSN.js +0 -1422
  69. package/dist/CheckoutMain-BRBejJSN.js.map +0 -1
  70. package/dist/CheckoutTimer-DJnOIPo_.js.map +0 -1
  71. package/dist/CollectionView-CYrzlsQM.js.map +0 -1
  72. package/dist/CollectionView.legacy-Dps9inGG.js.map +0 -1
  73. package/dist/EventDetailsView-DBbu150l.js.map +0 -1
  74. package/dist/FeaturedView.legacy-BrtaOt9e.js.map +0 -1
  75. package/dist/GalleryCard-jocj0pr5.js.map +0 -1
  76. package/dist/GalleryView.legacy-HgqtBg4h.js.map +0 -1
  77. package/dist/GroupedListView.legacy-DOE0hObl.js.map +0 -1
  78. package/dist/SeriesPage-CpmkUQkM.js.map +0 -1
  79. package/dist/SeriesPage.legacy-DdBGxKik.js.map +0 -1
  80. package/dist/Success-CFFLbHnY.js.map +0 -1
  81. package/dist/Success.legacy-CbRz2zxG.js.map +0 -1
  82. package/dist/ViewTicketsEmbed-BtskVW7X.js.map +0 -1
  83. package/dist/labels-yD6EDNLO.js.map +0 -1
  84. package/dist/transform-D00wPQAM.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-DKVmquzJ.js","sources":["../src/lib/premium-ticket-experience/transform.ts"],"sourcesContent":["import { formatDateRaw } from '@getmicdrop/svelte-components';\n// Premium Ticket Experience — API → EventData Transformer\n// Maps raw API event responses to our clean EventData interface.\n// Used when plugging in real API data. The showcase continues using mock-data.ts directly.\n\nimport { getImageUrl } from '$lib/utils/utils.js';\nimport { getIANATimezone } from '$lib/utils/datetime.js';\nimport type {\n\tEventData,\n\tEventStatus,\n\tTicketTypeData,\n\tTicketStatus,\n\tVenueData,\n\tPerformerData,\n\tFAQItem,\n\tSeriesOccurrence,\n\tCollectionEvent\n} from './types';\nimport type { SeriesPageData, PublicCollectionData } from '$lib/api/types';\n\n/**\n * Parse a single-line address string into display lines.\n * E.g. \"123 Main St, Los Angeles, CA 90012\" → [\"123 Main St\", \"Los Angeles, CA 90012\"]\n */\nfunction parseAddress(addressStr: string): string[] {\n\tif (!addressStr) return [];\n\tconst parts = addressStr.split(',').map((p) => p.trim());\n\tif (parts.length < 2) return [addressStr];\n\tconst lastPart = parts[parts.length - 1];\n\tconst stateZipMatch = lastPart.match(/^([A-Z]{2})\\s+(\\d{5}(-\\d{4})?)$/);\n\tif (stateZipMatch && parts.length >= 3) {\n\t\tconst state = stateZipMatch[1];\n\t\tconst zip = stateZipMatch[2];\n\t\tconst city = parts[parts.length - 2];\n\t\tconst lines = parts.slice(0, -2);\n\t\tlines.push(`${city}, ${state} ${zip}`);\n\t\treturn lines;\n\t}\n\treturn [parts[0], parts.slice(1).join(', ')];\n}\n\n/**\n * Build a Google Maps search URL from an address string.\n */\nfunction buildGoogleMapsUrl(address: string): string {\n\tif (!address) return '';\n\treturn `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(address)}`;\n}\n\n/**\n * Map a raw API ticket status/state to our TicketStatus union.\n */\nfunction mapTicketStatus(ticket: any): TicketStatus {\n\tconst now = new Date();\n\tconst remaining = ticket.remainingCapacity ?? ticket.quantityRemaining ?? ticket.quantity ?? 0;\n\tconst salesBegin = ticket.salesBegin || ticket.salesStart || ticket.saleBegin || ticket.onSaleStart;\n\tconst salesEnd = ticket.salesEnd || ticket.saleEnd || ticket.onSaleEnd;\n\n\tif (remaining <= 0) return 'sold_out';\n\tif (salesEnd && new Date(salesEnd) < now) return 'sales_ended';\n\tif (salesBegin && new Date(salesBegin) > now) return 'coming_soon';\n\treturn 'on_sale';\n}\n\n/**\n * Map a raw API event status string to our EventStatus union.\n */\nfunction mapEventStatus(rawStatus: string, tickets: TicketTypeData[]): EventStatus {\n\tconst s = (rawStatus || '').toLowerCase().replace(/\\s+/g, '_');\n\n\tif (s === 'cancelled' || s === 'canceled') return 'cancelled';\n\n\t// Check if event is past based on end time (handled by caller if needed)\n\tif (s === 'past' || s === 'ended') return 'past';\n\n\t// Derive from ticket states\n\tconst publicTickets = tickets.filter((t) => !t.isHidden);\n\tif (publicTickets.length > 0) {\n\t\tif (publicTickets.every((t) => t.status === 'sold_out')) return 'sold_out';\n\t\tif (publicTickets.every((t) => t.status === 'coming_soon')) return 'coming_soon';\n\t\tif (publicTickets.every((t) => t.status === 'sales_ended' || t.status === 'sold_out')) return 'sales_ended';\n\t}\n\n\tif (s === 'sold_out' || s === 'soldout') return 'sold_out';\n\tif (s === 'coming_soon' || s === 'comingsoon') return 'coming_soon';\n\tif (s === 'sales_ended' || s === 'salesended') return 'sales_ended';\n\n\treturn 'on_sale';\n}\n\n/**\n * Transform a raw API event response into our clean EventData interface.\n * This is the bridge between the API and our premium ticket experience components.\n */\nexport function transformApiEvent(rawEvent: any): EventData {\n\tconst timezone = getIANATimezone(rawEvent.timeZone || rawEvent.timezone || 'UTC');\n\n\t// Transform tickets\n\tconst rawTickets = rawEvent.availableTickets || [];\n\tconst tickets: TicketTypeData[] = rawTickets.map((t: any) => ({\n\t\tid: t.id || t.ID,\n\t\tname: t.name || t.title || '',\n\t\tdescription: t.description || undefined,\n\t\tprice: t.price ?? 0,\n\t\tfee: t.fee ?? 0,\n\t\tquantityAvailable: t.remainingCapacity ?? t.quantityRemaining ?? t.quantity ?? 0,\n\t\tquantityTotal: t.totalCapacity ?? t.quantity ?? 0,\n\t\tminPerOrder: t.minPerOrder ?? t.minQuantity ?? 1,\n\t\tmaxPerOrder: t.maxPerOrder ?? t.maxQuantity ?? 10,\n\t\tstatus: mapTicketStatus(t),\n\t\tsalesStartDate: t.salesBegin || t.salesStart || t.saleBegin || t.onSaleStart || undefined,\n\t\tsalesEndDate: t.salesEnd || t.saleEnd || t.onSaleEnd || undefined,\n\t\tisDonation: t.type === 2 || t.ticketType === 2 || t.isDonation === true,\n\t\tisHidden: t.visibility === 2 || t.isHidden === true,\n\t\tticketType: t.type || t.ticketType || undefined,\n\t\tsectionName: t.sectionName || t.section || undefined\n\t}));\n\n\t// Calculate totals from public tickets\n\tconst publicTickets = tickets.filter((t) => !t.isHidden && !t.isDonation);\n\tconst totalRemaining = publicTickets.reduce((sum, t) => sum + t.quantityAvailable, 0);\n\tconst totalCapacity = publicTickets.reduce((sum, t) => sum + t.quantityTotal, 0);\n\n\t// Determine event status\n\tconst status = mapEventStatus(rawEvent.status, tickets);\n\n\t// Build image URL\n\tconst rawImage = rawEvent.image || rawEvent.imageUrl || rawEvent.image_url || '';\n\tconst imageUrl = rawImage.startsWith('http') ? rawImage : getImageUrl(rawImage);\n\n\t// Venue\n\tconst rawVenue = rawEvent.venue || {};\n\tconst venue: VenueData = {\n\t\tid: rawVenue.id || rawVenue.ID || 0,\n\t\tname: rawVenue.name || rawVenue.googleLocationNameCache || '',\n\t\taddress: rawVenue.address || rawVenue.googleLocationNameCache || '',\n\t\ttimezone,\n\t\tserviceFeePercentage: rawVenue.serviceFeePercentage ?? rawVenue.fee ?? 0,\n\t\tserviceFeeCents: rawVenue.serviceFeeCents ?? 0,\n\t\ttaxPercentage: rawVenue.taxPercentage ?? rawVenue.tax ?? 0,\n\t\tcontactEmail: rawVenue.contactEmail || rawVenue.email || undefined\n\t};\n\n\t// Performers\n\tconst rawPerformers = rawEvent.performers || [];\n\tconst performers: PerformerData[] = rawPerformers.map((p: any) => ({\n\t\tid: p.id || p.ID,\n\t\tdisplayName: p.displayName || p.name || '',\n\t\tprofileImage: p.avatar || p.profileImage || undefined,\n\t\trole: p.role || undefined\n\t}));\n\n\t// FAQs (may not be in API response)\n\tconst faqs: FAQItem[] = (rawEvent.faqs || []).map((f: any) => ({\n\t\tquestion: f.question || '',\n\t\tanswer: f.answer || ''\n\t}));\n\n\t// Date in venue timezone\n\tlet date = '';\n\tif (rawEvent.startDateTime) {\n\t\tconst dt = new Date(rawEvent.startDateTime);\n\t\tdate = formatDateRaw(dt, { timeZone: timezone, year: 'numeric', month: '2-digit', day: '2-digit' }, 'en-CA');\n\t}\n\n\treturn {\n\t\tid: rawEvent.id || rawEvent.ID,\n\t\ttitle: rawEvent.title || rawEvent.name || '',\n\t\tslug: rawEvent.slug || '',\n\t\tdescription: rawEvent.description || rawEvent.eventSummary || '',\n\t\tdate,\n\t\tstartDateTime: rawEvent.startDateTime || '',\n\t\tendDateTime: rawEvent.endDateTime || '',\n\t\tdoorsOpenTime: rawEvent.doorsOpenTime || '',\n\t\ttimezone,\n\t\timageUrl,\n\t\tvenue,\n\t\tperformers,\n\t\ttickets,\n\t\tfaqs,\n\t\tdisclaimer: rawEvent.disclaimer || undefined,\n\t\tstatus,\n\t\teventSeriesId: rawEvent.eventSeriesId || undefined,\n\t\tisPasswordProtected: !!rawEvent.password,\n\t\tisRegistrationEvent: rawEvent.ticketType === 1 || rawEvent.eventTicketingType === 1,\n\t\ttotalTicketsRemaining: totalRemaining,\n\t\ttotalTicketsCapacity: totalCapacity,\n\t\tstageName: rawEvent.stage?.name || rawEvent.stageName || undefined,\n\t\tageRestriction: rawEvent.ageRestriction || undefined,\n\t\tdisplayAgeRestriction: rawEvent.displayAgeRestriction ?? false,\n\t\tdisplayStartTime: rawEvent.displayStartTime ?? true,\n\t\tdisplayEndTime: rawEvent.displayEndTime ?? true,\n\t\tdisplayDoorsTime: rawEvent.displayDoorsTime ?? true,\n\t\tcollectionId: rawEvent.collectionId || rawEvent.collection_id || undefined,\n\t\tvenueAddressLines: parseAddress(rawVenue.address || rawVenue.googleLocationNameCache || ''),\n\t\tgoogleMapsUrl: buildGoogleMapsUrl(rawVenue.address || rawVenue.googleLocationNameCache || '')\n\t};\n}\n\n/**\n * Transform SeriesPageData (from the series API) into our clean EventData interface.\n * Sets eventSeriesId so AirbnbSplitMain renders in full-width series mode.\n */\nexport function transformSeriesPageData(series: SeriesPageData): EventData {\n\tconst timezone = getIANATimezone(series.timeZone || 'UTC');\n\n\t// Build image URL\n\tconst rawImage = series.image || '';\n\tconst imageUrl = rawImage.startsWith('http') ? rawImage : rawImage ? getImageUrl(rawImage) : '';\n\n\t// Map occurrences to SeriesOccurrence[]\n\tconst seriesOccurrences: SeriesOccurrence[] = (series.occurrences || []).map((occ) => ({\n\t\tid: occ.id,\n\t\tslug: occ.slug || '',\n\t\tstartDateTime: occ.startDateTime,\n\t\tendDateTime: occ.endDateTime || '',\n\t\tstatus: (occ.ctaState?.reason === 'sold_out' ? 'sold_out' : 'on_sale') as EventStatus,\n\t\tctaText: occ.ctaState?.text || 'Get Tickets',\n\t\tctaDisabled: occ.ctaState?.disabled || false\n\t}));\n\n\t// Use first occurrence for date fields\n\tconst firstOcc = series.occurrences?.[0];\n\tlet date = '';\n\tif (firstOcc?.startDateTime) {\n\t\tconst dt = new Date(firstOcc.startDateTime);\n\t\tdate = formatDateRaw(dt, { timeZone: timezone, year: 'numeric', month: '2-digit', day: '2-digit' }, 'en-CA');\n\t}\n\n\t// Map FAQs\n\tconst rawFaq = series.venue?.faq;\n\tlet faqs: FAQItem[] = [];\n\tif (Array.isArray(rawFaq)) {\n\t\tfaqs = rawFaq.map((f) => ({ question: f.question || '', answer: f.answer || '' }));\n\t} else if (typeof rawFaq === 'string' && rawFaq) {\n\t\tfaqs = [{ question: 'FAQ', answer: rawFaq }];\n\t}\n\n\t// Map performers\n\tconst performers: PerformerData[] = (series.performers || []).map((p, index) => ({\n\t\tid: index + 1,\n\t\tdisplayName: p.displayName || [p.firstName, p.lastName].filter(Boolean).join(' '),\n\t\tprofileImage: p.profileImage || undefined\n\t}));\n\n\t// Venue address\n\tconst venueAddress = series.venue?.location || series.venue?.googleLocationNameCache || '';\n\n\treturn {\n\t\tid: series.id,\n\t\ttitle: series.title || '',\n\t\tslug: '',\n\t\tdescription: series.description || series.eventSummary || '',\n\t\tdate,\n\t\tstartDateTime: firstOcc?.startDateTime || '',\n\t\tendDateTime: firstOcc?.endDateTime || '',\n\t\tdoorsOpenTime: '',\n\t\ttimezone,\n\t\timageUrl,\n\t\tvenue: {\n\t\t\tid: series.venue?.id || 0,\n\t\t\tname: series.venue?.name || '',\n\t\t\taddress: venueAddress,\n\t\t\ttimezone,\n\t\t\tserviceFeePercentage: 0,\n\t\t\tserviceFeeCents: 0,\n\t\t\ttaxPercentage: 0\n\t\t},\n\t\tperformers,\n\t\ttickets: [],\n\t\tfaqs,\n\t\tdisclaimer: series.venue?.disclaimer || undefined,\n\t\tstatus: 'on_sale',\n\t\teventSeriesId: series.id,\n\t\tseriesOccurrences,\n\t\tisPasswordProtected: false,\n\t\tisRegistrationEvent: false,\n\t\ttotalTicketsRemaining: 0,\n\t\ttotalTicketsCapacity: 0,\n\t\tvenueAddressLines: parseAddress(venueAddress),\n\t\tgoogleMapsUrl: buildGoogleMapsUrl(venueAddress)\n\t};\n}\n\n/**\n * Transform PublicCollectionData (from the collection API) into our clean EventData interface.\n * Sets collectionId so AirbnbSplitMain renders in full-width collection mode.\n */\nexport function transformCollectionData(collection: PublicCollectionData): EventData {\n\t// Map collection events to CollectionEvent[]\n\tconst collectionEvents: CollectionEvent[] = (collection.events || []).map((ev) => {\n\t\tconst rawImg = ev.image || '';\n\t\treturn {\n\t\t\tid: ev.id,\n\t\t\tname: ev.title || '',\n\t\t\tslug: ev.slug || '',\n\t\t\timage: rawImg.startsWith('http') ? rawImg : rawImg ? getImageUrl(rawImg) : '',\n\t\t\tstartDateTime: ev.startDateTime || '',\n\t\t\tstatus: ((ev.status || 'on_sale') as EventStatus)\n\t\t};\n\t});\n\n\t// Cover image\n\tconst rawCover = collection.coverImage || '';\n\tconst imageUrl = rawCover.startsWith('http') ? rawCover : rawCover ? getImageUrl(rawCover) : '';\n\n\treturn {\n\t\tid: collection.id,\n\t\ttitle: collection.collectionTitle || '',\n\t\tslug: '',\n\t\tdescription: collection.description || collection.summary || '',\n\t\tdate: '',\n\t\tstartDateTime: '',\n\t\tendDateTime: '',\n\t\tdoorsOpenTime: '',\n\t\ttimezone: 'UTC',\n\t\timageUrl,\n\t\tvenue: {\n\t\t\tid: 0,\n\t\t\tname: '',\n\t\t\taddress: '',\n\t\t\ttimezone: 'UTC',\n\t\t\tserviceFeePercentage: 0,\n\t\t\tserviceFeeCents: 0,\n\t\t\ttaxPercentage: 0\n\t\t},\n\t\tperformers: [],\n\t\ttickets: [],\n\t\tfaqs: [],\n\t\tstatus: 'on_sale',\n\t\tcollectionId: collection.id,\n\t\tcollectionEvents,\n\t\tisPasswordProtected: false,\n\t\tisRegistrationEvent: false,\n\t\ttotalTicketsRemaining: 0,\n\t\ttotalTicketsCapacity: 0\n\t};\n}\n"],"names":["parseAddress","addressStr","parts","p","stateZipMatch","state","zip","city","lines","buildGoogleMapsUrl","address","mapTicketStatus","ticket","now","remaining","salesBegin","salesEnd","mapEventStatus","rawStatus","tickets","publicTickets","t","transformApiEvent","rawEvent","timezone","getIANATimezone","totalRemaining","sum","totalCapacity","status","rawImage","imageUrl","getImageUrl","rawVenue","venue","performers","faqs","f","date","dt","formatDateRaw","transformSeriesPageData","series","seriesOccurrences","occ","firstOcc","rawFaq","index","venueAddress","transformCollectionData","collection","collectionEvents","ev","rawImg","rawCover"],"mappings":"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"}