PageSourceSearch

https://www.ptr.co.uk/_next/static/chunks/app/contact/page-59022729d8327edf.js

js ptr.co.uk collected 2026-10-07 00:04:37 UTC 19,211 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[977],{1364:(e,a,t)=>{"use strict";t.d(a,{T:()=>n});var s=t(5155),r=t(2115),l=t(1753);let n=r.forwardRef((e,a)=>{let{className:t,...r}=e;return(0,s.jsx)("textarea",{className:(0,l.cn)("flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",t),ref:a,...r})});n.displayName="Textarea"},1753:(e,a,t)=>{"use strict";t.d(a,{$g:()=>c,_B:()=>n,cn:()=>l,zI:()=>i});var s=t(9065),r=t(6253);t(8703),t(2996);let l=function(){for(var e=arguments.length,a=Array(e),t=0;t<e;t++)a[t]=arguments[t];return(0,r.QP)((0,s.$)(a))},n=(e,a)=>a<=7?Array.from({length:a},(e,a)=>a+1):e<=3?[1,2,3,"...",a-1,a]:e>=a-2?[1,2,"...",a-2,a-1,a]:[1,"...",e-1,e,e+1,"...",a],o=e=>Array.isArray(e)?e.map(o).join(" "):"object"==typeof e&&null!==e?e.hasOwnProperty("value")?e.value:Object.values(e).map(o).join(" "):"",i=e=>e.reduce((e,a)=>e+(a.value||""),""),c=e=>{let a="string"==typeof e?parseFloat(e):e;return new Intl.NumberFormat("en-GB",{style:"currency",currency:"GBP"}).format(a)}},2882:(e,a,t)=>{Promise.resolve().then(t.t.bind(t,95,23)),Promise.resolve().then(t.t.bind(t,5208,23)),Promise.resolve().then(t.bind(t,5170)),Promise.resolve().then(t.bind(t,3903))},3046:(e,a,t)=>{"use strict";t.d(a,{bq:()=>u,eb:()=>b,gC:()=>g,l6:()=>m,yv:()=>d});var s=t(5155),r=t(2115),l=t(3320),n=t(3029),o=t(1096),i=t(3257),c=t(1753);let m=l.bL;l.YJ;let d=l.WT,u=r.forwardRef((e,a)=>{let{className:t,children:r,...o}=e;return(0,s.jsxs)(l.l9,{ref:a,className:(0,c.cn)("flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm r
1ing-offset-background placeholder:text-muted-foreground focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1",t),...o,children:[r,(0,s.jsx)(l.In,{asChild:!0,children:(0,s.jsx)(n.A,{className:"h-4 w-4 opacity-50"})})]})});u.displayName=l.l9.displayName;let p=r.forwardRef((e,a)=>{let{className:t,...r}=e;return(0,s.jsx)(l.PP,{ref:a,className:(0,c.cn)("flex cursor-default items-center justify-center py-1",t),...r,children:(0,s.jsx)(o.A,{className:"h-4 w-4"})})});p.displayName=l.PP.displayName;let h=r.forwardRef((e,a)=>{let{className:t,...r}=e;return(0,s.jsx)(l.wn,{ref:a,className:(0,c.cn)("flex cursor-default items-center justify-center py-1",t),...r,children:(0,s.jsx)(n.A,{className:"h-4 w-4"})})});h.displayName=l.wn.displayName;let g=r.forwardRef((e,a)=>{let{className:t,children:r,position:n="popper",...o}=e;return(0,s.jsx)(l.ZL,{children:(0,s.jsxs)(l.UC,{ref:a,className:(0,c.cn)("relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2","popper"===n&&"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",t),position:n,...o,children:[(0,s.jsx)(p,{}),(0,s.jsx)(l.LM,{className:(0,c.cn)("p-1","popper"===n&&"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]"),children:r}),(0,s.jsx)(h,{})]})})});g.displayName=l.UC.displayName,r.forwardRef((e,a)=>{let{className:t,...r}=e;return(0,s.jsx)(l.JU,{ref:a,className:(0,c.cn)("py-1.5 pl-8 pr-2 text-sm font-semibold",t),...r})}).displayName=l.JU.displayName;let b=r.forwardRef((e,a)=>{let{className:t,children:r,...n}=e;return(0,s.jsxs)(l.q7,{ref:a,className:(0,c.cn)("relative flex w-full cursor-default select-none items-center rounded-md py-1.5 pl-8 pr-2 text-sm outline-hidden focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50",t),...n,children:[(0,s.jsx)("span",{className:"absolute left-2 flex h-3.5 w-3.5 items-center justify-center",children:(0,s.jsx)(l.VF,{children:(0,s.jsx)(i.A,{className:"h-4 w-4"})})}),(0,s.jsx)(l.p4,{children:r})]})});b.displayName=l.q7.displayName,r.forwardRef((e,a)=>{let{className:t,...r}=e;return(0,s.jsx)(l.wv,{ref:a,className:(0,c.cn)("-mx-1 my-1 h-px bg-muted",t),...r})}).displayName=l.wv.displayName},3578:(e,a,t)=>{"use strict";t.d(a,{$:()=>c,r:()=>i});var s=t(5155),r=t(2115),l=t(7),n=t(8417),o=t(1753);let i=(0,n.F)("inline-flex items-center rounded-md cursor-pointer justify-center uppercase font-bold gap-2 whitespace-nowrap text-xs sm:text-sm tracking-wider transition-colors focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",{variants:{variant:{default:"bg-accent text-white shadow-xs hover:bg-accent/90",destructive:"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40",outline:"border border-input bg-transparent text-white shadow-xs hover:bg-accent hover:text-accent-foreground",secondary:"bg-zinc-200 text-black shadow-xs hover:bg-zinc-200/90",ghost:"hover:bg-accent hover:text-accent-foreground",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-9 px-4 py-2 has-[>svg]:px-3",sm:"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",lg:"h-10 rounded-md px-6 has-[>svg]:px-4",icon:"size-9"}},defaultVariants:{variant:"default",size:"default"}}),c=r.forwardRef((e,a)=>{let{className:t,variant:r,size:n,asChild:c=!1,...m}=e,d=c?l.DX:"button";return(0,s.jsx)(d,{className:(0,o.cn)(i({variant:r,size:n,className:t})),ref:a,...m})});c.displayName="Button"},3903:(e,a,t)=>{"use strict";t.d(a,{ContactForm:()=>b});var s=t(5155),r=t(2115),l=t(712),n=t(9172),o=t(3578),i=t(8346),c=t(6912),m=t
1(1364),d=t(3046),u=t(1154);let p=(0,u.createServerReference)("6085d3a41d1d934fb4e063754271fb8a4cefaa36a8",u.callServer,void 0,u.findSourceMapURL,"sendContactMessageAction");var h=t(9372);let g=[{id:0,value:"general",label:"General"},{id:1,value:"consultancy",label:"Consultancy"},{id:2,value:"training",label:"Training"}],b=()=>{let e=(0,r.useRef)(null),[a,t]=(0,r.useState)({name:"",email:"",subject:"",category:"general",message:"",company:"",jobTitle:"",phoneNumber:""}),[u,b]=(0,r.useState)({name:"",email:"",subject:"",category:"",message:"",company:"",jobTitle:"",phoneNumber:"",submit:null}),[j,x,f]=(0,r.useActionState)(p,{success:"",error:void 0});function v(e){let{name:a,value:s}=e.target;t(e=>({...e,[a]:s})),y(a,s)}function y(e,t){let s={...a,[e]:t},r=h.Bw.safeParse(s);if(r.success)b(a=>({...a,[e]:""}));else{let a=r.error.issues.find(a=>a.path[0]===e);b(t=>{var s;return{...t,[e]:null!=(s=null==a?void 0:a.message)?s:""}})}}return(0,r.useEffect)(()=>{try{if(j.success){var a;n.oR.success(j.success),null==(a=e.current)||a.reset(),t({name:"",email:"",subject:"",category:"general",message:"",company:"",jobTitle:"",phoneNumber:""}),b({name:"",email:"",subject:"",category:"",message:"",company:"",jobTitle:"",phoneNumber:"",submit:null})}}catch(e){console.error("Error in success useEffect:",e)}},[j.success]),(0,r.useEffect)(()=>{try{j.error&&(console.error("Error submitting form:",j.error),n.oR.error("There was an error submitting the form. Please try again."))}catch(e){console.error("Error in error useEffect:",e)}},[j.error]),(0,s.jsxs)("form",{ref:e,action:function(e){let a=Object.fromEntries(e.entries()),t=h.Bw.safeParse(a);if(!t.success){let e={name:"",email:"",subject:"",category:"",message:"",company:"",jobTitle:"",phoneNumber:"",submit:null};t.error.issues.forEach(a=>{e[a.path[0]]=a.message}),b(e);return}try{x(e)}catch(e){console.error("Error during dispatch:",e),b(e=>({...e,submit:"Failed to submit form. Please try again."}))}},children:[(0,s.jsxs)("div",{className:"grid grid-cols-1 gap-5 md:grid-cols-2",children:[(0,s.jsxs)("div",{className:"col-span-2 flex flex-col gap-2",children:[(0,s.jsxs)(c.J,{htmlFor:"name",children:["Name ",(0,s.jsx)("span",{className:"text-red-500",children:"*"})]}),(0,s.jsx)(i.p,{id:"name",name:"name",placeholder:"Enter your name",value:a.name,onChange:v}),(null==u?void 0:u.name)&&(0,s.jsx)("p",{className:"text-xs text-red-500",children:u.name})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsxs)(c.J,{htmlFor:"email",children:["Email ",(0,s.jsx)("span",{className:"text-red-500",children:"*"})]}),(0,s.jsx)(i.p,{id:"email",name:"email",type:"email",placeholder:"Enter your email",value:a.email,onChange:v}),(null==u?void 0:u.email)&&(0,s.jsx)("p",{className:"text-xs text-red-500",children:u.email})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsx)(c.J,{htmlFor:"phoneNumber",children:"Phone Number"}),(0,s.jsx)(i.p,{id:"phoneNumber",name:"phoneNumber",placeholder:"Enter your phone number",value:a.phoneNumber,onChange:v}),(null==u?void 0:u.phoneNumber)&&(0,s.jsx)("p",{className:"text-xs text-red-500",children:u.phoneNumber})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsx)(c.J,{htmlFor:"company",children:"Company"}),(0,s.jsx)(i.p,{id:"company",name:"company",placeholder:"Enter your company name",value:a.company,onChange:v}),(null==u?void 0:u.company)&&(0,s.jsx)("p",{className:"text-xs text-red-500",children:u.company})]}),(0,s.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,s.jsx)(c.J,{htmlFor:"jobTitle",children:"Job Title"}),(0,s.jsx)(i.p,{id:"jobTitle",name:"jobTitle",placeholder:"Enter your job title",value:a.jobTitle,onChange:v}),(null==u?void 0:u.jobTitle)&&(0,s.jsx)("p",{className:"text-xs text-red-500",children:u.jobTitle})]}),(0,s.jsxs)("div",{className:"col-span-2 flex flex-col gap-2",children:[(0,s.jsxs)(c.J,{htmlFor:"category",children:["Category ",(0,s.jsx)("span",{className:"text-red-500",children:"*"})]}),(0,s.jsxs)(d.l6,{name:"category",value:a.category,onValueChange:function(e){t(a=>({...a,category:e})),y("category",e)},children:[(0,s.jsx)(d.bq,{className:u.category?"border-red-500":"",children:(0,s.jsx)(d.yv,{placeholder:"Select a category"})}),(0,s.jsx)(d.gC,{children:g.map(e=>(0,s.jsx)(d.eb,{value:e.value,children:e.label},e.id))})]}),(null==u?void 0:u.category)&&(0,s.jsx)("p",{className:"text-xs text-red-500",children:u.category})]}),(0,s.jsxs)("div",{className:"col-span-2 flex flex-col gap-2",children:[(0,s.jsxs)(c.J,{htmlFor:"subject",children:["Subject ",(0,s.jsx)("span",{className:"text-red-500",children:"*"})]}),(0,s.jsx)(i.p,{id:"subject",name:"subject",placeholder:"Enter your subject",value:a.subject,onChange:v}),(null==u?void 0:u.subject)&&(0,s.jsx)("p",{className:"text-xs text-red-500",children:u.subject})]}),(0,s.jsxs)("div",{className:"col-span-2 flex flex-col gap-2",children:[(0,s.jsxs)(c.J,{htmlFor:"message",children:["Message ",(0,s.jsx)("span",{className:"text-red-500",children:"*"})]}),(0,s.jsx)(m.T,{id:"message",name:"message",placeholder:"Enter your message",value:a.message,onChange:v}),(null==u?void 0:u.message)&&(0,s.jsx)("p",{className:"text-xs text-red-500",children:u.message})]})]}),(0,s.jsx)("div",{className:"mt-5 flex justify-end",children:(0,s.jsx)(o.$,{type:"submit",disabled:f,children:f?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(l.N,{className:"mr-2 size-4 animate-spin"}),"Submitting"]}):"Submit"})})]})}},5170:(e,a,t)=>{"use strict";t.d(a,{MapContainer:()=>m});var s=t(5155);t(3383);var r=t(2115),l=t(2756),n=t.n(l),o=t(5219),i=t(5995),c=t(8593);let m=e=>{let{location:a=c.GZ}=e;if(!n().supported())return(0,s.jsx)("div",{className:"p-4",children:"Your browser doesn't support Mapbox GL"});let[t,l]=(0,r.useState)();return(0,s.jsxs)(o.Ay,{style:{width:"100%",height:"100%"},mapStyle:"mapbox://styles/irobba/clzr7aj0u00d501qx2ki6hvpe",mapboxAccessToken:"pk.eyJ1IjoiaXJvYmJhIiwiYSI6ImNqdWwxa2M3ejF3N3ozeW9heTZlZm9ybWQifQ.6jn8erXGu6tl6706ZoQyXQ",initialViewState:{latitude:a.coordinates.latitude,longitude:a.coordinates.longitude,zoom:13,bearing:0,pitch:0}
1,maxZoom:15,minZoom:5,children:[(0,s.jsx)(o.pH,{longitude:a.coordinates.longitude,latitude:a.coordinates.latitude,anchor:"bottom",onClick:e=>{e.originalEvent.stopPropagation(),l({...a,location:a.coordinates})},children:(0,s.jsx)("div",{className:"flex cursor-pointer flex-col items-center",children:(0,s.jsx)(i.s,{size:32,weight:"fill",className:"text-accent"})})}),t&&(0,s.jsx)(o.zD,{anchor:"top",longitude:a.coordinates.longitude,latitude:a.coordinates.latitude,closeButton:!1,onClose:()=>l(null),children:(0,s.jsxs)("div",{children:[(0,s.jsx)("div",{className:"text-primary text-base font-bold uppercase",children:t.name}),(0,s.jsx)("div",{className:"mt-2 text-sm font-medium text-slate-700",children:t.address})]})})]})}},6912:(e,a,t)=>{"use strict";t.d(a,{J:()=>c});var s=t(5155),r=t(2115),l=t(1452),n=t(8417),o=t(1753);let i=(0,n.F)("text-xs text-slate-600 font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"),c=r.forwardRef((e,a)=>{let{className:t,...r}=e;return(0,s.jsx)(l.b,{ref:a,className:(0,o.cn)(i(),t),...r})});c.displayName=l.b.displayName},8346:(e,a,t)=>{"use strict";t.d(a,{p:()=>n});var s=t(5155),r=t(2115),l=t(1753);let n=r.forwardRef((e,a)=>{let{className:t,type:r,...n}=e;return(0,s.jsx)("input",{type:r,className:(0,l.cn)("flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm r
1ing-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",t),ref:a,...n})});n.displayName="Input"},8593:(e,a,t)=>{"use strict";t.d(a,{C1:()=>s,GZ:()=>r});let s="https://www.ptr.co.uk",r={name:"PTR Ltd",address:"21a Peach St Wokingham RG40 1XJ, UK",link:"https://goo.gl/maps/7Q1Q6QZ8Q5Q2",coordinates:{longitude:-.8319124166795705,latitude:51.410558051254334}}},9372:(e,a,t)=>{"use strict";t.d(a,{Bw:()=>r,HN:()=>d,NX:()=>n,Pb:()=>m,Sh:()=>i,ZO:()=>c,g7:()=>o,rC:()=>u,vv:()=>l});var s=t(6986);let r=s.Ik({name:s.Yj().min(1,"Name must be at least 1 character long.").max(100,"Name must be less than 100 characters long."),email:s.Yj().email("Invalid email address."),subject:s.Yj().min(1,"Subject must be at least 1 character long."),category:s.Yj({error:"Please select a category"}).min(1,"Please select a category").refine(e=>e&&e.trim().length>0,{message:"Please select a category"}),message:s.Yj().min(1,"Message must be at least 1 character long.").max(1e3,"Message must be less than 1000 characters long."),company:s.Yj().optional(),jobTitle:s.Yj().optional(),phoneNumber:s.Yj().optional(),pageUrl:s.Yj().optional()}),l=s.Ik({name:s.Yj().min(1,"Name must be at least 1 character long."),email:s.Yj().email("Invalid email address."),courseName:s.Yj().min(1,"Course name is required."),courseSlug:s.Yj(),message:s.Yj().min(1,"Message must be at least 1 character long."),numberOfDelegates:s.Yj().optional(),preferredDate:s.Yj().optional(),company:s.Yj().optional(),jobTitle:s.Yj().optional(),phoneNumber:s.Yj().optional(),pageUrl:s.Yj().optional(),subject:s.Yj().optional()}),n=s.Ik({name:s.Yj().min(1,"Name must be at least 1 character long."),company:s.Yj().min(1,"Company must be at least 1 character long."),job:s.Yj().min(1,"Job role must be at least 1 character long."),email:s.Yj().email("Invalid email address."),message:s.Yj().min(1,"Message must be at least 1 character long."),phoneNumber:s.Yj().optional(),pageUrl:s.Yj().optional(),subject:s.Yj().optional()}),o=s.Ik({name:s.Yj().min(1,"Name must be at least 1 character long."),email:s.Yj().email("Invalid email address."),skills:s.Yj().min(1,"Skills must be at least 1 character long."),platforms:s.Yj().min(1,"Platforms must be at least 1 character long."),languages:s.Yj().min(1,"Languages must be at least 1 character long."),message:s.Yj().min(1,"Message must be at least 1 character long."),company:s.Yj().optional(),jobTitle:s.Yj().optional(),phoneNumber:s.Yj().optional(),pageUrl:s.Yj().optional(),subject:s.Yj().optional()}),i=s.Ik({name:s.Yj().min(1,"Name must be at least 1 character long."),email:s.Yj().email("Invalid email address."),message:s.Yj().min(1,"Message must be at least 1 character long."),company:s.Yj().optional(),jobTitle:s.Yj().optional(),phoneNumber:s.Yj().optional(),pageUrl:s.Yj().optional(),subject:s.Yj().optional()});s.Ik({name:s.Yj().min(1,"Name must be at least 1 character long."),companyName:s.Yj().min(1,"Company name must be at least 1 character long."),role:s.Yj().min(1,"Role must be at least 1 character long."),phone:s.Yj().regex(/^[\d\s+()-]+$/,"Please enter a valid phone number."),email:s.Yj().email("Invalid email address."),message:s.Yj().min(1,"Message must be at least 1 character long."),pageUrl:s.Yj().optional(),subject:s.Yj().optional()});let c=s.Ik({name:s.Yj().min(1,"Name must be at least 1 character long.").max(100,"Name must be less than 100 characters long."),email:s.Yj().email("Invalid email address."),phoneNumber:s.Yj().min(1,"Phone number is required.").regex(/^[\d\s+()-]+$/,"Please enter a valid phone number."),message:s.Yj().min(1,"Message must be at least 1 character long.").max(1e3,"Message must be less than 1000 characters long."),company:s.Yj().optional(),jobTitle:s.Yj().optional(),pageUrl:s.Yj().optional(),subject:s.Yj().optional()}),m=s.Ik({name:s.Yj().min(1,"Name must be at least 1 character long.").max(100,"Name must be less than 100 characters long."),email:s.Yj().email("Invalid email address."),phoneNumber:s.Yj().min(1,"Phone number is required.").regex(/^[\d\s+()-]+$/,"Please enter a valid phone number."),message:s.Yj().min(1,"Message must be at least 1 character long.").max(1e3,"Message must be less than 1000 characters long."),company:s.Yj().optional(),jobTitle:s.Yj().optional(),pageUrl:s.Yj().optional(),subject:s.Yj().optional()}),d=s.Ik({name:s.Yj().min(1,"Name must be at least 1 character long.").max(100,"Name must be less than 100 characters long."),email:s.Yj().email("Invalid email address."),phoneNumber:s.Yj().min(1,"Phone number is required.").regex(/^[\d\s+()-]+$/,"Please enter a valid phone number."),message:s.Yj().min(1,"Message must be at least 1 character long.").max(1e3,"Message must be less than 1000 characters long."),company:s.Yj().optional(),jobTitle:s.Yj().optional(),pageUrl:s.Yj().optional(),subject:s.Yj().optional()}),u=s.Ik({name:s.Yj().min(1,"Name must be at least 1 character long.").max(100,"Name must be less than 100 characters long."),email:s.Yj().email("Invalid email address."),phoneNumber:s.Yj().min(1,"Phone number is required.").regex(/^[\d\s+()-]+$/,"Please enter a valid phone number."),message:s.Yj().min(1,"Message must be at least 1 character long.").max(1e3,"Message must be less than 1000 characters long."),company:s.Yj().optional(),jobTitle:s.Yj().optional(),pageUrl:s.Yj().optional(),subject:s.Yj().optional()})}},e=>{e.O(0,[4896,240,522,5701,4766,9750,4875,9814,5005,1359,8441,8261,7358],()=>e(e.s=2882)),_N_E=e.O()}]);

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.