UNPKG

@getontime/cli

Version:

Time keeping for live events

2 lines 17.9 kB
System.register(["./jsx-runtime-legacy-DMkDNnVj.js","./useSocket-legacy-C772wu7w.js","./Tooltip-legacy-DEkL5laM.js","./constants-legacy-CvecvM28.js","./useMutation-legacy-CHaWRMnS.js","./validateEvent-legacy-D8U6iXPD.js","./EmptyFill-legacy-CZaM-mIh.js","./parseUserTime-legacy-BAw2X6qu.js","./useRundown-legacy-zes2lKPp.js","./editorSettings-legacy-Bzf9rUwb.js"],function(e,t){var r,n,i,a,o,u,s,d,l,c,y,f,m,p,g,v,E,w,b,D,S,h,k,q,K,Q,O,I,_,C,T,R,A,M,j,L,F,x,W,$,G,N,P,U,z,H,Y,B,J,V,X,Z,ee,te;function re(e,t,r,n){if(null==n)return function(e,t,r){const n=ie(e),i=ie(t),a=ie(r);return null!=e&&null!=t?{timeStart:n,duration:ne(n,i),timeEnd:i,timeStrategy:null!=r?u.LockDuration:u.LockEnd}:null==e&&null==t?null==r?{timeStart:0,duration:0,timeEnd:0,timeStrategy:u.LockDuration}:{timeStart:n,duration:a,timeEnd:a,timeStrategy:u.LockDuration}:null!=e?{timeStart:n,duration:a,timeEnd:(n+a)%d,timeStrategy:u.LockDuration}:null!=t?{timeStart:i-a,duration:a,timeEnd:i,timeStrategy:null!=r?u.LockDuration:u.LockEnd}:{timeStart:n,duration:a,timeEnd:i,timeStrategy:u.LockDuration}}(e,t,r);const i=q(n),a=ie(e);let o=ie(t),s=ie(r);return i===u.LockEnd?s=ne(a,o):o=function(e,t){return(e+t)%d}(a,s),{timeStart:a,duration:s,timeEnd:o,timeStrategy:i}}function ne(e,t){return t<e?t+d-e:t-e}function ie(e){const t=Number(e);return isNaN(t)?0:Math.floor(t)}function ae(e,t){if(0===Object.keys(t).length)return e;const{timeStart:r,timeEnd:n,duration:i,timeStrategy:a}=re(t?.timeStart??e.timeStart,t?.timeEnd??e.timeEnd,t?.duration??e.duration,t?.timeStrategy??function(e,t,r){return e&&!t?u.LockEnd:!e&&t?u.LockDuration:r}(t?.timeEnd,t?.duration,e.timeStrategy));return{id:e.id,type:c.Event,flag:"boolean"==typeof t.flag?t.flag:e.flag,title:V(t.title,e.title),timeStart:r,timeEnd:n,duration:i,timeStrategy:a,linkStart:"boolean"==typeof t.linkStart?t.linkStart:e.linkStart,endAction:Q(t.endAction,e.endAction),timerType:K(t.timerType,e.timerType),countToEnd:"boolean"==typeof t.countToEnd?t.countToEnd:e.countToEnd,skip:"boolean"==typeof t.skip?t.skip:e.skip,note:V(t.note,e.note),colour:V(t.colour,e.colour),delay:e.delay,dayOffset:e.dayOffset,gap:e.gap,cue:V(t.cue??null,e.cue),parent:e.parent,revision:e.revision,timeWarning:t.timeWarning??e.timeWarning,timeDanger:t.timeDanger??e.timeDanger,custom:{...e.custom,...t.custom},triggers:t.triggers??e.triggers}}function oe(e,t){const r=[];for(const n of t)e.includes(n)&&r.push(n);return r}function ue(e){const t=w(),{linkPrevious:r,defaultTimeStrategy:n,defaultDuration:i,defaultWarnTime:l,defaultDangerTime:y,defaultTimerType:m,defaultEndAction:v,inheritGroupColour:D}=z(),h=(0,Z.useCallback)(()=>{if(void 0!==e)return E(e);const r=t.getQueryData(S)?.loaded;return r?E(r):b},[t,e]),q=(0,Z.useCallback)(()=>t.getQueryData(h()),[t,h]),K=(0,Z.useCallback)(e=>{const t=q();if(t?.entries)return t.entries[e]},[q]),{mutateAsync:Q}=k({mutationFn:([e,t])=>G(e,t),onMutate:async([e,r])=>{const n=h();await t.cancelQueries({queryKey:n});const i=t.getQueryData(n);if(i){const e=function(e){const{after:t,before:r,...n}=e,i=n.id;let a=null;switch("parent"in n&&n.parent&&(a=n.parent),n.type){case c.Event:return X({...n,id:i,parent:a});case c.Delay:return o={id:i,duration:n.duration??0,parent:a},{type:c.Delay,id:o?.id??g(),duration:o?.duration??0,parent:o?.parent??null};case c.Group:return function(e){return e?{id:e.id??g(),type:c.Group,title:e.title??"",note:e.note??"",entries:e.entries??[],targetDuration:e.targetDuration??null,colour:V(e.colour,""),custom:e.custom??{},revision:0,timeStart:null,timeEnd:null,duration:0,isFirstLinked:!1}:{...J,id:g()}}({...n,id:i});case c.Milestone:return function(e){return e?{id:e.id??g(),type:c.Milestone,cue:e.cue??"",title:e.title??"",note:e.note??"",colour:V(e.colour,""),custom:e.custom??{},parent:e.parent??null,revision:0}:{...B,id:g()}}({...n,id:i,parent:a});default:throw new Error("Unknown entry type")}var o}(r),o=I(i,r),u=o?i.entries[o]:null,s=u&&a(u)?u:null,d=O(i,s,r.after,r.before),l={...i,entries:{...i.entries},revision:-1};s&&o&&(l.entries[o]={...s,entries:[...s.entries]}),_(l,e,s?l.entries[s.id]:null,d,r.before??null),t.setQueryData(n,l)}return{previousData:i,queryKey:n}},onSuccess:(e,r,n)=>{if(!e.data||!n?.queryKey)return;const i=e.data,a=t.getQueryData(n.queryKey);a&&t.setQueryData(n.queryKey,{...a,entries:{...a.entries,[i.id]:i}})},onError:(e,r,n)=>{n?.previousData&&n?.queryKey&&t.setQueryData(n.queryKey,n.previousData)},onSettled:(e,r,n,i)=>{t.invalidateQueries({queryKey:i?.queryKey??h()})}}),H=(0,Z.useCallback)(async(e,t)=>{const u=q(),d=u?.id;if(!d)throw new Error("Rundown not initialised");const c={...e,id:g()};if(t?.after&&(c.after=t.after),t?.before&&(c.before=t.before),s(c)){if(t?.lastEventId){const e=u.entries[t?.lastEventId];s(e)&&(c.timeStart=e.timeEnd)}c.linkStart=t?.linkPrevious??r,void 0===c.duration&&void 0===c.timeEnd&&(c.duration=T(i)),void 0===c.timeDanger&&(c.timeDanger=T(y)),void 0===c.timeWarning&&(c.timeWarning=T(l)),void 0===c.timerType&&(c.timerType=m),void 0===c.endAction&&(c.endAction=v),void 0===c.timeStrategy&&(c.timeStrategy=n)}if(D&&(s(c)||o(c))&&!c.colour){const e=I(u,c),t=e?u.entries[e]:null;t&&a(t)&&(c.colour=t.colour)}try{await Q([d,c])}catch(p){f("Failed adding event",p)}},[q,r,i,y,l,m,v,n,D,Q]),{mutateAsync:Y}=k({mutationFn:([e,t,r])=>U(e,t,r),onMutate:()=>t.cancelQueries({queryKey:h()}),onSettled:()=>t.invalidateQueries({queryKey:h()})}),ee=(0,Z.useCallback)(async(e,t)=>{try{const r=q()?.id;if(!r)throw new Error("Rundown not initialised");await Y([r,e,t])}catch(r){f("Error cloning entry",r)}},[Y,q]),{mutateAsync:te}=k({mutationFn:([e,t])=>P(e,t),onMutate:async([e,r])=>{const n=h();await t.cancelQueries({queryKey:n});const i=t.getQueryData(n),a=r.id;if(i&&a){const e={...i.entries};e[a]={...e[a],...r},t.setQueryData(n,{id:i.id,title:i.title,order:i.order,flatOrder:i.flatOrder,entries:e,revision:-1})}return{previousData:i,newEvent:r,queryKey:n}},onError:(e,r,n)=>{n?.previousData&&n?.queryKey&&t.setQueryData(n.queryKey,n.previousData)},onSettled:async(e,r,n,i)=>{await t.invalidateQueries({queryKey:i?.queryKey??h()})}}),re=(0,Z.useCallback)(async e=>{try{const t=q()?.id;if(!t)throw new Error("Rundown not initialised");await te([t,e])}catch(t){f("Error updating event",t)}},[q,te]),ne=(0,Z.useCallback)(async(e,r,n,i)=>{const a=q()?.id;if(!a)throw new Error("Rundown not initialised");if(!i&&""===n)return;const o={id:e};i?"timeEnd"===r?(o.timeStrategy=""===n?u.LockDuration:u.LockEnd,o.timeEnd=""===n?void 0:l()):"duration"===r?(o.timeStrategy=""===n?u.LockEnd:u.LockDuration,o.duration=""===n?void 0:l()):"timeStart"===r&&(o.linkStart=""===n,o.timeStart=""===n?void 0:l()):o[r]=l();try{await te([a,o])}catch(y){f("Error updating event",y)}function l(){let e=0;if("p"===n||"prev"===n||"previous"===n)e=c();else if(n.startsWith("+")||n.startsWith("p+")||n.startsWith("p +")){const t=n.substring(1);e=c()+T(t)}else e=T(n);return Math.min(e,d-p)}function c(){const r=t.getQueryData(h());if(!r?.order||!r?.entries)return 0;const n=r.order.indexOf(e);if(0===n)return 0;let i=0;for(let e=n-1;e>=0;e--){const t=r.entries[r.order[e]];if(s(t)){i=t.timeEnd;break}}return i}},[q,te,t,h]),ie=(0,Z.useCallback)(async e=>{const t=q()?.id;if(!t)throw new Error("Rundown not initialised");try{await L(t,e)}catch(r){f("Error updating event",r)}},[q]),{mutateAsync:ae}=k({mutationFn:([e,t])=>x(e,t),onMutate:async([e,r])=>{const n=h();await t.cancelQueries({queryKey:n});const i=t.getQueryData(n);if(i){const e=new Set(r.ids),a={...i.entries};e.forEach(e=>{if(Object.hasOwn(a,e)){const t=a[e];s(t)&&(a[e]={...t,...r})}}),t.setQueryData(n,{id:i.id,title:i.title,order:i.order,flatOrder:i.flatOrder,entries:a,revision:-1})}return{previousRundown:i,queryKey:n}},onSuccess:(e,r,n)=>{if(!e.data||!n?.queryKey)return;const{id:i,title:a,order:o,flatOrder:u,entries:s,revision:d}=e.data;t.setQueryData(n.queryKey,{id:i,title:a,order:o,flatOrder:u,entries:s,revision:d})},onError:(e,r,n)=>{n?.queryKey&&t.setQueryData(n.queryKey,n?.previousRundown)}}),ue=(0,Z.useCallback)(async(e,t)=>{try{const r=q()?.id;if(!r)throw new Error("Rundown not initialised");await ae([r,{data:e,ids:t}])}catch(r){f("Error updating events",r)}},[ae,q]),{mutateAsync:se}=k({mutationFn:([e,t])=>W(e,t),onMutate:async()=>{const e=h();return await t.cancelQueries({queryKey:e}),{previousRundown:t.getQueryData(e),queryKey:e}},onSuccess:(e,r,n)=>{if(!e.data||!n?.queryKey)return;const i=e.data;t.setQueryData(n.queryKey,i)},onError:(e,r,n)=>{n?.previousRundown&&t.setQueryData(n.queryKey,n.previousRundown)}}),de=(0,Z.useCallback)(async(e,t,r,n)=>{const i=q()?.id;if(!i)throw new Error("Rundown not initialized");try{await se([i,{ids:e,prefix:t,start:r,increment:n}])}catch(a){throw f("Error renumbering cues",a),a}},[q,se]),{mutateAsync:le}=k({mutationFn:([e,t])=>$(e,t),onMutate:async([e,r])=>{const n=h();await t.cancelQueries({queryKey:n});const i=t.getQueryData(n);if(i){const{entries:e,order:o,flatOrder:u}=function(e,t){const r={...t.entries};let n=[...t.order],i=[...t.flatOrder];for(let a=0;a<e.length;a++)o(r[e[a]]);function o(e){if(a(e)||!e.parent)n=n.filter(t=>t!==e.id);else{const t=r[e.parent];t&&a(t)&&(t.entries=t.entries.filter(t=>t!==e.id))}delete r[e.id],i=i.filter(t=>t!==e.id)}return{entries:r,order:n,flatOrder:i}}(r,i);t.setQueryData(n,{id:i.id,title:i.title,order:o,flatOrder:u,entries:e,revision:-1})}return{previousData:i,queryKey:n}},onError:(e,r,n)=>{n?.queryKey&&t.setQueryData(n.queryKey,n?.previousData)},onSettled:(e,r,n,i)=>{t.invalidateQueries({queryKey:i?.queryKey??h()})}}),ce=(0,Z.useCallback)(async e=>{try{const t=q()?.id;if(!t)throw new Error("Rundown not initialised");await le([t,e])}catch(t){f("Error deleting event",t)}},[le,q]),{mutateAsync:ye}=k({mutationFn:([e])=>R(e),onMutate:async()=>{const e=h();await t.cancelQueries({queryKey:e});const r=t.getQueryData(e);return t.setQueryData(e,{id:r?.id??"default",title:r?.title??"",order:[],flatOrder:[],entries:{},revision:-1}),{previousData:r,queryKey:e}},onError:(e,r,n)=>{n?.queryKey&&t.setQueryData(n.queryKey,n?.previousData)},onSettled:(e,r,n,i)=>{t.invalidateQueries({queryKey:i?.queryKey??h()})}}),fe=(0,Z.useCallback)(async()=>{try{const e=q()?.id;if(!e)throw new Error("Rundown not initialised");await ye([e])}catch(e){f("Error deleting events",e)}},[ye,q]),{mutateAsync:me}=k({mutationFn:([e,t])=>j(e,t),onMutate:()=>t.cancelQueries({queryKey:h()}),onSuccess:e=>{if(!e.data)return;const{id:r,title:n,order:i,flatOrder:a,entries:o,revision:u}=e.data;t.setQueryData(h(),{id:r,title:n,order:i,flatOrder:a,entries:o,revision:u})},onSettled:()=>{t.invalidateQueries({queryKey:h()})}}),pe=(0,Z.useCallback)(async e=>{try{const t=q()?.id;if(!t)throw new Error("Rundown not initialised");await me([t,e])}catch(t){f("Error applying delay",t)}},[me,q]),{mutateAsync:ge}=k({mutationFn:([e,t])=>A(e,t),onMutate:()=>t.cancelQueries({queryKey:h()}),onSuccess:e=>{if(!e.data)return;const{id:r,title:n,order:i,flatOrder:a,entries:o,revision:u}=e.data;t.setQueryData(h(),{id:r,title:n,order:i,flatOrder:a,entries:o,revision:u})},onSettled:()=>t.invalidateQueries({queryKey:h()})}),ve=(0,Z.useCallback)(async e=>{try{const t=q()?.id;if(!t)throw new Error("Rundown not initialised");await ge([t,e])}catch(t){f("Error dissolving group",t)}},[q,ge]),{mutateAsync:Ee}=k({mutationFn:([e,t])=>M(e,t),onMutate:()=>t.cancelQueries({queryKey:h()}),onSuccess:e=>{if(!e.data)return;const{id:r,title:n,order:i,flatOrder:a,entries:o,revision:u}=e.data;t.setQueryData(h(),{id:r,title:n,order:i,flatOrder:a,entries:o,revision:u})},onSettled:()=>t.invalidateQueries({queryKey:h()})}),we=(0,Z.useCallback)(async e=>{if(0!==e.length)try{const t=q(),r=t?.id;if(!r)throw new Error("Rundown not initialised");1===e.length?await Ee([r,e]):await Ee([r,oe(e,t.flatOrder)])}catch(t){f("Error grouping entries",t)}},[q,Ee]),{mutateAsync:be}=k({mutationFn:([e,t])=>F(e,t),onMutate:()=>t.cancelQueries({queryKey:h()}),onSettled:()=>{t.invalidateQueries({queryKey:h()})}}),De=(0,Z.useCallback)(async(e,t)=>{try{const r=q(),n=r?.id;if(!n)throw new Error("Rundown not initialised");const{destinationId:i,order:o}="up"===t?function(e,t,r){const n=r[e],i=t[t.indexOf(e)-1];if(!i)return"parent"in n&&null!==n.parent?{destinationId:n.parent,order:"before"}:{destinationId:null,order:"before"};if(a(n)){const e=r[i];return"parent"in e&&null!==e.parent?{destinationId:e.parent,order:"before"}:{destinationId:i,order:"before"}}const o=r[i],u=n.parent;return a(o)?null===u?{destinationId:i,order:"insert"}:{destinationId:i,order:"before"}:"parent"in o&&null!==o.parent&&null===u?{destinationId:i,order:"after"}:{destinationId:i,order:"before"}}(e,r.flatOrder,r.entries):function(e,t,r){const n=r[e],i=t.indexOf(e),o=t[i+1];if("parent"in n&&null!==n.parent){const t=r[n.parent];if(a(t)&&t.entries[t.entries.length-1]===e)return{destinationId:n.parent,order:"after"}}if(!o)return{destinationId:null,order:"after"};if(a(n)){if(n.entries.includes(o)){const e=t[i+n.entries.length+1];return e?{destinationId:e,order:"after"}:{destinationId:null,order:"after"}}return{destinationId:o,order:"after"}}const u=r[o],s=n.parent;return a(u)&&null===s?0===u.entries.length?{destinationId:o,order:"insert"}:{destinationId:u.entries[0],order:"before"}:("parent"in u&&u.parent,{destinationId:o,order:"after"})}(e,r.flatOrder,r.entries);if(!i)return;return await be([n,{entryId:e,destinationId:i,order:o}]),r.entries[i]?.type===c.Group?i:void 0}catch(r){f("Error re-ordering event",r)}},[q,be]),Se=(0,Z.useCallback)(async(e,t,r)=>{try{const n=q()?.id;if(!n)throw new Error("Rundown not initialised");await be([n,{entryId:e,destinationId:t,order:r}])}catch(n){throw f("Error re-ordering event",n),n}},[q,be]),{mutateAsync:he}=k({mutationFn:([e,t,r])=>N(e,t,r),onMutate:async([e,r,n])=>{const i=h();await t.cancelQueries({queryKey:i});const a=t.getQueryData(i);if(a){const e={...a.entries},o=a.entries[r],u=a.entries[n];if(!s(o)||!s(u))return;const[d,l]=C(o,u);e[r]=d,e[n]=l,t.setQueryData(i,{id:a.id,title:a.title,order:a.order,flatOrder:a.flatOrder,entries:e,revision:-1})}return{previousData:a,queryKey:i}},onError:(e,r,n)=>{n?.queryKey&&t.setQueryData(n.queryKey,n?.previousData)},onSettled:(e,r,n,i)=>{t.invalidateQueries({queryKey:i?.queryKey??h()})}}),ke=(0,Z.useCallback)(async(e,t)=>{try{const r=q()?.id;if(!r)throw new Error("Rundown not initialised");await he([r,e,t])}catch(r){f("Error re-ordering event",r)}},[q,he]);return(0,Z.useMemo)(()=>({addEntry:H,applyDelay:pe,batchUpdateEvents:ue,clone:ee,deleteEntry:ce,deleteAllEntries:fe,ungroup:ve,getEntryById:K,groupEntries:we,move:De,reorderEntry:Se,renumberCues:de,swapEvents:ke,updateEntry:re,updateTimer:ne,matchGroupDuration:ie}),[H,pe,ue,ee,ce,fe,ve,K,we,De,Se,de,ke,re,ne,ie])}function se(e,t="compact"){if(null==e||0===e)return"";const r=e<0,n=Math.abs(e),i="compact"===t,a=i?"+":"delayed by ",o=i?"-":"ahead by ";return n<6e4?`${r?o:a}${y(n,"s")} sec`:n<36e5&&n%6e4==0?`${r?o:a}${y(n,"m")} min`:`${r?o:a}${y(n,"HH:mm:ss")}`}return e({a:function(e,t,r,n){return"end-group"===e?"after"===r:"group"===e?!(void 0!==r&&"after"===r&&!n):null===t},c:oe,n:se,o:function(e,t,r){return e.filter(e=>{if(e.startsWith("end-")){const t=e.split("end-")[1];return!r(t)}const n=t[e];return!(!n||n.type!==c.Group&&"parent"in n&&n.parent&&r(n.parent))})},s:function(e,t){const r=[];for(let n=0;n<e.length;n++){const i=t[e[n]];i&&(a(i)?(r.push(i.id),r.push(...i.entries),r.push(`end-${i.id}`)):r.push(i.id))}return r},t:function(e){const{delayValue:t,tooltipPrefix:r}=e;return"number"!=typeof t||0===t?null:(0,te.jsx)(v,{text:r?`${r} ${se(t)}`:se(t),render:(0,te.jsx)("span",{}),className:ee.delaySymbol,children:t<0?(0,te.jsx)(D,{}):(0,te.jsx)(h,{})})}}),{setters:[function(e){r=e.a,n=e.n,i=e.t},function(e){e.Ct,a=e.Ft,o=e.It,u=e.Jt,s=e.Pt,e.St,d=e.Tt,l=e.Xt,c=e.Yt,y=e.gt,f=e.q,m=e.qt,p=e.wt,g=e.xt},function(e){v=e.t},function(e){E=e.S,w=e.bn,b=e.c,D=e.ft,S=e.p,h=e.pt},function(e){k=e.t},function(e){q=e.n,K=e.r,Q=e.t},function(e){O=e.a,I=e.f,_=e.n,C=e.p},function(e){T=e.t},function(e){R=e.C,A=e.D,M=e.E,j=e.S,L=e.T,F=e._,x=e.b,W=e.g,$=e.m,G=e.v,N=e.w,P=e.x,U=e.y},function(e){z=e.n}],execute:function(){(H=document.createElement("style")).textContent="._blink_1vba8_1{animation:1s step-start infinite _blink_1vba8_1}@keyframes _blink_1vba8_1{0%{opacity:1}50%{opacity:.2}}._fourtyfive_1vba8_13{transform:rotate(45deg)}._delaySymbol_1vba8_17 svg{vertical-align:middle;color:#f57c13;margin:0 auto;font-size:1.5rem;display:inline}\n/*$vite$:1*/",document.head.appendChild(H),function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{};e.SENTRY_RELEASE={id:"f14ad0099eab1969fdd065b56af5fdd3cf530de6"};var t=(new e.Error).stack;t&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[t]="98eaeb1c-7525-4062-9959-6451015fd189",e._sentryDebugIdIdentifier="sentry-dbid-98eaeb1c-7525-4062-9959-6451015fd189")}catch(e){}}(),Y={type:c.Event,flag:!1,title:"",note:"",endAction:l.None,timerType:m.CountDown,timeStrategy:u.LockDuration,linkStart:!1,countToEnd:!1,timeStart:0,timeEnd:0,duration:0,skip:!1,colour:"",timeWarning:12e4,timeDanger:6e4,triggers:[],custom:{},parent:null,revision:0,delay:0,dayOffset:0,gap:0},c.Delay,B={type:c.Milestone,cue:"",title:"",note:"",colour:"",custom:{},parent:null,revision:0},J={type:c.Group,title:"",note:"",entries:[],targetDuration:null,colour:"",custom:{},revision:0,timeStart:null,timeEnd:null,duration:0,isFirstLinked:!1},V=(e,t="")=>"string"==typeof e?e.trim():null==e||e.constructor===Object?t:e.toString().trim(),X=(e,t="")=>{if(0===Object.keys(e).length)return null;const r="number"==typeof t?String(t+1):t;return ae({id:e?.id??g(),cue:r,...Y},e)},Z=r(n(),1),e("r",()=>ue(void 0)),e("i",e=>ue(e??"")),ee={blink:"_blink_1vba8_1",fourtyfive:"_fourtyfive_1vba8_13",delaySymbol:"_delaySymbol_1vba8_17"},te=i()}}}); //# sourceMappingURL=DelayIndicator-legacy-CnsTYEkX.js.map