PageSourceSearch

https://unbaggaged.com/assets/BookingStep2-EHKaH3Wv.js

js unbaggaged.com collected 2026-10-07 21:13:03 UTC 20,091 bytes, 1 lines download raw bytes

1import{R as ie,j as t,u as ae,r as M,a as ne,S as ce,f as oe,M as de,B as j,c as E,C as B,A as le,g as pe}from"./index-2_AEaAfu.js";import{i as N,p as c,A as O,P,a as H,f as L,b as I,C as R,c as D,g as ue,d as S,e as C}from"./timezone-THbsbkop.js";import{T as me}from"./textarea-ivkPLvjf.js";import{S as F,a as G,b as K,c as Y,d as W}from"./select-DJGoCHU8.js";import{F as f,B as xe}from"./BookingPriceBar-DHM7SrWU.js";import{u as he}from"./useAutoSave-Biw7Mha7.js";import{B as fe}from"./BookingProgressIndicator-CbSWdttp.js";import{g as ge,a as q,b as _e}from"./cityToCityPricing-DUhGKXjO.js";import{g as ye,i as Z,a as ke,U as be}from"./collectionAvailability-kykmyEeh.js";import{C as J}from"./calendar-DQmbM_t0.js";import{T as je}from"./truck-Bjo53kmV.js";import"./input-Cmoq20k9.js";import"./loader-circle-pimoaj4L.js";import"./check-Bt01uBnj.js";import"./circle-check-CJoikanu.js";import"./priceCalculator-BvDALTBc.js";import"./dateCalculations-BRNxb2MP.js";import"./serviceTypes-5ItRts7B.js";import"./sparkles-D5_jOInT.js";import"./info-C9Fc5EgY.js";const $=({selectedDate:i,selectedTime:e,onTimeError:a})=>(ie.useEffect(()=>{if(!i||!e){a(!1);return}const p=N(i,e);a(p)},[i,e,a]),!i||!e||!N(i,e)?null:t.jsx("div",{className:"text-destructive text-sm mt-1",children:"Selected time is in the past. Please choose a future time."})),ve={Edinburgh:{postcodeAreas:["EH"],keywords:["edinburgh","leith","musselburgh","dalkeith","newbridge","south queensferry"]},Glasgow:{postcodeAreas:["G","PA"],keywords:["glasgow","paisley","renfrew","clydebank","rutherglen","abbotsinch"]},London:{postcodeAreas:["E","EC","N","NW","SE","SW","W","WC","BR","CR","DA","EN","HA","IG","KT","RM","SM","TW","UB","WD","SL","RH","LU","CM","SG"],keywords:["london","heathrow","gatwick","stansted","luton","croydon","wembley","richmond","kingston"]},Manchester:{postcodeAreas:["M","SK","OL","BL","WA","WN"],keywords:["manchester","salford","stockport","oldham","bolton","trafford"]},Inverness:{postcodeAreas:["IV"],keywords:["inverness","dalcross","nairn"]}},Ne=["southampton","portsmouth","bristol","birmingham","leeds","liverpool","newcastle","sheffield","nottingham","leicester","cardiff","swansea","belfast","aberdeen","dundee","perth","stirling","york","oxford","cambridge","brighton","bournemouth","plymouth","exeter","norwich","coventry","hull","sunderland","carlisle","lancaster","preston","blackpool","chester","derby","ipswich","southend","dover","harwich","fort william","oban","ayr","kilmarnock","falkirk","dumfries"];function z(i){if(!i)return null;const e=i.toUpperCase(),a=e.match(/\b([A-Z]{1,2})(\d[A-Z\d]?)\s*\d[A-Z]{2}\b/);if(a)return a[1];const o=e.trim().match(/^([A-Z]{1,2})\d[A-Z\d]?$/);return o?o[1]:null}function Q(i,e,a){if(!i||!e)return{isValid:!0};const o=ve[i];if(!o)return{isValid:!0};const p=z(a||"")||z(e);if(p)return o.postcodeAreas.includes(p)?{isValid:!0}:{isValid:!1,reason:"postcode-outside-city",detectedPlace:p};const x=e.toLowerCase();if(o.keywords.some(m=>x.includes(m)))return{isValid:!0};const g=Ne.find(m=>x.includes(m));return g?{isValid:!1,reason:"other-city-named",detectedPlace:g.replace(/\b\w/g,m=>m.toUpperCase())}:{isValid:!0}}const we=new Set(["london>edinburgh","edinburgh>london","glasgow>london","london>glasgow","manchester>london","london>manchester","manchester>edinburgh","edinburgh>manchester","glasgow>manchester","manchester>glasgow"]),De=[8,9,10],Se=2026,ee=(i,e,a)=>{if(i!=="city-to-city"||!e||!a)return!1;const o=`${e.trim().toLowerCase()}>${a.trim().toLowerCase()}`;return we.has(o)},Ce=(i,e,a)=>ee(i,e,a),Te=i=>i.getFullYear()===Se&&De.includes(i.getMonth()),v=(i,e,a,o)=>ee(i,e,a)&&Te(o),y=["00:00","00:15","00:30","00:45","01:00","01:15","01:30","01:45","02:00","02:15","02:30","02:45","03:00","03:15","03:30","03:45","04:00","04:15","04:30","04:45","05:00","05:15","05:30","05:45","06:00","06:15","06:30","06:45","07:00","07:15","07:30","07:45","08:00","08:15","08:30","08:45","09:00","09:15","09:30","09:45","10:00","10:15","10:30","10:45","11:00","11:15","11:30","11:45","12:00","12:15","12:30","12:45","13:00","13:15","13:30","13:45","14:00","14:15","14:30","14:45","15:00","15:15","15:30","15:45","16:00","16:15","16:30","16:45","17:00","17:15","17:30","17:45","18:00","18:15","18:30","18:45","19:00","19:15","19:30","19:45","20:00","20:15","20:30","20:45","21:00","21:15","21:30","21:45","22:00","22:15","22:30","22:45","23:00","23:15","23:30","23:45"],X=i=>{const e=parseInt(i.split(":")[0]);return e<8||e>=18},Ae=i=>{switch(i){case"direct":return"Direct transfer";case"store":return"Store & return";case"city-to-city":return"City-to-city";default:return i}};function ze(){const i=ae(),[e,a]=M.useState({pickup_city:"",luggage_count:1,service_type:"",destination_city:"",pickup_date:null,return_date:null,pickup_time:"",return_time:"",pickup_address:"",pickup_instructions:"",dropoff_address:"",dropoff_instructions:""});M.useEffect(()=>{const r=localStorage.getItem("bookingData");if(r){const s=JSON.parse(r);a({pickup_city:s.pickup_city||"",luggage_count:s.luggage_count||1,service_type:s.service_type||"",destination_city:s.destination_city||"",pickup_date:s.pickup_date||null,return_date:s.return_date||null,pickup_time:s.pickup_time||"",return_time:s.return_time||"",pickup_address:s.pickup_address||"",pickup_postcode:s.pickup_postcode||"",pickup_instructions:s.pickup_instructions||"",dropoff_address:s.dropoff_address||"",dropoff_postcode:s.dropoff_postcode||"",dropoff_instructions:s.dropoff_instructions||""})}else i("/")},[i]);const o=()=>{e.service_type&&localStorage.setItem("bookingData",JSON.stringify(e))},p=e.service_type!=="direct",x=e.service_type==="store"||e.service_type==="city-to-city",g=e.service_type==="city-to-city",m=Ce(e.service_type,e.pickup_city,e.destination_city),k=g?{isValid:!0}:Q(e.pickup_city,e.pickup_address,e.pickup_postcode),te=g?{isValid:!0}:Q(e.destination_city||e.pickup_city,e.dropoff_address,e.dropoff_postcode),T=!k.isValid||!te.isValid,se=m&&(!!e.pickup_date&&v(e.service_type,e.pickup_city,e.destination_city,c(e.pickup_date))||!!e.return_date&&v(e.service_type,e.pickup_city,e.destination_city,c(e.return_date))),A=ye(e.pickup_city),U=!!e.pickup_date&&!!e.pickup_time&&!Z(e.pickup_city,e.pickup_date,e.pickup_time),V=e.pickup_date&&e.pickup_time&&e.pickup_address&&e.dropoff_address&&!T&&!se&&!U&&(!x||e.return_date)&&(!p||e.return_time);he("bookingData",e,1500);const re=()=>{V&&(pe(2,"Pickup & Dropoff Details",{pickup_date:e.pickup_date,pickup_time:e.pickup_time,return_date:e.return_date,return_time:e.return_time,has_special_instructions:!!(e.pickup_instructions||e.dropoff_instructions)}),localStorage.setItem("bookingData",JSON.stringify(e)),i("/booking/contact"))};return t.jsxs("div",{className:"min-h-screen bg-white",children:[t.jsx(ne,{}),t.jsx("div",{className:"container mx-auto px-4 py-6 sm:py-8",children:t.jsxs("div",{className:"max-w-2xl mx-auto",children:[t.jsx(fe,{currentStep:2}),t.jsxs("div",{className:"text-center space-y-2 sm:space-y-3 mb-6",children:[t.jsx("h1",{className:"text-2xl sm:text-3xl font-bold text-foreground font-serif",children:"Your luggage journey"}),t.jsx("p",{className:"text-sm text-muted-foreground",children:"Just a couple of details — takes about 60 seconds. No payment yet."}),t.jsxs("div",{className:"flex flex-wrap items-center justify-center gap-x-4 gap-y-2 pt-1 text-[12px] text-muted-foreground",children:[t.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[t.jsx(ce,{className:"w-3.5 h-3.5 text-primary fill-primary"}),t.jsxs("span",{children:[t.jsx("strong",{className:"text-foreground",children:"4.9/5"})," Google reviews"]})]}),t.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[t.jsx(oe,{className:"w-3.5 h-3.5 text-primary"}),t.jsx("span",{children:"£1,000 insurance included"})]})]}),t.jsxs("div",{className:"inline-flex items-center gap-2 bg-background/60 backdrop-blur-sm rounded-full px-4 py-2 text-sm text-muted-foreground border border-border/50",children:[t.jsx("span",{className:"w-2 h-2 rounded-full bg-primary animate-pulse"}),t.jsx("span",{className:"font-medium text-foreground",children:Ae(e.service_type)}),t.jsx("span",{children:"•"}),t.jsx("span",{children:e.pickup_city}),t.jsx("span",{children:"•"}),t.jsxs("span",{children:[e.luggage_count," item",e.luggage_count>1?"s":""]})]})]}),t.jsxs("div",{className:"brand-window glass-card p-5 sm:p-8 shadow-glass border border-brand-midnight/10 backdrop-blur-xl space-y-4 sm:sp
1ace-y-5 mb-0",children:[t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsx("div",{className:"w-9 h-9 rounded-xl bg-midnight flex items-center justify-center shrink-0 ring-1 ring-midnight/20",children:t.jsx(de,{className:"w-4 h-4 text-white"})}),t.jsxs("div",{children:[t.jsx("h2",{className:"text-sm  font-bold text-brand-midnight tracking-wide font-playfair",children:"Collection"}),t.jsx("p",{className:"text-xs text-muted-foreground",children:"Collection address & time"})]})]}),t.jsxs("div",{className:"space-y-1.5",children:[t.jsx(f,{label:"Address",isValid:!!e.pickup_address,uppercase:!0}),t.jsx(O,{value:e.pickup_address,onChange:r=>a(s=>({...s,pickup_address:r})),onPostcodeChange:r=>a(s=>({...s,pickup_postcode:r})),placeholder:"Start typing to search for an address...",city:e.pickup_city})]}),t.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3 sm:gap-4",children:[t.jsxs("div",{className:"space-y-1.5",children:[t.jsx(f,{label:"Date",isValid:!!e.pickup_date,uppercase:!0}),t.jsxs(P,{children:[t.jsx(H,{asChild:!0,children:t.jsx(j,{variant:"outline",className:E("h-11 w-full justify-start text-left font-normal bg-background/80 border border-border/60 rounded-lg text-sm transition-all hover:border-primary/40 focus-visible:ring-primary/30",!e.pickup_date&&"text-muted-foreground"),children:t.jsxs("div",{className:"flex items-center space-x-2",children:[t.jsx(J,{className:"h-4 w-4 text-primary/70"}),t.jsx("span",{className:"truncate",children:e.pickup_date?L(c(e.pickup_date)):"Select date"})]})})}),t.jsx(I,{className:"w-auto p-0 bg-background/95 backdrop-blur-xl border-white/20",align:"start",children:t.jsx(R,{mode:"single",selected:e.pickup_date?c(e.pickup_date):void 0,onSelect:r=>{a(s=>({...s,pickup_date:r?D(r):null})),o()},disabled:r=>{if(v(e.service_type,e.pickup_city,e.destination_city,r)||ke(e.pickup_city,D(r)))return!0;if(e.service_type==="city-to-city"){const d=ge();return r<d}const s=new Date;s.setHours(0,0,0,0);const n=new Date(r);return n.setHours(0,0,0,0),n<s},initialFocus:!0,className:"pointer-events-auto"})})]}),e.service_type==="city-to-city"&&t.jsxs("p",{className:"text-xs text-muted-foreground mt-1",children:["Need it within 72hrs? ",t.jsx("a",{href:"mailto:[email protected]",className:"text-primary hover:underline",children:"Contact us"})]})]}),t.jsxs("div",{className:"space-y-1.5",children:[t.jsx(f,{label:"Time",isValid:!!e.pickup_time,uppercase:!0}),t.jsxs(F,{value:e.pickup_time,onValueChange:r=>{a(s=>({...s,pickup_time:r})),o()},children:[t.jsx(G,{className:"h-11 bg-background/80 border border-border/60 rounded-lg backdrop-blur-sm text-sm transition-all hover:border-primary/40",children:t.jsxs("div",{className:"flex items-center space-x-2",children:[t.jsx(B,{className:"h-4 w-4 text-primary/70"}),t.jsx(K,{placeholder:"Select time"})]})}),t.jsx(Y,{className:"bg-background/95 backdrop-blur-xl border-white/20 z-50",children:y.filter(r=>{if(!e.pickup_date)return!0;if(!Z(e.pickup_city,e.pickup_date,r))return!1;const s=ue(),n=new Date(Date.UTC(s.getUTCFullYear(),s.getUTCMonth(),s.getUTCDate(),0,0,0,0)),d=c(e.pickup_date);if(!(new Date(Date.UTC(d.getUTCFullYear(),d.getUTCMonth(),d.getUTCDate(),0,0,0,0)).getTime()===n.getTime()))return!0;const l=c(e.pickup_date);return e.service_type==="direct"?!S(l,r,3):e.service_type==="city-to-city"?!S(l,r,24):e.service_type==="store-return"?!S(l,r,6):!N(l,r)}).map(r=>t.jsx(W,{value:r,className:"text-sm py-2",children:C(r)},r))})]}),t.jsx($,{selectedDate:e.pickup_date?c(e.pickup_date):null,selectedTime:e.pickup_time,onTimeError:()=>{}}),A&&t.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:A}),U&&t.jsx("p",{className:"text-xs text-destructive mt-1",children:be}),e.service_type==="direct"&&t.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"Min. 3 hours notice for same-day"}),e.service_type==="store-return"&&t.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"Min. 6 hours notice for same-day"}),e.service_type==="city-to-city"&&t.jsx("p",{className:"text-xs text-muted-foreground mt-1",children:"Min. 24 hours notice for same-day"}),e.pickup_time&&X(e.pickup_time)&&t.jsx("p",{className:"text-xs text-accent dark:text-accent mt-1",children:"Out of hours — additional charges may apply"})]})]})]}),t.jsx("div",{className:"flex justify-center py-1",children:t.jsx("div",{className:"w-px h-6 bg-primary/40"})}),t.jsxs("div",{className:"brand-window glass-card p-5 sm:p-8 shadow-glass border border-brand-midnight/10 backdrop-blur-xl space-y-4 sm:sp
1ace-y-5 mb-6",children:[t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsx("div",{className:"w-9 h-9 rounded-xl bg-midnight flex items-center justify-center shrink-0 ring-1 ring-midnight/20",children:t.jsx(je,{className:"w-4 h-4 text-white"})}),t.jsxs("div",{children:[t.jsx("h2",{className:"text-sm  font-bold text-brand-midnight tracking-wide font-playfair",children:e.service_type==="store"?"Delivery":"Drop-off"}),t.jsx("p",{className:"text-xs text-muted-foreground",children:"Delivery address & time"})]})]}),t.jsxs("div",{className:"space-y-1.5",children:[t.jsx(f,{label:"Delivery address",isValid:!!e.dropoff_address,uppercase:!0}),t.jsx(O,{value:e.dropoff_address,onChange:r=>a(s=>({...s,dropoff_address:r})),onPostcodeChange:r=>a(s=>({...s,dropoff_postcode:r})),placeholder:"Start typing to search for an address...",city:e.destination_city||e.pickup_city})]}),(x||p)&&t.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3 sm:gap-4",children:[x&&t.jsxs("div",{className:"space-y-1.5",children:[t.jsx(f,{label:"Delivery date",isValid:!!e.return_date,uppercase:!0}),t.jsxs(P,{children:[t.jsx(H,{asChild:!0,children:t.jsx(j,{variant:"outline",disabled:!e.pickup_date,className:E("h-11 w-full justify-start text-left font-normal bg-background/80 border border-border/60 rounded-lg text-sm transition-all hover:border-primary/40",!e.return_date&&"text-muted-foreground"),children:t.jsxs("div",{className:"flex items-center space-x-2",children:[t.jsx(J,{className:"h-4 w-4 text-primary/70"}),t.jsx("span",{className:"truncate",children:e.return_date?L(c(e.return_date)):"Select date"})]})})}),t.jsx(I,{className:"w-auto p-0 bg-background/95 backdrop-blur-xl border-white/20",align:"start",children:t.jsx(R,{mode:"single",selected:e.return_date?c(e.return_date):void 0,onSelect:r=>{const s=e.pickup_date&&r&&c(e.pickup_date).toDateString()===r.toDateString();a(n=>({...n,return_date:r?D(r):null,return_time:s?"":n.return_time})),o()},disabled:r=>{const s=new Date;s.setHours(0,0,0,0);const n=new Date(r);if(n.setHours(0,0,0,0),n<s||v(e.service_type,e.pickup_city,e.destination_city,r)||!e.pickup_date)return!0;const d=c(e.pickup_date),u=new Date(d);if(u.setHours(0,0,0,0),e.service_type==="city-to-city"&&e.pickup_time){const h=q(d,e.pickup_time),l=_e(d,e.pickup_time),_=new Date(r);_.setHours(0,0,0,0);const b=new Date(h);b.setHours(0,0,0,0);const w=new Date(l);return w.setHours(0,0,0,0),_<b||_>w}return n<u},initialFocus:!0,className:"pointer-events-auto"})})]}),!e.pickup_date&&t.jsx("p",{className:"text-xs text-accent dark:text-accent mt-1",children:"Select a pickup date first"})]}),p&&t.jsxs("div",{className:"space-y-1.5",children:[t.jsx(f,{label:"Delivery time",isValid:!!e.return_time,uppercase:!0}),t.jsxs(F,{value:e.return_time,onValueChange:r=>{a(s=>({...s,return_time:r})),o()},children:[t.jsx(G,{className:"h-11 bg-background/80 border border-border/60 rounded-lg backdrop-blur-sm text-sm transition-all hover:border-primary/40",children:t.jsxs("div",{className:"flex items-center space-x-2",children:[t.jsx(B,{className:"h-4 w-4 text-primary/70"}),t.jsx(K,{placeholder:"Select time"})]})}),t.jsx(Y,{className:"bg-background/95 backdrop-blur-xl border-white/20 z-50",children:(()=>{const r=e.pickup_date&&e.return_date&&c(e.pickup_date).toDateString()===c(e.return_date).toDateString();let s=y;if(e.service_type==="city-to-city"&&e.pickup_time&&e.return_date){const n=q(c(e.pickup_date),e.pickup_time);s=y.filter(d=>{const u=c(e.return_date),[h,l]=d.split(":").map(Number);return u.setHours(h,l,0,0),u>=n})}else if(r&&e.pickup_time){const n=parseInt(e.pickup_time.split(":")[0]),d=parseInt(e.pickup_time.split(":")[1]),u=n*60+d,h=e.service_type==="store"?180:60;s=y.filter(l=>{const _=parseInt(l.split(":")[0]),b=parseInt(l.split(":")[1]);return _*60+b>=u+h})}else e.return_date&&(s=y.filter(n=>!N(c(e.return_date),n)));return s.map(n=>t.jsx(W,{value:n,className:"text-sm py-2",children:C(n)},n))})()})]}),e.service_type==="city-to-city"&&e.pickup_time&&t.jsx("p",{className:"text-xs text-secondary dark:text-brand-periwinkle mt-1",children:"24-72 hours between pickup and drop-off"}),e.service_type!=="city-to-city"&&e.pickup_date&&e.return_date&&c(e.pickup_date).toDateString()===c(e.return_date).toDateString()&&t.jsxs("p",{className:"text-xs text-secondary dark:text-brand-periwinkle mt-1",children:["Same-day: min. ",e.service_type==="store"?"3 hours":"1 hour"," after pickup (",C(e.pickup_time),")"]}),t.jsx($,{selectedDate:e.return_date?c(e.return_date):null,selectedTime:e.return_time,onTimeError:()=>{}}),e.return_time&&X(e.return_time)&&t.jsx("p",{className:"text-xs text-accent dark:text-accent mt-1",children:"Out of hours — additional charges may apply"}),t.jsx("p",{className:"text-xs text-muted-foreground mt-2",children:"We confirm timing in advance and coordinate directly with your hotel or airport access."})]})]}),e.service_type==="direct"&&t.jsx("div",{className:"bg-primary/5 border border-primary/15 rounded-lg p-3",children:t.jsx("p",{className:"text-primary text-sm font-medium",children:"⚡ Direct transfer — direct same-city delivery after pickup"})})]}),t.jsxs("div",{className:"space-y-1.5 mb-6",children:[t.jsxs("label",{className:"block text-xs font-medium text-muted-foreground tracking-wider",children:["Additional instructions ",t.jsx("span",{className:"normal-case font-normal",children:"(optional)"})]}),t.jsx(me,{value:e.pickup_instructions,onChange:r=>a(s=>({...s,pickup_instructions:r.target.value,dropoff_instructions:r.target.value})),placeholder:"Access codes, floor numbers, hotel name, special requests...",className:"bg-background/80 border border-border/60 rounded-lg text-sm transition-all hover:border-primary/40 focu
1s-visible:ring-primary/30",rows:3})]}),T&&t.jsxs("div",{className:"mb-5 rounded-2xl border border-brand-midnight/15 bg-brand-soleil-tint p-4 sm:p-5",children:[t.jsxs("h3",{className:"text-sm font-bold text-brand-midnight font-lexend mb-1.5",children:["This address looks outside ",k.isValid&&e.destination_city||e.pickup_city]}),t.jsxs("p",{className:"text-xs text-muted-foreground mb-3",children:[k.isValid?"Your delivery address":"Your collection address"," doesn't appear to be in"," ",k.isValid&&e.destination_city||e.pickup_city,". Please correct it, or if you're moving luggage between cities, request a city-to-city quote instead."]}),t.jsx("a",{href:"/services/city-to-city",className:"text-xs font-semibold text-brand-midnight underline",children:"Get a city-to-city quote"})]}),t.jsxs("div",{className:"flex justify-between gap-3",children:[t.jsxs(j,{variant:"outline",onClick:()=>i("/booking/details"),className:"h-11 px-5 bg-background/50 border-border/40 rounded-xl text-sm hover:bg-background/80 transition-all",children:[t.jsx(le,{className:"w-4 h-4 mr-2"}),"Previous"]}),t.jsx("p",{className:"text-xs text-muted-foreground text-right",children:"You'll see your full booking summary before confirming."}),t.jsx(j,{onClick:re,disabled:!V,variant:"tag",className:"h-11 px-6 text-sm disabled:opacity-50",children:"Continue →"})]})]})}),t.jsx(xe,{bookingData:e})]})}export{ze as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.