diff --git a/404.html b/404.html index 910c6b1..2599e59 100644 --- a/404.html +++ b/404.html @@ -12,10 +12,10 @@ gtag('config', 'GTAG-5X2QZ4H', {"send_page_view":false}); } - 404: Not Found

404: Not Found

You just hit a route that doesn't exist...

Current partners

UP
+ 404: Not Found

404: Not Found

You just hit a route that doesn't exist...

UP
- \ No newline at end of file + \ No newline at end of file diff --git a/404/index.html b/404/index.html index ed6c3c0..98c0f7a 100644 --- a/404/index.html +++ b/404/index.html @@ -12,10 +12,10 @@ gtag('config', 'GTAG-5X2QZ4H', {"send_page_view":false}); } - 404: Not Found

404: Not Found

You just hit a route that doesn't exist...

Current partners

UP
+ 404: Not Found

404: Not Found

You just hit a route that doesn't exist...

UP
- \ No newline at end of file + \ No newline at end of file diff --git a/_gatsby/slices/_gatsby-scripts-1.html b/_gatsby/slices/_gatsby-scripts-1.html index 26d5de8..6d0976e 100644 --- a/_gatsby/slices/_gatsby-scripts-1.html +++ b/_gatsby/slices/_gatsby-scripts-1.html @@ -4,4 +4,4 @@ > window.___chunkMapping="{\"app\":[\"/app-f6366dd67339bd975dc4.js\"],\"component---src-pages-404-js\":[\"/component---src-pages-404-js-39d97ca7680a51587536.js\"],\"component---src-pages-index-js\":[\"/component---src-pages-index-js-337330418dbc96a7a2bf.js\"],\"component---src-templates-blog-page-js\":[\"/component---src-templates-blog-page-js-37cc6877596c0b4e3217.js\"],\"component---src-templates-news-js\":[\"/component---src-templates-news-js-903039fb64c09a7c273b.js\"],\"component---src-templates-page-js\":[\"/component---src-templates-page-js-c3d746eb09ed5a1fb67d.js\"]}"; - \ No newline at end of file + \ No newline at end of file diff --git a/about/index.html b/about/index.html index 925d705..ae96eae 100644 --- a/about/index.html +++ b/about/index.html @@ -18,10 +18,10 @@

Membership is free. Join by subscribing to the FISH Mailing List and participate in our forum discussions where all meeting papers and presentations are also made available.

Forum meetings are held twice a year, to discuss strategic and technical issues and developments. The meetings combine the efforts of both FISH and HEIRNET (Historic Environment Information Resources Network), two organisations with similar interests and aims.

A smaller Terminology Working Group also meets regularly, to discuss vocabulary issues and candidate terms for the collection of thesauri and authority files produced by or on behalf of FISH.

-

FISH was established in 1998 as a non for profit organisation. We are a formally convened group with terms of reference and a national profile. FISH is not a legal entity and we have no employed staff, income or budget. There are currently over 400 members.

Current partners

UP
+

FISH was established in 1998 as a non for profit organisation. We are a formally convened group with terms of reference and a national profile. FISH is not a legal entity and we have no employed staff, income or budget. There are currently over 400 members.

UP
- \ No newline at end of file + \ No newline at end of file diff --git a/become-a-fish-member/index.html b/become-a-fish-member/index.html index 0b6a39a..98e8c80 100644 --- a/become-a-fish-member/index.html +++ b/become-a-fish-member/index.html @@ -26,10 +26,10 @@
  • JISCMail: https://www.jiscmail.ac.uk/help/subscribers/groupsubscriptions.html
  • Settings: https://www.jiscmail.ac.uk/cgi-bin/webadmin?SHOWTPL=HELP-SUBEDIT&L=FISH
  • -

    Email discussion lists for the UK Education and Research communities

    Current partners

    UP
    +

    Email discussion lists for the UK Education and Research communities

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/chronology/index.html b/chronology/index.html index 3b89075..0139781 100644 --- a/chronology/index.html +++ b/chronology/index.html @@ -276,10 +276,10 @@

    Centuries

  • Uncertain
  • -

    Current partners

    UP
    +
    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/commons-7416e8653b7647b140e4.js b/commons-7416e8653b7647b140e4.js new file mode 100644 index 0000000..6e7fe74 --- /dev/null +++ b/commons-7416e8653b7647b140e4.js @@ -0,0 +1,3 @@ +/*! For license information please see commons-7416e8653b7647b140e4.js.LICENSE.txt */ +(self.webpackChunkhistoric_england_heritage_standards=self.webpackChunkhistoric_england_heritage_standards||[]).push([[223],{2729:function(e){"use strict";const t=/[\p{Lu}]/u,n=/[\p{Ll}]/u,a=/^[\p{Lu}](?![\p{Lu}])/gu,o=/([\p{Alpha}\p{N}_]|$)/u,i=/[_.\- ]+/,r=new RegExp("^"+i.source),c=new RegExp(i.source+o.source,"gu"),s=new RegExp("\\d+"+o.source,"gu"),l=(e,o)=>{if("string"!=typeof e&&!Array.isArray(e))throw new TypeError("Expected the input to be `string | string[]`");if(o={pascalCase:!1,preserveConsecutiveUppercase:!1,...o},0===(e=Array.isArray(e)?e.map((e=>e.trim())).filter((e=>e.length)).join("-"):e.trim()).length)return"";const i=!1===o.locale?e=>e.toLowerCase():e=>e.toLocaleLowerCase(o.locale),l=!1===o.locale?e=>e.toUpperCase():e=>e.toLocaleUpperCase(o.locale);if(1===e.length)return o.pascalCase?l(e):i(e);return e!==i(e)&&(e=((e,a,o)=>{let i=!1,r=!1,c=!1;for(let s=0;s(a.lastIndex=0,e.replace(a,(e=>t(e)))))(e,i):i(e),o.pascalCase&&(e=l(e.charAt(0))+e.slice(1)),((e,t)=>(c.lastIndex=0,s.lastIndex=0,e.replace(c,((e,n)=>t(n))).replace(s,(e=>t(e)))))(e,l)};e.exports=l,e.exports.default=l},2532:function(e,t,n){"use strict";n.d(t,{G:function(){return H},L:function(){return g},M:function(){return E},P:function(){return w},S:function(){return q},_:function(){return c},a:function(){return r},b:function(){return d},c:function(){return l},g:function(){return p},h:function(){return s}});var a=n(6540),o=(n(2729),n(5556)),i=n.n(o);function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0||(o[n]=e[n]);return o}const s=()=>"undefined"!=typeof HTMLImageElement&&"loading"in HTMLImageElement.prototype;const l=e=>{var t;return(e=>{var t,n;return Boolean(null==e||null==(t=e.images)||null==(n=t.fallback)?void 0:n.src)})(e)?e:(e=>Boolean(null==e?void 0:e.gatsbyImageData))(e)?e.gatsbyImageData:(e=>Boolean(null==e?void 0:e.gatsbyImage))(e)?e.gatsbyImage:null==e||null==(t=e.childImageSharp)?void 0:t.gatsbyImageData};function u(e,t,n){const a={};let o="gatsby-image-wrapper";return"fixed"===n?(a.width=e,a.height=t):"constrained"===n&&(o="gatsby-image-wrapper gatsby-image-wrapper-constrained"),{className:o,"data-gatsby-image-wrapper":"",style:a}}function d(e,t,n,a,o){return void 0===o&&(o={}),r({},n,{loading:a,shouldLoad:e,"data-main-image":"",style:r({},o,{opacity:t?1:0})})}function p(e,t,n,a,o,i,c,s){const l={};i&&(l.backgroundColor=i,"fixed"===n?(l.width=a,l.height=o,l.backgroundColor=i,l.position="relative"):("constrained"===n||"fullWidth"===n)&&(l.position="absolute",l.top=0,l.left=0,l.bottom=0,l.right=0)),c&&(l.objectFit=c),s&&(l.objectPosition=s);const u=r({},e,{"aria-hidden":!0,"data-placeholder-image":"",style:r({opacity:t?0:1,transition:"opacity 500ms linear"},l)});return u}const m=["children"],f=function(e){let{layout:t,width:n,height:o}=e;return"fullWidth"===t?a.createElement("div",{"aria-hidden":!0,style:{paddingTop:o/n*100+"%"}}):"constrained"===t?a.createElement("div",{style:{maxWidth:n,display:"block"}},a.createElement("img",{alt:"",role:"presentation","aria-hidden":"true",src:`data:image/svg+xml;charset=utf-8,%3Csvg%20height='${o}'%20width='${n}'%20xmlns='http://www.w3.org/2000/svg'%20version='1.1'%3E%3C/svg%3E`,style:{maxWidth:"100%",display:"block",position:"static"}})):null},g=function(e){let{children:t}=e,n=c(e,m);return a.createElement(a.Fragment,null,a.createElement(f,r({},n)),t,null)},h=["src","srcSet","loading","alt","shouldLoad"],v=["fallback","sources","shouldLoad"],y=function(e){let{src:t,srcSet:n,loading:o,alt:i="",shouldLoad:s}=e,l=c(e,h);return a.createElement("img",r({},l,{decoding:"async",loading:o,src:s?t:void 0,"data-src":s?void 0:t,srcSet:s?n:void 0,"data-srcset":s?void 0:n,alt:i}))},b=function(e){let{fallback:t,sources:n=[],shouldLoad:o=!0}=e,i=c(e,v);const s=i.sizes||(null==t?void 0:t.sizes),l=a.createElement(y,r({},i,t,{sizes:s,shouldLoad:o}));return n.length?a.createElement("picture",null,n.map((e=>{let{media:t,srcSet:n,type:i}=e;return a.createElement("source",{key:`${t}-${i}-${n}`,type:i,media:t,srcSet:o?n:void 0,"data-srcset":o?void 0:n,sizes:s})})),l):l};var _;y.propTypes={src:o.string.isRequired,alt:o.string.isRequired,sizes:o.string,srcSet:o.string,shouldLoad:o.bool},b.displayName="Picture",b.propTypes={alt:o.string.isRequired,shouldLoad:o.bool,fallback:o.exact({src:o.string.isRequired,srcSet:o.string,sizes:o.string}),sources:o.arrayOf(o.oneOfType([o.exact({media:o.string.isRequired,type:o.string,sizes:o.string,srcSet:o.string.isRequired}),o.exact({media:o.string,type:o.string.isRequired,sizes:o.string,srcSet:o.string.isRequired})]))};const k=["fallback"],w=function(e){let{fallback:t}=e,n=c(e,k);return t?a.createElement(b,r({},n,{fallback:{src:t},"aria-hidden":!0,alt:""})):a.createElement("div",r({},n))};w.displayName="Placeholder",w.propTypes={fallback:o.string,sources:null==(_=b.propTypes)?void 0:_.sources,alt:function(e,t,n){return e[t]?new Error(`Invalid prop \`${t}\` supplied to \`${n}\`. Validation failed.`):null}};const E=function(e){return a.createElement(a.Fragment,null,a.createElement(b,r({},e)),a.createElement("noscript",null,a.createElement(b,r({},e,{shouldLoad:!0}))))};E.displayName="MainImage",E.propTypes=b.propTypes;const C=["as","className","class","style","image","loading","imgClassName","imgStyle","backgroundColor","objectFit","objectPosition"],x=["style","className"],S=e=>e.replace(/\n/g,""),A=function(e,t,n){for(var a=arguments.length,o=new Array(a>3?a-3:0),r=3;rJSON.stringify(o.images)),[o.images]);p&&(d=p);const S=function(e,t,n){let a="";return"fullWidth"===e&&(a=``),"constrained"===e&&(a=`
    `),a}(b,v,y);return(0,a.useEffect)((()=>{O||(O=n.e(108).then(n.bind(n,1108)).then((e=>{let{renderImageToString:t,swapPlaceholderImage:n}=e;return P=t,{renderImageToString:t,swapPlaceholderImage:n}})));const e=C.current.querySelector("[data-gatsby-image-ssr]");if(e&&s())return e.complete?(null==m||m({wasCached:!0}),null==f||f({wasCached:!0}),setTimeout((()=>{e.removeAttribute("data-gatsby-image-ssr")}),0)):(null==m||m({wasCached:!0}),e.addEventListener("load",(function t(){e.removeEventListener("load",t),null==f||f({wasCached:!0}),setTimeout((()=>{e.removeAttribute("data-gatsby-image-ssr")}),0)}))),void j.add(x);if(P&&j.has(x))return;let t,a;return O.then((e=>{let{renderImageToString:n,swapPlaceholderImage:c}=e;C.current&&(C.current.innerHTML=n(r({isLoading:!0,isLoaded:j.has(x),image:o},h)),j.has(x)||(t=requestAnimationFrame((()=>{C.current&&(a=c(C.current,x,j,i,m,f,g))}))))})),()=>{t&&cancelAnimationFrame(t),a&&a()}}),[o]),(0,a.useLayoutEffect)((()=>{j.has(x)&&P&&(C.current.innerHTML=P(r({isLoading:j.has(x),isLoaded:j.has(x),image:o},h)),null==m||m({wasCached:!0}),null==f||f({wasCached:!0}))}),[o]),(0,a.createElement)(t,r({},E,{style:r({},k,i,{backgroundColor:l}),className:`${w}${d?` ${d}`:""}`,ref:C,dangerouslySetInnerHTML:{__html:S},suppressHydrationWarning:!0}))},H=(0,a.memo)((function(e){return e.image?(0,a.createElement)(M,e):null}));H.propTypes=N,H.displayName="GatsbyImage";const $=["src","__imageData","__error","width","height","aspectRatio","tracedSVGOptions","placeholder","formats","quality","transformOptions","jpgOptions","pngOptions","webpOptions","avifOptions","blurredOptions","breakpoints","outputPixelDensities"];function I(e){return function(t){let{src:n,__imageData:o,__error:i}=t,s=c(t,$);return i&&console.warn(i),o?a.createElement(e,r({image:o},s)):(console.warn("Image not loaded",n),null)}}const Z=I((function(e){let{as:t="div",className:n,class:o,style:i,image:s,loading:l="lazy",imgClassName:m,imgStyle:f,backgroundColor:h,objectFit:v,objectPosition:y}=e,b=c(e,C);if(!s)return console.warn("[gatsby-plugin-image] Missing image prop"),null;o&&(n=o),f=r({objectFit:v,objectPosition:y,backgroundColor:h},f);const{width:_,height:k,layout:A,images:N,placeholder:T,backgroundColor:L}=s,j=u(_,k,A),{style:O,className:P}=j,M=c(j,x),H={fallback:void 0,sources:[]};return N.fallback&&(H.fallback=r({},N.fallback,{srcSet:N.fallback.srcSet?S(N.fallback.srcSet):void 0})),N.sources&&(H.sources=N.sources.map((e=>r({},e,{srcSet:S(e.srcSet)})))),a.createElement(t,r({},M,{style:r({},O,i,{backgroundColor:h}),className:`${P}${n?` ${n}`:""}`}),a.createElement(g,{layout:A,width:_,height:k},a.createElement(w,r({},p(T,!1,A,_,k,L,v,y))),a.createElement(E,r({"data-gatsby-image-ssr":"",className:m},b,d("eager"===l,!1,H,l,f)))))})),V=function(e,t){for(var n=arguments.length,a=new Array(n>2?n-2:0),o=2;o{if(void 0!==e.layout&&!D.has(e.layout))return new Error(`Invalid value ${e.layout}" provided for prop "layout". Defaulting to "constrained". Valid values are "fixed", "fullWidth" or "constrained".`)}};Z.displayName="StaticImage",Z.propTypes=R;const q=I(H);q.displayName="StaticImage",q.propTypes=R},2166:function(e,t,n){"use strict";n.d(t,{A:function(){return y}});var a=n(6540),o=n(4794);const i=e=>{let{siteTitle:t,menuLinks:n}=e;return a.createElement("nav",{className:"navbar navbar-expand-lg navbar-light fixed-top",style:{background:"white",marginBottom:"2.45rem",color:"black"}},a.createElement("div",{className:"container"},a.createElement(o.Link,{to:"/",className:"navbar-brand text-gray"},a.createElement("span",{className:"d-lg-none"},a.createElement("abbr",{title:t},"FISH"))," ",a.createElement("span",{className:"d-none d-lg-block"},t)),a.createElement("button",{className:"navbar-toggler",type:"button","data-bs-toggle":"collapse","data-bs-target":"#navbarSupportedContent","aria-controls":"navbarSupportedContent","aria-expanded":"false","aria-label":"Toggle navigation"},a.createElement("span",{className:"navbar-toggler-icon"})),a.createElement("div",{className:"collapse navbar-collapse",id:"navbarSupportedContent"},a.createElement("div",{className:"navbar-nav"},n.map((e=>a.createElement(o.Link,{to:e.link,key:e.id,style:{color:"black"},className:"nav-link"},e.name)))))))};i.defaultProps={siteTitle:"",menuLinks:""};var r=i,c=n(7387),s=n(2532),l=n(3048),u=n(1105),d=n(4479);let p=function(e){function t(){return e.apply(this,arguments)||this}return(0,c.A)(t,e),t.prototype.render=function(){return a.createElement(l.A,{fluid:!0,className:"bg-white my-3 py-3"},a.createElement(u.A,{md:10,className:"mx-auto pt-2 my-4"},a.createElement(d.A,{className:"justify-content-center mb-2"},this.props.logos.nodes.map(((e,t)=>a.createElement(u.A,{md:2,sm:2,className:"col-md-2 text-center mx-2 my-2",key:t},a.createElement("a",{href:e.url},a.createElement(s.G,{image:(0,s.c)(e.logo),alt:e.name,className:"img-fluid rounded-start rounded-end"}))))))))},t}(a.Component);var m=()=>a.createElement(o.StaticQuery,{query:"3133867949",render:e=>a.createElement(p,{logos:e.allPartnersJson})});const f=e=>{let{siteTitle:t,footerLinks:n}=e;return a.createElement(a.Fragment,null,a.createElement(l.A,{fluid:!0,style:{backgroundColor:"var(--color-footer-bg)"}},a.createElement(l.A,null,a.createElement("footer",{className:"text-center text-lg-start text-black"},a.createElement("section",{className:"pt-4"},a.createElement(l.A,{className:"text-center text-md-start mt-5"},a.createElement(d.A,{className:"mt-3"},a.createElement(u.A,{md:3,lg:4,xl:3,className:"cmx-auto mb-4"},a.createElement("h3",{className:"text-uppercase fw-bold"},t),a.createElement("hr",{className:"mb-4 mt-0 d-inline-block mx-auto"})),a.createElement(u.A,{md:2,lg:2,xl:2,className:"mx-auto mb-4"},a.createElement("h3",{className:"text-uppercase fw-bold"},"Further information"),a.createElement("hr",{className:"mb-4 mt-0 d-inline-block mx-auto"}),a.createElement("ul",{className:"list-unstyled",style:{marginLeft:0}},n.map((e=>a.createElement("li",null,a.createElement(o.Link,{key:e.id,to:e.link,className:"text-black"},e.name)))))),a.createElement(u.A,{md:4,lg:3,xl:3,className:"mx-auto mb-md-0 mb-4"},a.createElement("h3",{className:"text-uppercase fw-bold"},"Contact"),a.createElement("hr",{className:"mb-4 mt-0 d-inline-block mx-auto"}),a.createElement("p",null,"c/o Historic England",a.createElement("br",null),"4th Floor",a.createElement("br",null),"Cannon Bridge House",a.createElement("br",null),"25 Dowgate Hill",a.createElement("br",null),"London",a.createElement("br",null),"EC4R 2YA")))))))))};f.defaultProps={siteTitle:"",footerLinks:""};var g=f,h=n(4968);n(5846);function v(){return(0,a.useEffect)((()=>{document.getElementById("cc--main")||(window.CookieConsentApi=window.initCookieConsent(),window.CookieConsentApi.run({current_lang:"en",autoclear_cookies:!0,cookie_name:"dejp3-cookies",cookie_expiration:365,page_scripts:!0,force_consent:!0,hide_from_bots:!0,gui_options:{consent_modal:{layout:"box",position:"bottom left",transition:"slide"},settings_modal:{layout:"box",position:"left",transition:"slide"}},onFirstAction:function(){console.log("onFirstAction fired")},onAccept:function(e){console.log("onAccept fired ...")},onChange:function(e,t){console.log("onChange fired ...")},languages:{en:{consent_modal:{title:"🍪 We use cookies! ",description:'Hi, this website uses essential cookies to ensure its proper operation and tracking cookies to understand how you interact with it. The latter will be set only after consent. ',primary_btn:{text:"Accept all",role:"accept_all"},secondary_btn:{text:"Reject all",role:"accept_necessary"}},settings_modal:{title:'',save_settings_btn:"Save my choices",accept_all_btn:"Accept all",reject_all_btn:"Reject all",close_btn_label:"Close",cookie_table_headers:[{col1:"Name"},{col2:"Domain"},{col3:"Expiration"},{col4:"Description"}],blocks:[{title:"Cookie usage and the Fitzwilliam website",description:"I use cookies to ensure the basic functionalities of the website and to enhance your online experience. You can choose for each category to opt-in/out whenever you want."},{title:"Strictly necessary cookies",description:"These cookies are essential for the proper functioning of my website. Without these cookies, the website would not work properly",toggle:{value:"necessary",enabled:!0,readonly:!0}},{title:"Performance and Analytics cookies",description:"These cookies allow the website to remember the choices you have made in the past",toggle:{value:"analytics",enabled:!0,readonly:!1},cookie_table:[{col1:"^_ga",col2:"google.com",col3:"2 years",col4:"Google Analytics identifies unique users across GA sessions through client ID. The client ID is stored in the Google Analytics cookie. The GA cookie is set when a person visits your website for the first time. Google Analytics sends the client ID with each hit to associate hits with a user.",is_regex:!0},{col1:"_gid",col2:"google.com",col3:"1 day",col4:"This cookie is installed by Google Analytics. The cookie is used to store information of how visitors use a website and helps in creating an analytics report of how the website is doing."}]},{title:"Advertisement and Targeting cookies",description:"These cookies collect information about how you use the website, which pages you visited and which links you clicked on. All of the data is anonymized and cannot be used to identify you",toggle:{value:"targeting",enabled:!1,readonly:!1}},{title:"More information",description:'For any queries in relation to our policy on cookies and your choices, please review the University of Cambridge policy.'}]}}}}))}),[]),null}var y=e=>{let{children:t}=e;const n=(0,o.useStaticQuery)("2494122958");return a.createElement(a.Fragment,null,a.createElement(r,{menuLinks:n.site.siteMetadata.menuLinks,siteTitle:n.site.siteMetadata.title}),a.createElement("div",{style:{margin:"0 auto"}},a.createElement("main",null,t)),a.createElement(m,{style:{margin:"0 auto",width:"100%"}}),a.createElement(g,{siteTitle:n.site.siteMetadata.title,footerLinks:n.site.siteMetadata.footerLinks,style:{margin:"0 auto",width:"100%"}}),a.createElement(h.default,{mainStyle:{width:"100%",height:"100%",backgroundColor:"#2f0520",color:"white"},percentStyle:{width:"100%",height:"100%",display:"none"},animate:"rotate",offsetTop:20,step:50,percent:!1,visiblePercent:50}),a.createElement(v,null))}},3430:function(e,t,n){"use strict";n.d(t,{A:function(){return i}});var a=n(6540),o=n(4794);var i=e=>{let{title:t,description:n,pathname:i,children:r}=e;const{title:c,description:s,image:l,siteUrl:u,twitterHandle:d}=(0,o.useStaticQuery)("4037206124").site.siteMetadata,p={title:t||c,description:n||s,image:`${u}${l}`,url:`${u}${i||""}`,twitterHandle:d};return a.createElement(a.Fragment,null,a.createElement("title",null,p.title),a.createElement("meta",{name:"description",content:p.description}),a.createElement("meta",{name:"image",content:p.image}),a.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),a.createElement("meta",{name:"twitter:title",content:p.title}),a.createElement("meta",{name:"twitter:url",content:p.url.toString()}),a.createElement("meta",{name:"twitter:description",content:p.description}),a.createElement("meta",{name:"twitter:image",content:p.image.toString()}),a.createElement("meta",{name:"twitter:creator",content:p.twitterHandle}),a.createElement("meta",{property:"og:url",content:p.url.toString()}),a.createElement("meta",{property:"og:title",content:p.title}),a.createElement("meta",{property:"og:type",content:"website"}),a.createElement("meta",{property:"og:site_name",content:"Forum on Information Standards in Heritage"}),a.createElement("meta",{property:"og:description",content:p.description}),a.createElement("meta",{property:"og:locale",content:"en-gb"}),a.createElement("meta",{property:"og:image",content:p.image.toString()}),a.createElement("meta",{property:"og:image:alt",content:"An image representing this post"}),a.createElement("meta",{property:"og:image:width",content:"600"}),a.createElement("meta",{property:"og:image:width",content:"600"}),a.createElement("meta",{property:"og:image:type",content:"image/jpeg"}),r)}},7625:function(e,t,n){"use strict";n.r(t)},256:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var a=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==r(e)&&"function"!=typeof e)return{default:e};var t=i();if(t&&t.has(e))return t.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if(Object.prototype.hasOwnProperty.call(e,o)){var c=a?Object.getOwnPropertyDescriptor(e,o):null;c&&(c.get||c.set)?Object.defineProperty(n,o,c):n[o]=e[o]}n.default=e,t&&t.set(e,n);return n}(n(6540)),o=n(6180);function i(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return i=function(){return e},e}function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function c(e,t){for(var n=0;n0?n.props.visiblePercent:1,n.isPercent=void 0===n.props.isPercent||n.props.isPercent,n}var n,i,r;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&u(e,t)}(t,e),n=t,(i=[{key:"scrollToTop",value:function(){(0,o.ScrollToAnimate)(this.props.offsetTop,this.props.step,this.state.current)}},{key:"componentDidMount",value:function(){var e=this;window&&(window.onscroll=function(){e.setState({percent:(0,o.getScrollPercent)(e.props.offsetTop),current:(0,o.getScrollTop)()})})}},{key:"render",value:function(){var e=this,t=this.props,n=t.animate,o=t.children,i=this.state.percent>=this.visiblePercent,r="c-animate-hide",c="c-animate-show";return"fade"!==n&&"rotate"!==n?"none"!==n&&(r="fade-hide",c="fade-show"):(r=n+"-hide",c=n+"-show"),a.default.createElement("div",{onClick:function(){return e.scrollToTop()},className:"base-back-to-up "+(i?c:r)},a.default.createElement("div",{className:"back-to-up-default",style:this.mainStyle},o?Array.isArray(o)?o.map(child,(function(e){return a.default.createElement("div",{key:e},child)})):o&&a.default.createElement("div",null,o):a.default.createElement("div",{className:"back-to-up-default-text"},a.default.createElement("span",null,"UP")),a.default.createElement("div",{className:"to-up-percent"+(this.isPercent?"":" percent-hide"),style:this.percentStyle},this.state.percent+"%")))}}])&&c(n.prototype,i),r&&c(n,r),t}(a.Component);t.default=d},6180:function(e,t){"use strict";function n(){var e=0;return document.documentElement&&document.documentElement.scrollTop?e=document.documentElement.scrollTop:document.body&&(e=document.body.scrollTop),e}Object.defineProperty(t,"__esModule",{value:!0}),t.getScrollTop=n,t.ScrollToAnimate=function(e,t,n){var a=0,o=setInterval((function(){n-a>=e?n-(a+=t)>=e?window.scrollTo(0,n-a):window.scrollTo(0,e):clearInterval(o)}),0)},t.getScrollPercent=function(e){var t=0;e100?100:t}},4968:function(e,t,n){e.exports=n(256),t.default=n(256)},1105:function(e,t,n){"use strict";var a=n(6942),o=n.n(a),i=n(6540),r=n(6519),c=n(4848);const s=i.forwardRef(((e,t)=>{const[{className:n,...a},{as:i="div",bsPrefix:s,spans:l}]=function({as:e,bsPrefix:t,className:n,...a}){t=(0,r.oU)(t,"col");const i=(0,r.gy)(),c=(0,r.Jm)(),s=[],l=[];return i.forEach((e=>{const n=a[e];let o,i,r;delete a[e],"object"==typeof n&&null!=n?({span:o,offset:i,order:r}=n):o=n;const u=e!==c?`-${e}`:"";o&&s.push(!0===o?`${t}${u}`:`${t}${u}-${o}`),null!=r&&l.push(`order${u}-${r}`),null!=i&&l.push(`offset${u}-${i}`)})),[{...a,className:o()(n,...s,...l)},{as:e,bsPrefix:t,spans:s}]}(e);return(0,c.jsx)(i,{...a,ref:t,className:o()(n,!l.length&&s)})}));s.displayName="Col",t.A=s},3048:function(e,t,n){"use strict";var a=n(6942),o=n.n(a),i=n(6540),r=n(6519),c=n(4848);const s=i.forwardRef((({bsPrefix:e,fluid:t=!1,as:n="div",className:a,...i},s)=>{const l=(0,r.oU)(e,"container"),u="string"==typeof t?`-${t}`:"-fluid";return(0,c.jsx)(n,{ref:s,...i,className:o()(a,t?`${l}${u}`:l)})}));s.displayName="Container",t.A=s},4479:function(e,t,n){"use strict";var a=n(6942),o=n.n(a),i=n(6540),r=n(6519),c=n(4848);const s=i.forwardRef((({bsPrefix:e,className:t,as:n="div",...a},i)=>{const s=(0,r.oU)(e,"row"),l=(0,r.gy)(),u=(0,r.Jm)(),d=`${s}-cols`,p=[];return l.forEach((e=>{const t=a[e];let n;delete a[e],null!=t&&"object"==typeof t?({cols:n}=t):n=t;const o=e!==u?`-${e}`:"";null!=n&&p.push(`${d}${o}-${n}`)})),(0,c.jsx)(n,{ref:i,...a,className:o()(t,s,...p)})}));s.displayName="Row",t.A=s},6519:function(e,t,n){"use strict";n.d(t,{Jm:function(){return u},gy:function(){return l},oU:function(){return s}});var a=n(6540);n(4848);const o=["xxl","xl","lg","md","sm","xs"],i=a.createContext({prefixes:{},breakpoints:o,minBreakpoint:"xs"}),{Consumer:r,Provider:c}=i;function s(e,t){const{prefixes:n}=(0,a.useContext)(i);return e||n[t]||t}function l(){const{breakpoints:e}=(0,a.useContext)(i);return e}function u(){const{minBreakpoint:e}=(0,a.useContext)(i);return e}},5846:function(){!function(){"use strict";var e="initCookieConsent";"undefined"!=typeof window&&"function"!=typeof window[e]&&(window[e]=function(e){var t,n,a,o,i,r,c,s,l,u,d,p,m,f,g,h,v,y,b,_,k,w,E,C,x,S,A,N,T,L,j,O,P,M,H,$={mode:"opt-in",current_lang:"en",auto_language:null,autorun:!0,page_scripts:!0,hide_from_bots:!0,cookie_name:"cc_cookie",cookie_expiration:182,cookie_domain:location.hostname,cookie_path:"/",cookie_same_site:"Lax",use_rfc_cookie:!1,autoclear_cookies:!0,revision:0,script_selector:"data-cookiecategory"},I={},Z={},V=null,D=!0,R=!1,q=!1,F=!1,U=!1,z=!0,J=[],W=!1,G=[],B=[],Q=[],Y=!1,K=[],X=[],ee=[],te=[],ne=[],ae=document.documentElement,oe=function(e){"number"==typeof(t=e).cookie_expiration&&($.cookie_expiration=t.cookie_expiration),"number"==typeof t.cookie_necessary_only_expiration&&($.cookie_necessary_only_expiration=t.cookie_necessary_only_expiration),"boolean"==typeof t.autorun&&($.autorun=t.autorun),"string"==typeof t.cookie_domain&&($.cookie_domain=t.cookie_domain),"string"==typeof t.cookie_same_site&&($.cookie_same_site=t.cookie_same_site),"string"==typeof t.cookie_path&&($.cookie_path=t.cookie_path),"string"==typeof t.cookie_name&&($.cookie_name=t.cookie_name),"function"==typeof t.onAccept&&(d=t.onAccept),"function"==typeof t.onFirstAction&&(m=t.onFirstAction),"function"==typeof t.onChange&&(p=t.onChange),"opt-out"===t.mode&&($.mode="opt-out"),"number"==typeof t.revision&&(t.revision>-1&&($.revision=t.revision),U=!0),"boolean"==typeof t.autoclear_cookies&&($.autoclear_cookies=t.autoclear_cookies),!0===t.use_rfc_cookie&&($.use_rfc_cookie=!0),"boolean"==typeof t.hide_from_bots&&($.hide_from_bots=t.hide_from_bots),$.hide_from_bots&&(Y=navigator&&(navigator.userAgent&&/bot|crawl|spider|slurp|teoma/i.test(navigator.userAgent)||navigator.webdriver)),$.page_scripts=!0===t.page_scripts,"browser"===t.auto_language||!0===t.auto_language?$.auto_language="browser":"document"===t.auto_language&&($.auto_language="document"),$.auto_language,$.current_lang=pe(t.languages,t.current_lang)},ie=function(e){for(var t="accept-",n=c("c-settings"),a=c(t+"all"),o=c(t+"necessary"),i=c(t+"custom"),r=0;r0?t.hasOwnProperty($.current_lang)?$.current_lang:ke(t)[0]:void 0},ce=function(e){if(!0===t.force_consent&&we(ae,"force--consent"),!b){b=de("div");var n=de("div"),a=de("div");b.id="cm",n.id="c-inr-i",a.id="cm-ov",b.tabIndex=-1,b.setAttribute("role","dialog"),b.setAttribute("aria-modal","true"),b.setAttribute("aria-hidden","false"),b.setAttribute("aria-labelledby","c-ttl"),b.setAttribute("aria-describedby","c-txt"),y.appendChild(b),y.appendChild(a),b.style.visibility=a.style.visibility="hidden",a.style.opacity=0}var o=t.languages[e].consent_modal.title;o&&(_||((_=de("h2")).id="c-ttl",n.appendChild(_)),_.innerHTML=o);var i=t.languages[e].consent_modal.description;U&&(i=z?i.replace("{{revision_message}}",""):i.replace("{{revision_message}}",t.languages[e].consent_modal.revision_message||"")),k||((k=de("div")).id="c-txt",n.appendChild(k)),k.innerHTML=i;var r,c=t.languages[e].consent_modal.primary_btn,s=t.languages[e].consent_modal.secondary_btn;c&&(w||((w=de("button")).id="c-p-bn",w.className="c-bn",w.appendChild(xe(1)),"accept_all"===c.role&&(r="all"),_e(w,"click",(function(){I.hide(),I.accept(r)}))),w.firstElementChild.innerHTML=t.languages[e].consent_modal.primary_btn.text),s&&(E||((E=de("button")).id="c-s-bn",E.className="c-bn c_link",E.appendChild(xe(1)),"accept_necessary"===s.role?_e(E,"click",(function(){I.hide(),I.accept([])})):_e(E,"click",(function(){I.showSettings(0)}))),E.firstElementChild.innerHTML=t.languages[e].consent_modal.secondary_btn.text);var l=t.gui_options;x||((x=de("div")).id="c-inr",x.appendChild(n)),C||((C=de("div")).id="c-bns",l&&l.consent_modal&&!0===l.consent_modal.swap_buttons?(s&&C.appendChild(E),c&&C.appendChild(w),C.className="swap"):(c&&C.appendChild(w),s&&C.appendChild(E)),(c||s)&&x.appendChild(C),b.appendChild(x)),R=!0,ie(x)},se=function(e){if(S)(j=de("div")).id="s-bl";else{(S=de("div")).tabIndex=-1;var n=de("div"),a=de("div"),o=de("div");A=de("div"),N=de("h2");var i=de("div");(T=de("button")).appendChild(xe(2));var r=de("div");L=de("div");var c=de("div"),s=!1;_e(S,"mouseup",(function(e){!F||s||A.contains(e.target)||I.hideSettings()})),_e(S,"mousedown",(function(e){F&&(s=A.contains(e.target))})),S.id="s-cnt",n.id="c-vln",o.id="c-s-in",a.id="cs",N.id="s-ttl",A.id="s-inr",i.id="s-hdr",L.id="s-bl",T.id="s-c-bn",c.id="cs-ov",r.id="s-c-bnc",T.className="c-bn",S.setAttribute("role","dialog"),S.setAttribute("aria-modal","true"),S.setAttribute("aria-hidden","true"),S.setAttribute("aria-labelledby","s-ttl"),S.style.visibility=c.style.visibility="hidden",c.style.opacity=0,r.appendChild(T),_e(document,"keydown",(function(e){27===e.keyCode&&F&&I.hideSettings()}),!0),_e(T,"click",(function(){I.hideSettings()}))}var d=t.languages[e].settings_modal;T.setAttribute("aria-label",d.close_btn_label||"Close"),u=d.blocks,l=d.cookie_table_headers;var p=d.cookie_table_caption,m=u.length;N.innerHTML=d.title;for(var f=0;f-1?(q.checked=!0,!j&&ee.push(!0)):!j&&ee.push(!1),!j&&te.push(G),v.readonly&&(q.disabled=!0,we(U,"c-ro"),!j&&ne.push(G)),we(E,"b-acc"),we(x,"b-bn"),we(w,"b-ex"),E.id=$,E.setAttribute("aria-hidden","true"),R.appendChild(q),R.appendChild(U),R.appendChild(z),x.appendChild(R),k&&function(e,t,n){_e(V,"click",(function(){Ce(t,"act")?(Ee(t,"act"),n.setAttribute("aria-expanded","false"),e.setAttribute("aria-hidden","true")):(we(t,"act"),n.setAttribute("aria-expanded","true"),e.setAttribute("aria-hidden","false"))}),!1)}(E,w,V)}else if(g){var B=de("div");B.className="b-tl",B.setAttribute("role","heading"),B.setAttribute("aria-level","3"),B.insertAdjacentHTML("beforeend",g),x.appendChild(B)}if(g&&w.appendChild(x),h&&E.appendChild(C),!_&&void 0!==b){for(var Y=document.createDocumentFragment(),K=0;K-1;if(!ee[++n]&&c.hasOwnProperty("cookie_table")&&(e||s)){var d=c.cookie_table,p=ke(l[0])[0],m=d.length;"on_disable"===c.toggle.reload&&s&&(W=!0);for(var f=0;f-1&&v.push(a[E])}v.length>0&&(be(v,k,g),"on_clear"===c.toggle.reload&&(W=!0))}}}}},ue=function(e,t){return e.indexOf(t)},de=function(e){var t=document.createElement(e);return"button"===e&&t.setAttribute("type",e),t},pe=function(e,t){return"browser"===$.auto_language?re(me(),e):"document"===$.auto_language?re(document.documentElement.lang,e):"string"==typeof t?$.current_lang=re(t,e):($.current_lang,$.current_lang)},me=function(){var e=navigator.language||navigator.browserLanguage;return e.length>2&&(e=e[0]+e[1]),e.toLowerCase()};I.allowedCategory=function(e){if(D&&"opt-in"!==$.mode)t=Q;else var t=JSON.parse(ye($.cookie_name,"one",!0)||"{}").categories||[];return ue(t,e)>-1},I.run=function(t){if(!document.getElementById("cc_div")){if(oe(t),Y)return;Z=JSON.parse(ye($.cookie_name,"one",!0)||"{}");var c=void 0!==(o=Z.consent_uuid);if((n=Z.consent_date)&&(n=new Date(n)),(a=Z.last_consent_update)&&(a=new Date(a)),V=void 0!==Z.data?Z.data:null,U&&Z.revision!==$.revision&&(z=!1),R=D=!(c&&z&&n&&a&&o),function(){(v=de("div")).id="cc--main",v.style.position="fixed",v.innerHTML='
    ',y=v.children[0];var t=$.current_lang;R&&ce(t),se(t),(e||document.body).appendChild(v)}(),function(){var e=["[href]","button","input","details",'[tabindex="0"]'];function t(t,n){try{var a=t.querySelectorAll(e.join(':not([tabindex="-1"]), '))}catch(n){return t.querySelectorAll(e.join(", "))}n[0]=a[0],n[1]=a[a.length-1]}t(A,X),R&&t(b,K)}(),function(e,t){if("object"==typeof e){var n=e.consent_modal,a=e.settings_modal;R&&n&&o(b,["box","bar","cloud"],["top","middle","bottom"],["zoom","slide"],n.layout,n.position,n.transition),a&&o(S,["bar"],["left","right"],["zoom","slide"],a.layout,a.position,a.transition)}function o(e,t,n,a,o,i,r){if(i=i&&i.split(" ")||[],ue(t,o)>-1&&(we(e,o),("bar"!==o||"middle"!==i[0])&&ue(n,i[0])>-1))for(var c=0;c-1&&we(e,r)}}(t.gui_options),ie(),$.autorun&&R&&I.show(t.delay||0),setTimeout((function(){we(v,"c--anim")}),30),setTimeout((function(){_e(document,"keydown",(function(e){if("Tab"===e.key&&(q||F)&&i){var t=Ne();e.shiftKey?t!==i[0]&&r.contains(t)||(e.preventDefault(),Se(i[1])):t!==i[1]&&r.contains(t)||(e.preventDefault(),Se(i[0]))}}))}),100),D)"opt-out"===$.mode&&($.mode,fe());else{var s="boolean"==typeof Z.rfc_cookie;(!s||s&&Z.rfc_cookie!==$.use_rfc_cookie)&&(Z.rfc_cookie=$.use_rfc_cookie,ve($.cookie_name,JSON.stringify(Z))),f=he(ge()),fe(),"function"==typeof d&&d(Z)}}};var fe=function(){if($.page_scripts){var e=Z.categories||[];D&&"opt-out"===$.mode&&(e=Q);var t=document.querySelectorAll("script["+$.script_selector+"]"),n=function(t,a){if(a-1){o.type=o.getAttribute("data-type")||"text/javascript",o.removeAttribute($.script_selector);var r=o.getAttribute("data-src");r&&o.removeAttribute("data-src");var c=de("script");if(c.textContent=o.innerHTML,function(e,t){for(var n=t.attributes,a=n.length,o=0;o0)for(var i=0;i0?e:t?30:0))},I.hide=function(){R&&(q=!1,Se(c),b.setAttribute("aria-hidden","true"),Ee(ae,"show--consent"),Se(g),g=null)},I.showSettings=function(e){F=!0,S.removeAttribute("aria-hidden"),q?h=Ne():g=Ne(),r=S,i=X,setTimeout((function(){we(ae,"show--settings")}),e>0?e:0)},I.hideSettings=function(){F=!1,Ae(),Se(s),S.setAttribute("aria-hidden","true"),Ee(ae,"show--settings"),q?(Se(h),h=null,r=b,i=K):(Se(g),g=null)},I.accept=function(e,t){var i=e||void 0,r=t||[],c=[];if(i)if("object"==typeof i&&"number"==typeof i.length)for(var s=0;s=1)for(s=0;s0)for(var i=0;i0&&le(),n||(n=new Date),o||(o=([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(function(e){try{return(e^(window.crypto||window.msCrypto).getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)}catch(e){return""}}))),Z={categories:e,level:e,revision:$.revision,data:V,rfc_cookie:$.use_rfc_cookie,consent_date:n.toISOString(),consent_uuid:o},(D||J.length>0)&&(z=!0,a=a?new Date:n,Z.last_consent_update=a.toISOString(),f=he(ge()),ve($.cookie_name,JSON.stringify(Z)),fe()),D&&($.autoclear_cookies&&le(!0),"function"==typeof m&&m(I.getUserPreferences(),Z),"function"==typeof d&&d(Z),D=!1,"opt-in"===$.mode)||("function"==typeof p&&J.length>0&&p(Z,J),W&&location.reload())}(c)},I.eraseCookies=function(e,t,n){var a=[],o=n?[n,"."+n]:[$.cookie_domain,"."+$.cookie_domain];if("object"==typeof e&&e.length>0)for(var i=0;i-1&&$.cookie_domain&&(o+=" Domain="+$.cookie_domain+";"),"https:"===location.protocol&&(o+=" Secure;"),document.cookie=o},ye=function(e,t,n){var a;if("one"===t){if((a=(a=document.cookie.match("(^|;)\\s*"+e+"\\s*=\\s*([^;]+)"))?n?a.pop():e:"")&&e===$.cookie_name){try{a=JSON.parse(a)}catch(e){try{a=JSON.parse(decodeURIComponent(a))}catch(e){a={}}}a=JSON.stringify(a)}}else if("all"===t){var o=document.cookie.split(/;\s*/);a=[];for(var i=0;i {\n\tlet isLastCharLower = false;\n\tlet isLastCharUpper = false;\n\tlet isLastLastCharUpper = false;\n\n\tfor (let i = 0; i < string.length; i++) {\n\t\tconst character = string[i];\n\n\t\tif (isLastCharLower && UPPERCASE.test(character)) {\n\t\t\tstring = string.slice(0, i) + '-' + string.slice(i);\n\t\t\tisLastCharLower = false;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = true;\n\t\t\ti++;\n\t\t} else if (isLastCharUpper && isLastLastCharUpper && LOWERCASE.test(character)) {\n\t\t\tstring = string.slice(0, i - 1) + '-' + string.slice(i - 1);\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = false;\n\t\t\tisLastCharLower = true;\n\t\t} else {\n\t\t\tisLastCharLower = toLowerCase(character) === character && toUpperCase(character) !== character;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = toUpperCase(character) === character && toLowerCase(character) !== character;\n\t\t}\n\t}\n\n\treturn string;\n};\n\nconst preserveConsecutiveUppercase = (input, toLowerCase) => {\n\tLEADING_CAPITAL.lastIndex = 0;\n\n\treturn input.replace(LEADING_CAPITAL, m1 => toLowerCase(m1));\n};\n\nconst postProcess = (input, toUpperCase) => {\n\tSEPARATORS_AND_IDENTIFIER.lastIndex = 0;\n\tNUMBERS_AND_IDENTIFIER.lastIndex = 0;\n\n\treturn input.replace(SEPARATORS_AND_IDENTIFIER, (_, identifier) => toUpperCase(identifier))\n\t\t.replace(NUMBERS_AND_IDENTIFIER, m => toUpperCase(m));\n};\n\nconst camelCase = (input, options) => {\n\tif (!(typeof input === 'string' || Array.isArray(input))) {\n\t\tthrow new TypeError('Expected the input to be `string | string[]`');\n\t}\n\n\toptions = {\n\t\tpascalCase: false,\n\t\tpreserveConsecutiveUppercase: false,\n\t\t...options\n\t};\n\n\tif (Array.isArray(input)) {\n\t\tinput = input.map(x => x.trim())\n\t\t\t.filter(x => x.length)\n\t\t\t.join('-');\n\t} else {\n\t\tinput = input.trim();\n\t}\n\n\tif (input.length === 0) {\n\t\treturn '';\n\t}\n\n\tconst toLowerCase = options.locale === false ?\n\t\tstring => string.toLowerCase() :\n\t\tstring => string.toLocaleLowerCase(options.locale);\n\tconst toUpperCase = options.locale === false ?\n\t\tstring => string.toUpperCase() :\n\t\tstring => string.toLocaleUpperCase(options.locale);\n\n\tif (input.length === 1) {\n\t\treturn options.pascalCase ? toUpperCase(input) : toLowerCase(input);\n\t}\n\n\tconst hasUpperCase = input !== toLowerCase(input);\n\n\tif (hasUpperCase) {\n\t\tinput = preserveCamelCase(input, toLowerCase, toUpperCase);\n\t}\n\n\tinput = input.replace(LEADING_SEPARATORS, '');\n\n\tif (options.preserveConsecutiveUppercase) {\n\t\tinput = preserveConsecutiveUppercase(input, toLowerCase);\n\t} else {\n\t\tinput = toLowerCase(input);\n\t}\n\n\tif (options.pascalCase) {\n\t\tinput = toUpperCase(input.charAt(0)) + input.slice(1);\n\t}\n\n\treturn postProcess(input, toUpperCase);\n};\n\nmodule.exports = camelCase;\n// TODO: Remove this for the next major release\nmodule.exports.default = camelCase;\n","import camelCase from \"camelcase\"\nimport type { IGatsbyImageData } from \"./index\"\n\nconst DEFAULT_PIXEL_DENSITIES = [0.25, 0.5, 1, 2]\nexport const DEFAULT_BREAKPOINTS = [750, 1080, 1366, 1920]\nexport const EVERY_BREAKPOINT = [\n 320, 654, 768, 1024, 1366, 1600, 1920, 2048, 2560, 3440, 3840, 4096,\n]\nconst DEFAULT_FLUID_WIDTH = 800\nconst DEFAULT_FIXED_WIDTH = 800\nconst DEFAULT_ASPECT_RATIO = 4 / 3\n\nexport type Fit = \"cover\" | \"fill\" | \"inside\" | \"outside\" | \"contain\"\n\nexport type Layout = \"fixed\" | \"fullWidth\" | \"constrained\"\nexport type ImageFormat = \"jpg\" | \"png\" | \"webp\" | \"avif\" | \"auto\" | \"\"\n\n/**\n * The minimal required reporter, as we don't want to import it from gatsby-cli\n */\nexport interface IReporter {\n warn(message: string): void\n}\n\nexport interface ISharpGatsbyImageArgs {\n layout?: Layout\n formats?: Array\n placeholder?: \"tracedSVG\" | \"dominantColor\" | \"blurred\" | \"none\"\n tracedSVGOptions?: Record\n width?: number\n height?: number\n aspectRatio?: number\n sizes?: string\n quality?: number\n transformOptions?: {\n fit?: Fit\n cropFocus?: number | string\n duotone?: {\n highlight: string\n shadow: string\n opacity?: number\n }\n grayscale?: boolean\n rotate?: number\n trim?: number\n }\n jpgOptions?: Record\n pngOptions?: Record\n webpOptions?: Record\n avifOptions?: Record\n blurredOptions?: { width?: number; toFormat?: ImageFormat }\n breakpoints?: Array\n outputPixelDensities?: Array\n backgroundColor?: string\n}\n\nexport interface IImageSizeArgs {\n width?: number\n height?: number\n layout?: Layout\n filename: string\n outputPixelDensities?: Array\n breakpoints?: Array\n fit?: Fit\n reporter?: IReporter\n sourceMetadata: { width: number; height: number }\n}\n\nexport interface IImageSizes {\n sizes: Array\n presentationWidth: number\n presentationHeight: number\n aspectRatio: number\n unscaledWidth: number\n}\n\nexport interface IImage {\n src: string\n width: number\n height: number\n format: ImageFormat\n}\n\nexport interface IGatsbyImageHelperArgs {\n pluginName: string\n generateImageSource: (\n filename: string,\n width: number,\n height: number,\n format: ImageFormat,\n fit?: Fit,\n options?: Record\n ) => IImage\n layout?: Layout\n formats?: Array\n filename: string\n placeholderURL?: string\n width?: number\n height?: number\n sizes?: string\n reporter?: IReporter\n sourceMetadata?: { width: number; height: number; format: ImageFormat }\n fit?: Fit\n options?: Record\n breakpoints?: Array\n backgroundColor?: string\n aspectRatio?: number\n}\n\nconst warn = (message: string): void => console.warn(message)\n\nconst sortNumeric = (a: number, b: number): number => a - b\n\nexport const getSizes = (width: number, layout: Layout): string | undefined => {\n switch (layout) {\n // If screen is wider than the max size, image width is the max size,\n // otherwise it's the width of the screen\n case `constrained`:\n return `(min-width: ${width}px) ${width}px, 100vw`\n\n // Image is always the same width, whatever the size of the screen\n case `fixed`:\n return `${width}px`\n\n // Image is always the width of the screen\n case `fullWidth`:\n return `100vw`\n\n default:\n return undefined\n }\n}\n\nexport const getSrcSet = (images: Array): string =>\n images.map(image => `${image.src} ${image.width}w`).join(`,\\n`)\n\nexport function formatFromFilename(filename: string): ImageFormat | undefined {\n const dot = filename.lastIndexOf(`.`)\n if (dot !== -1) {\n const ext = filename.slice(dot + 1)\n if (ext === `jpeg`) {\n return `jpg`\n }\n if (ext.length === 3 || ext.length === 4) {\n return ext as ImageFormat\n }\n }\n return undefined\n}\n\nexport function setDefaultDimensions(\n args: IGatsbyImageHelperArgs\n): IGatsbyImageHelperArgs {\n let {\n layout = `constrained`,\n width,\n height,\n sourceMetadata,\n breakpoints,\n aspectRatio,\n formats = [`auto`, `webp`],\n } = args\n formats = formats.map(format => format.toLowerCase() as ImageFormat)\n layout = camelCase(layout) as Layout\n\n if (width && height) {\n return { ...args, formats, layout, aspectRatio: width / height }\n }\n if (sourceMetadata.width && sourceMetadata.height && !aspectRatio) {\n aspectRatio = sourceMetadata.width / sourceMetadata.height\n }\n\n if (layout === `fullWidth`) {\n width = width || sourceMetadata.width || breakpoints[breakpoints.length - 1]\n height = height || Math.round(width / (aspectRatio || DEFAULT_ASPECT_RATIO))\n } else {\n if (!width) {\n if (height && aspectRatio) {\n width = height * aspectRatio\n } else if (sourceMetadata.width) {\n width = sourceMetadata.width\n } else if (height) {\n width = Math.round(height / DEFAULT_ASPECT_RATIO)\n } else {\n width = DEFAULT_FIXED_WIDTH\n }\n }\n\n if (aspectRatio && !height) {\n height = Math.round(width / aspectRatio)\n } else if (!aspectRatio) {\n aspectRatio = width / height\n }\n }\n return { ...args, width, height, aspectRatio, layout, formats }\n}\n\n/**\n * Use this for getting an image for the blurred placeholder. This ensures the\n * aspect ratio and crop match the main image\n */\nexport function getLowResolutionImageURL(\n args: IGatsbyImageHelperArgs,\n width = 20\n): string {\n args = setDefaultDimensions(args)\n const { generateImageSource, filename, aspectRatio } = args\n return generateImageSource(\n filename,\n width,\n Math.round(width / aspectRatio),\n args.sourceMetadata.format || `jpg`,\n args.fit,\n args.options\n )?.src\n}\n\nexport function generateImageData(\n args: IGatsbyImageHelperArgs\n): IGatsbyImageData {\n args = setDefaultDimensions(args)\n\n let {\n pluginName,\n sourceMetadata,\n generateImageSource,\n layout,\n fit,\n options,\n width,\n height,\n filename,\n reporter = { warn },\n backgroundColor,\n placeholderURL,\n } = args\n\n if (!pluginName) {\n reporter.warn(\n `[gatsby-plugin-image] \"generateImageData\" was not passed a plugin name`\n )\n }\n\n if (typeof generateImageSource !== `function`) {\n throw new Error(`generateImageSource must be a function`)\n }\n\n if (!sourceMetadata || (!sourceMetadata.width && !sourceMetadata.height)) {\n // No metadata means we let the CDN handle max size etc, aspect ratio etc\n sourceMetadata = {\n width,\n height,\n format: sourceMetadata?.format || formatFromFilename(filename) || `auto`,\n }\n } else if (!sourceMetadata.format) {\n sourceMetadata.format = formatFromFilename(filename)\n }\n\n const formats = new Set(args.formats)\n\n if (formats.size === 0 || formats.has(`auto`) || formats.has(``)) {\n formats.delete(`auto`)\n formats.delete(``)\n formats.add(sourceMetadata.format)\n }\n\n if (formats.has(`jpg`) && formats.has(`png`)) {\n reporter.warn(\n `[${pluginName}] Specifying both 'jpg' and 'png' formats is not supported. Using 'auto' instead`\n )\n if (sourceMetadata.format === `jpg`) {\n formats.delete(`png`)\n } else {\n formats.delete(`jpg`)\n }\n }\n\n const imageSizes = calculateImageSizes({ ...args, sourceMetadata })\n\n const result: IGatsbyImageData[\"images\"] = {\n sources: [],\n }\n\n let sizes = args.sizes\n if (!sizes) {\n sizes = getSizes(imageSizes.presentationWidth, layout)\n }\n\n formats.forEach(format => {\n const images = imageSizes.sizes\n .map(size => {\n const imageSrc = generateImageSource(\n filename,\n size,\n Math.round(size / imageSizes.aspectRatio),\n format,\n fit,\n options\n )\n if (\n !imageSrc?.width ||\n !imageSrc.height ||\n !imageSrc.src ||\n !imageSrc.format\n ) {\n reporter.warn(\n `[${pluginName}] The resolver for image ${filename} returned an invalid value.`\n )\n return undefined\n }\n return imageSrc\n })\n .filter(Boolean)\n\n if (format === `jpg` || format === `png` || format === `auto`) {\n const unscaled =\n images.find(img => img.width === imageSizes.unscaledWidth) || images[0]\n\n if (unscaled) {\n result.fallback = {\n src: unscaled.src,\n srcSet: getSrcSet(images),\n sizes,\n }\n }\n } else {\n result.sources?.push({\n srcSet: getSrcSet(images),\n sizes,\n type: `image/${format}`,\n })\n }\n })\n\n const imageProps: Partial = {\n images: result,\n layout,\n backgroundColor,\n }\n\n if (placeholderURL) {\n imageProps.placeholder = { fallback: placeholderURL }\n }\n\n switch (layout) {\n case `fixed`:\n imageProps.width = imageSizes.presentationWidth\n imageProps.height = imageSizes.presentationHeight\n break\n\n case `fullWidth`:\n imageProps.width = 1\n imageProps.height = 1 / imageSizes.aspectRatio\n break\n\n case `constrained`:\n imageProps.width = args.width || imageSizes.presentationWidth || 1\n imageProps.height = (imageProps.width || 1) / imageSizes.aspectRatio\n }\n\n return imageProps as IGatsbyImageData\n}\n\nconst dedupeAndSortDensities = (values: Array): Array =>\n Array.from(new Set([1, ...values])).sort(sortNumeric)\n\nexport function calculateImageSizes(args: IImageSizeArgs): IImageSizes {\n const {\n width,\n height,\n filename,\n layout = `constrained`,\n sourceMetadata: imgDimensions,\n reporter = { warn },\n breakpoints = DEFAULT_BREAKPOINTS,\n } = args\n\n // check that all dimensions provided are positive\n const userDimensions = { width, height }\n const erroneousUserDimensions = Object.entries(userDimensions).filter(\n ([_, size]) => typeof size === `number` && size < 1\n )\n if (erroneousUserDimensions.length) {\n throw new Error(\n `Specified dimensions for images must be positive numbers (> 0). Problem dimensions you have are ${erroneousUserDimensions\n .map(dim => dim.join(`: `))\n .join(`, `)}`\n )\n }\n\n if (layout === `fixed`) {\n return fixedImageSizes(args)\n } else if (layout === `constrained`) {\n return responsiveImageSizes(args)\n } else if (layout === `fullWidth`) {\n return responsiveImageSizes({ breakpoints, ...args })\n } else {\n reporter.warn(\n `No valid layout was provided for the image at ${filename}. Valid image layouts are fixed, fullWidth, and constrained. Found ${layout}`\n )\n return {\n sizes: [imgDimensions.width],\n presentationWidth: imgDimensions.width,\n presentationHeight: imgDimensions.height,\n aspectRatio: imgDimensions.width / imgDimensions.height,\n unscaledWidth: imgDimensions.width,\n }\n }\n}\nexport function fixedImageSizes({\n filename,\n sourceMetadata: imgDimensions,\n width,\n height,\n fit = `cover`,\n outputPixelDensities = DEFAULT_PIXEL_DENSITIES,\n reporter = { warn },\n}: IImageSizeArgs): IImageSizes {\n let aspectRatio = imgDimensions.width / imgDimensions.height\n // Sort, dedupe and ensure there's a 1\n const densities = dedupeAndSortDensities(outputPixelDensities)\n\n // If both are provided then we need to check the fit\n if (width && height) {\n const calculated = getDimensionsAndAspectRatio(imgDimensions, {\n width,\n height,\n fit,\n })\n width = calculated.width\n height = calculated.height\n aspectRatio = calculated.aspectRatio\n }\n\n if (!width) {\n if (!height) {\n width = DEFAULT_FIXED_WIDTH\n } else {\n width = Math.round(height * aspectRatio)\n }\n } else if (!height) {\n height = Math.round(width / aspectRatio)\n }\n\n const originalWidth = width // will use this for presentationWidth, don't want to lose it\n const isTopSizeOverriden =\n imgDimensions.width < width || imgDimensions.height < (height as number)\n\n // If the image is smaller than requested, warn the user that it's being processed as such\n // print out this message with the necessary information before we overwrite it for sizing\n if (isTopSizeOverriden) {\n const fixedDimension = imgDimensions.width < width ? `width` : `height`\n reporter.warn(`\nThe requested ${fixedDimension} \"${\n fixedDimension === `width` ? width : height\n }px\" for the image ${filename} was larger than the actual image ${fixedDimension} of ${\n imgDimensions[fixedDimension]\n }px. If possible, replace the current image with a larger one.`)\n\n if (fixedDimension === `width`) {\n width = imgDimensions.width\n height = Math.round(width / aspectRatio)\n } else {\n height = imgDimensions.height\n width = height * aspectRatio\n }\n }\n\n const sizes = densities\n .filter(size => size >= 1) // remove smaller densities because fixed images don't need them\n .map(density => Math.round(density * (width as number)))\n .filter(size => size <= imgDimensions.width)\n\n return {\n sizes,\n aspectRatio,\n presentationWidth: originalWidth,\n presentationHeight: Math.round(originalWidth / aspectRatio),\n unscaledWidth: width,\n }\n}\n\nexport function responsiveImageSizes({\n sourceMetadata: imgDimensions,\n width,\n height,\n fit = `cover`,\n outputPixelDensities = DEFAULT_PIXEL_DENSITIES,\n breakpoints,\n layout,\n}: IImageSizeArgs): IImageSizes {\n let sizes\n let aspectRatio = imgDimensions.width / imgDimensions.height\n // Sort, dedupe and ensure there's a 1\n const densities = dedupeAndSortDensities(outputPixelDensities)\n\n // If both are provided then we need to check the fit\n if (width && height) {\n const calculated = getDimensionsAndAspectRatio(imgDimensions, {\n width,\n height,\n fit,\n })\n width = calculated.width\n height = calculated.height\n aspectRatio = calculated.aspectRatio\n }\n\n // Case 1: width of height were passed in, make sure it isn't larger than the actual image\n width = width && Math.min(width, imgDimensions.width)\n height = height && Math.min(height, imgDimensions.height)\n\n // Case 2: neither width or height were passed in, use default size\n if (!width && !height) {\n width = Math.min(DEFAULT_FLUID_WIDTH, imgDimensions.width)\n height = width / aspectRatio\n }\n\n // if it still hasn't been found, calculate width from the derived height.\n // TS isn't smart enough to realise the type for height has been narrowed here\n if (!width) {\n width = (height as number) * aspectRatio\n }\n\n const originalWidth = width\n const isTopSizeOverriden =\n imgDimensions.width < width || imgDimensions.height < (height as number)\n if (isTopSizeOverriden) {\n width = imgDimensions.width\n height = imgDimensions.height\n }\n\n width = Math.round(width)\n\n if (breakpoints?.length > 0) {\n sizes = breakpoints.filter(size => size <= imgDimensions.width)\n\n // If a larger breakpoint has been filtered-out, add the actual image width instead\n if (\n sizes.length < breakpoints.length &&\n !sizes.includes(imgDimensions.width)\n ) {\n sizes.push(imgDimensions.width)\n }\n } else {\n sizes = densities.map(density => Math.round(density * (width as number)))\n sizes = sizes.filter(size => size <= imgDimensions.width)\n }\n\n // ensure that the size passed in is included in the final output\n if (layout === `constrained` && !sizes.includes(width)) {\n sizes.push(width)\n }\n sizes = sizes.sort(sortNumeric)\n return {\n sizes,\n aspectRatio,\n presentationWidth: originalWidth,\n presentationHeight: Math.round(originalWidth / aspectRatio),\n unscaledWidth: width,\n }\n}\n\nexport function getDimensionsAndAspectRatio(\n dimensions,\n options\n): { width: number; height: number; aspectRatio: number } {\n // Calculate the eventual width/height of the image.\n const imageAspectRatio = dimensions.width / dimensions.height\n\n let width = options.width\n let height = options.height\n\n switch (options.fit) {\n case `fill`: {\n width = options.width ? options.width : dimensions.width\n height = options.height ? options.height : dimensions.height\n break\n }\n case `inside`: {\n const widthOption = options.width\n ? options.width\n : Number.MAX_SAFE_INTEGER\n const heightOption = options.height\n ? options.height\n : Number.MAX_SAFE_INTEGER\n\n width = Math.min(widthOption, Math.round(heightOption * imageAspectRatio))\n height = Math.min(\n heightOption,\n Math.round(widthOption / imageAspectRatio)\n )\n break\n }\n case `outside`: {\n const widthOption = options.width ? options.width : 0\n const heightOption = options.height ? options.height : 0\n\n width = Math.max(widthOption, Math.round(heightOption * imageAspectRatio))\n height = Math.max(\n heightOption,\n Math.round(widthOption / imageAspectRatio)\n )\n break\n }\n\n default: {\n if (options.width && !options.height) {\n width = options.width\n height = Math.round(options.width / imageAspectRatio)\n }\n\n if (options.height && !options.width) {\n width = Math.round(options.height * imageAspectRatio)\n height = options.height\n }\n }\n }\n\n return {\n width,\n height,\n aspectRatio: width / height,\n }\n}\n","/* global GATSBY___IMAGE */\nimport { generateImageData, EVERY_BREAKPOINT } from \"../image-utils\"\nimport type { CSSProperties, HTMLAttributes, ImgHTMLAttributes } from \"react\"\nimport type { Node } from \"gatsby\"\nimport type { PlaceholderProps } from \"./placeholder\"\nimport type { MainImageProps } from \"./main-image\"\nimport type { IGatsbyImageData } from \"./gatsby-image.browser\"\nimport type {\n IGatsbyImageHelperArgs,\n Layout,\n IImage,\n ImageFormat,\n} from \"../image-utils\"\n\n// Native lazy-loading support: https://addyosmani.com/blog/lazy-loading/\nexport const hasNativeLazyLoadSupport = (): boolean =>\n typeof HTMLImageElement !== `undefined` &&\n `loading` in HTMLImageElement.prototype\n\nexport function gatsbyImageIsInstalled(): boolean {\n return typeof GATSBY___IMAGE !== `undefined` && GATSBY___IMAGE\n}\n\nexport type IGatsbyImageDataParent = T & {\n gatsbyImageData: IGatsbyImageData\n}\nexport type IGatsbyImageParent = T & {\n gatsbyImage: IGatsbyImageData\n}\nexport type FileNode = Partial & {\n childImageSharp?: IGatsbyImageDataParent>\n}\n\nconst isGatsbyImageData = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n node: IGatsbyImageData | any\n): node is IGatsbyImageData =>\n // 🦆 check for a deep prop to be sure this is a valid gatsbyImageData object\n Boolean(node?.images?.fallback?.src)\n\nconst isGatsbyImageDataParent = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n node: IGatsbyImageDataParent | any\n): node is IGatsbyImageDataParent => Boolean(node?.gatsbyImageData)\n\nconst isGatsbyImageParent = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n node: IGatsbyImageParent | any\n): node is IGatsbyImageParent => Boolean(node?.gatsbyImage)\n\nexport type ImageDataLike =\n | FileNode\n | IGatsbyImageDataParent\n | IGatsbyImageParent\n | IGatsbyImageData\n\nexport const getImage = (\n node: ImageDataLike | null\n): IGatsbyImageData | undefined => {\n // This checks both for gatsbyImageData and gatsbyImage\n if (isGatsbyImageData(node)) {\n return node\n }\n // gatsbyImageData GraphQL field\n if (isGatsbyImageDataParent(node)) {\n return node.gatsbyImageData\n }\n // gatsbyImage GraphQL field for Gatsby's Image CDN service\n if (isGatsbyImageParent(node)) {\n return node.gatsbyImage\n }\n return node?.childImageSharp?.gatsbyImageData\n}\n\nexport const getSrc = (node: ImageDataLike): string | undefined =>\n getImage(node)?.images?.fallback?.src\n\nexport const getSrcSet = (node: ImageDataLike): string | undefined =>\n getImage(node)?.images?.fallback?.srcSet\n\nexport function getWrapperProps(\n width: number,\n height: number,\n layout: Layout\n): Pick, \"className\" | \"style\"> & {\n \"data-gatsby-image-wrapper\": string\n} {\n const wrapperStyle: CSSProperties = {}\n\n let className = `gatsby-image-wrapper`\n\n // If the plugin isn't installed we need to apply the styles inline\n if (!gatsbyImageIsInstalled()) {\n wrapperStyle.position = `relative`\n wrapperStyle.overflow = `hidden`\n }\n\n if (layout === `fixed`) {\n wrapperStyle.width = width\n wrapperStyle.height = height\n } else if (layout === `constrained`) {\n if (!gatsbyImageIsInstalled()) {\n wrapperStyle.display = `inline-block`\n wrapperStyle.verticalAlign = `top`\n }\n className = `gatsby-image-wrapper gatsby-image-wrapper-constrained`\n }\n\n return {\n className,\n \"data-gatsby-image-wrapper\": ``,\n style: wrapperStyle,\n }\n}\n\nexport interface IUrlBuilderArgs {\n width: number\n height: number\n baseUrl: string\n format: ImageFormat\n options: OptionsType\n}\nexport interface IGetImageDataArgs> {\n baseUrl: string\n /**\n * For constrained and fixed images, the size of the image element\n */\n width?: number\n height?: number\n /**\n * If available, pass the source image width and height\n */\n sourceWidth?: number\n sourceHeight?: number\n /**\n * If only one dimension is passed, then this will be used to calculate the other.\n */\n aspectRatio?: number\n layout?: Layout\n /**\n * Returns a URL based on the passed arguments. Should be a pure function\n */\n urlBuilder: (args: IUrlBuilderArgs) => string\n\n /**\n * Should be a data URI\n */\n placeholderURL?: string\n backgroundColor?: string\n /**\n * Used in error messages etc\n */\n pluginName?: string\n\n /**\n * If you do not support auto-format, pass an array of image types here\n */\n formats?: Array\n\n breakpoints?: Array\n\n /**\n * Passed to the urlBuilder function\n */\n options?: OptionsType\n}\n\n/**\n * Use this hook to generate gatsby-plugin-image data in the browser.\n */\nexport function getImageData({\n baseUrl,\n urlBuilder,\n sourceWidth,\n sourceHeight,\n pluginName = `getImageData`,\n formats = [`auto`],\n breakpoints,\n options,\n ...props\n}: IGetImageDataArgs): IGatsbyImageData {\n if (\n !breakpoints?.length &&\n (props.layout === `fullWidth` || (props.layout as string) === `FULL_WIDTH`)\n ) {\n breakpoints = EVERY_BREAKPOINT\n }\n const generateImageSource = (\n baseUrl: string,\n width: number,\n height?: number,\n format?: ImageFormat\n ): IImage => {\n return {\n width,\n height,\n format,\n src: urlBuilder({ baseUrl, width, height, options, format }),\n }\n }\n\n const sourceMetadata: IGatsbyImageHelperArgs[\"sourceMetadata\"] = {\n width: sourceWidth,\n height: sourceHeight,\n format: `auto`,\n }\n\n const args: IGatsbyImageHelperArgs = {\n ...props,\n pluginName,\n generateImageSource,\n filename: baseUrl,\n formats,\n breakpoints,\n sourceMetadata,\n }\n return generateImageData(args)\n}\n\nexport function getMainProps(\n isLoading: boolean,\n isLoaded: boolean,\n images: IGatsbyImageData[\"images\"],\n loading?: \"eager\" | \"lazy\",\n style: CSSProperties = {}\n): Partial {\n // fallback when it's not configured in gatsby-config.\n if (!gatsbyImageIsInstalled()) {\n style = {\n height: `100%`,\n left: 0,\n position: `absolute`,\n top: 0,\n transform: `translateZ(0)`,\n transition: `opacity 250ms linear`,\n width: `100%`,\n willChange: `opacity`,\n ...style,\n }\n }\n\n const result = {\n ...images,\n loading,\n shouldLoad: isLoading,\n \"data-main-image\": ``,\n style: {\n ...style,\n opacity: isLoaded ? 1 : 0,\n },\n }\n\n return result\n}\n\nexport type PlaceholderImageAttrs = ImgHTMLAttributes &\n Pick & {\n \"data-placeholder-image\"?: string\n }\n\nexport function getPlaceholderProps(\n placeholder: PlaceholderImageAttrs | undefined,\n isLoaded: boolean,\n layout: Layout,\n width?: number,\n height?: number,\n backgroundColor?: string,\n objectFit?: CSSProperties[\"objectFit\"],\n objectPosition?: CSSProperties[\"objectPosition\"]\n): PlaceholderImageAttrs {\n const wrapperStyle: CSSProperties = {}\n\n if (backgroundColor) {\n wrapperStyle.backgroundColor = backgroundColor\n\n if (layout === `fixed`) {\n wrapperStyle.width = width\n wrapperStyle.height = height\n wrapperStyle.backgroundColor = backgroundColor\n wrapperStyle.position = `relative`\n } else if (layout === `constrained`) {\n wrapperStyle.position = `absolute`\n wrapperStyle.top = 0\n wrapperStyle.left = 0\n wrapperStyle.bottom = 0\n wrapperStyle.right = 0\n } else if (layout === `fullWidth`) {\n wrapperStyle.position = `absolute`\n wrapperStyle.top = 0\n wrapperStyle.left = 0\n wrapperStyle.bottom = 0\n wrapperStyle.right = 0\n }\n }\n\n if (objectFit) {\n wrapperStyle.objectFit = objectFit\n }\n\n if (objectPosition) {\n wrapperStyle.objectPosition = objectPosition\n }\n const result: PlaceholderImageAttrs = {\n ...placeholder,\n \"aria-hidden\": true,\n \"data-placeholder-image\": ``,\n style: {\n opacity: isLoaded ? 0 : 1,\n transition: `opacity 500ms linear`,\n ...wrapperStyle,\n },\n }\n\n // fallback when it's not configured in gatsby-config.\n if (!gatsbyImageIsInstalled()) {\n result.style = {\n height: `100%`,\n left: 0,\n position: `absolute`,\n top: 0,\n width: `100%`,\n }\n }\n\n return result\n}\n\nexport interface IArtDirectedImage {\n media: string\n image: IGatsbyImageData\n}\n\n/**\n * Generate a Gatsby image data object with multiple, art-directed images that display at different\n * resolutions.\n *\n * @param defaultImage The image displayed when no media query matches.\n * It is also used for all other settings applied to the image, such as width, height and layout.\n * You should pass a className to the component with media queries to adjust the size of the container,\n * as this cannot be adjusted automatically.\n * @param artDirected Array of objects which each contains a `media` string which is a media query\n * such as `(min-width: 320px)`, and the image object to use when that query matches.\n */\nexport function withArtDirection(\n defaultImage: IGatsbyImageData,\n artDirected: Array\n): IGatsbyImageData {\n const { images, placeholder, ...props } = defaultImage\n const output: IGatsbyImageData = {\n ...props,\n images: {\n ...images,\n sources: [],\n },\n placeholder: placeholder && {\n ...placeholder,\n sources: [],\n },\n }\n\n artDirected.forEach(({ media, image }) => {\n if (!media) {\n if (process.env.NODE_ENV === `development`) {\n console.warn(\n \"[gatsby-plugin-image] All art-directed images passed to must have a value set for `media`. Skipping.\"\n )\n }\n return\n }\n\n if (\n image.layout !== defaultImage.layout &&\n process.env.NODE_ENV === `development`\n ) {\n console.warn(\n `[gatsby-plugin-image] Mismatched image layout: expected \"${defaultImage.layout}\" but received \"${image.layout}\". All art-directed images use the same layout as the default image`\n )\n }\n\n output.images.sources.push(\n ...image.images.sources.map(source => {\n return { ...source, media }\n }),\n {\n media,\n srcSet: image.images.fallback.srcSet,\n }\n )\n\n if (!output.placeholder) {\n return\n }\n\n output.placeholder.sources.push({\n media,\n srcSet: image.placeholder.fallback,\n })\n })\n output.images.sources.push(...images.sources)\n if (placeholder?.sources) {\n output.placeholder?.sources.push(...placeholder.sources)\n }\n return output\n}\n","import React, { Fragment, FunctionComponent, PropsWithChildren } from \"react\"\nimport terserMacro from \"../../macros/terser.macro\"\nimport { Layout } from \"../image-utils\"\n\nexport interface ILayoutWrapperProps {\n layout: Layout\n width: number\n height: number\n}\n\nconst NativeScriptLoading: FunctionComponent = () => (\n \n)\n\nexport function getSizer(\n layout: Layout,\n width: number,\n height: number\n): string {\n let sizer = ``\n if (layout === `fullWidth`) {\n sizer = `
    `\n }\n\n if (layout === `constrained`) {\n sizer = `
    \"\"
    `\n }\n\n return sizer\n}\n\nconst Sizer: FunctionComponent = function Sizer({\n layout,\n width,\n height,\n}) {\n if (layout === `fullWidth`) {\n return (\n
    \n )\n }\n\n if (layout === `constrained`) {\n return (\n
    \n \n
    \n )\n }\n\n return null\n}\n\nexport const LayoutWrapper: FunctionComponent<\n PropsWithChildren\n> = function LayoutWrapper({ children, ...props }) {\n return (\n \n \n {children}\n\n {SERVER ? : null}\n \n )\n}\n","import React, { FunctionComponent, ImgHTMLAttributes } from \"react\"\nimport * as PropTypes from \"prop-types\"\n\nexport interface IResponsiveImageProps {\n sizes?: string\n srcSet: string\n}\n\nexport type SourceProps = IResponsiveImageProps &\n (\n | {\n media: string\n type?: string\n }\n | {\n media?: string\n type: string\n }\n )\n\ntype FallbackProps = { src: string } & Partial\n\ntype ImageProps = ImgHTMLAttributes & {\n src: string\n alt: string\n shouldLoad: boolean\n}\n\nexport type PictureProps = ImgHTMLAttributes & {\n fallback?: FallbackProps\n sources?: Array\n alt: string\n shouldLoad?: boolean\n}\n\nconst Image: FunctionComponent = function Image({\n src,\n srcSet,\n loading,\n alt = ``,\n shouldLoad,\n ...props\n}) {\n return (\n \n )\n}\n\nexport const Picture: React.FC = function Picture({\n fallback,\n sources = [],\n shouldLoad = true,\n ...props\n}) {\n const sizes = props.sizes || fallback?.sizes\n const fallbackImage = (\n \n )\n\n if (!sources.length) {\n return fallbackImage\n }\n\n return (\n \n {sources.map(({ media, srcSet, type }) => (\n \n ))}\n {fallbackImage}\n \n )\n}\n\nImage.propTypes = {\n src: PropTypes.string.isRequired,\n alt: PropTypes.string.isRequired,\n sizes: PropTypes.string,\n srcSet: PropTypes.string,\n shouldLoad: PropTypes.bool,\n}\n\nPicture.displayName = `Picture`\nPicture.propTypes = {\n alt: PropTypes.string.isRequired,\n shouldLoad: PropTypes.bool,\n fallback: PropTypes.exact({\n src: PropTypes.string.isRequired,\n srcSet: PropTypes.string,\n sizes: PropTypes.string,\n }),\n sources: PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.exact({\n media: PropTypes.string.isRequired,\n type: PropTypes.string,\n sizes: PropTypes.string,\n srcSet: PropTypes.string.isRequired,\n }),\n PropTypes.exact({\n media: PropTypes.string,\n type: PropTypes.string.isRequired,\n sizes: PropTypes.string,\n srcSet: PropTypes.string.isRequired,\n }),\n ])\n ),\n}\n","import React, { FunctionComponent, ImgHTMLAttributes } from \"react\"\nimport * as PropTypes from \"prop-types\"\nimport { Picture, SourceProps } from \"./picture\"\n\nexport type PlaceholderProps = ImgHTMLAttributes & {\n fallback?: string\n sources?: Array\n}\n\nexport const Placeholder: FunctionComponent =\n function Placeholder({ fallback, ...props }) {\n if (fallback) {\n return (\n \n )\n } else {\n return
    \n }\n }\n\nPlaceholder.displayName = `Placeholder`\nPlaceholder.propTypes = {\n fallback: PropTypes.string,\n sources: Picture.propTypes?.sources,\n alt: function (props, propName, componentName): Error | null {\n if (!props[propName]) {\n return null\n }\n\n return new Error(\n `Invalid prop \\`${propName}\\` supplied to \\`${componentName}\\`. Validation failed.`\n )\n },\n}\n","import React from \"react\"\nimport { Picture, PictureProps } from \"./picture\"\n\nexport type MainImageProps = PictureProps\n\nexport const MainImage: React.FC = function MainImage(props) {\n return (\n <>\n \n \n \n )\n}\n\nMainImage.displayName = `MainImage`\nMainImage.propTypes = Picture.propTypes\n","import React from \"react\"\nimport { getWrapperProps, getMainProps, getPlaceholderProps } from \"./hooks\"\nimport { Placeholder } from \"./placeholder\"\nimport { MainImage, MainImageProps } from \"./main-image\"\nimport { LayoutWrapper } from \"./layout-wrapper\"\nimport PropTypes from \"prop-types\"\nimport type { FunctionComponent, WeakValidationMap } from \"react\"\nimport type { GatsbyImageProps, IGatsbyImageData } from \"./gatsby-image.browser\"\n\nconst removeNewLines = (str: string): string => str.replace(/\\n/g, ``)\n\nexport const GatsbyImage: FunctionComponent =\n function GatsbyImage({\n as = `div`,\n className,\n class: preactClass,\n style,\n image,\n loading = `lazy`,\n imgClassName,\n imgStyle,\n backgroundColor,\n objectFit,\n objectPosition,\n ...props\n }) {\n if (!image) {\n console.warn(`[gatsby-plugin-image] Missing image prop`)\n return null\n }\n\n if (preactClass) {\n className = preactClass\n }\n\n imgStyle = {\n objectFit,\n objectPosition,\n backgroundColor,\n ...imgStyle,\n }\n\n const {\n width,\n height,\n layout,\n images,\n placeholder,\n backgroundColor: placeholderBackgroundColor,\n } = image\n\n const {\n style: wStyle,\n className: wClass,\n ...wrapperProps\n } = getWrapperProps(width, height, layout)\n\n const cleanedImages: IGatsbyImageData[\"images\"] = {\n fallback: undefined,\n sources: [],\n }\n if (images.fallback) {\n cleanedImages.fallback = {\n ...images.fallback,\n srcSet: images.fallback.srcSet\n ? removeNewLines(images.fallback.srcSet)\n : undefined,\n }\n }\n\n if (images.sources) {\n cleanedImages.sources = images.sources.map(source => {\n return {\n ...source,\n srcSet: removeNewLines(source.srcSet),\n }\n })\n }\n\n return React.createElement(\n as,\n {\n ...wrapperProps,\n style: {\n ...wStyle,\n ...style,\n backgroundColor,\n },\n className: `${wClass}${className ? ` ${className}` : ``}`,\n },\n \n \n\n )}\n // When eager is set we want to start the isLoading state on true (we want to load the img without react)\n {...getMainProps(\n loading === `eager`,\n false,\n cleanedImages,\n loading,\n imgStyle\n )}\n />\n \n )\n }\n\nexport const altValidator: PropTypes.Validator = (\n props: GatsbyImageProps,\n propName,\n componentName,\n ...rest\n): Error | undefined => {\n if (!props.alt && props.alt !== ``) {\n return new Error(\n `The \"alt\" prop is required in ${componentName}. If the image is purely presentational then pass an empty string: e.g. alt=\"\". Learn more: https://a11y-style-guide.com/style-guide/section-media.html`\n )\n }\n\n return PropTypes.string(props, propName, componentName, ...rest)\n}\n\nexport const propTypes = {\n image: PropTypes.object.isRequired,\n alt: altValidator,\n} as WeakValidationMap\n","import {\n createElement,\n memo,\n useMemo,\n useEffect,\n useLayoutEffect,\n useRef,\n} from \"react\"\nimport {\n getWrapperProps,\n gatsbyImageIsInstalled,\n hasNativeLazyLoadSupport,\n} from \"./hooks\"\nimport { getSizer } from \"./layout-wrapper\"\nimport { propTypes } from \"./gatsby-image.server\"\nimport type {\n FC,\n ElementType,\n FunctionComponent,\n ImgHTMLAttributes,\n CSSProperties,\n ReactEventHandler,\n} from \"react\"\nimport type { renderImageToString } from \"./lazy-hydrate\"\nimport type { PlaceholderProps } from \"./placeholder\"\nimport type { MainImageProps } from \"./main-image\"\nimport type { Layout } from \"../image-utils\"\n\nconst imageCache = new Set()\nlet renderImageToStringPromise\nlet renderImage: typeof renderImageToString | undefined\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport interface GatsbyImageProps\n extends Omit<\n ImgHTMLAttributes,\n \"placeholder\" | \"onLoad\" | \"src\" | \"srcSet\" | \"width\" | \"height\"\n > {\n alt: string\n as?: ElementType\n className?: string\n class?: string\n imgClassName?: string\n image: IGatsbyImageData\n imgStyle?: CSSProperties\n backgroundColor?: string\n objectFit?: CSSProperties[\"objectFit\"]\n objectPosition?: CSSProperties[\"objectPosition\"]\n onLoad?: (props: { wasCached: boolean }) => void\n onError?: ReactEventHandler\n onStartLoad?: (props: { wasCached: boolean }) => void\n}\n\nexport interface IGatsbyImageData {\n layout: Layout\n width: number\n height: number\n backgroundColor?: string\n images: Pick\n placeholder?: Pick\n}\n\nconst GatsbyImageHydrator: FC = function GatsbyImageHydrator({\n as = `div`,\n image,\n style,\n backgroundColor,\n className,\n class: preactClass,\n onStartLoad,\n onLoad,\n onError,\n ...props\n}) {\n const { width, height, layout } = image\n const {\n style: wStyle,\n className: wClass,\n ...wrapperProps\n } = getWrapperProps(width, height, layout)\n const root = useRef()\n const cacheKey = useMemo(() => JSON.stringify(image.images), [image.images])\n\n // Preact uses class instead of className so we need to check for both\n if (preactClass) {\n className = preactClass\n }\n\n const sizer = getSizer(layout, width, height)\n\n useEffect(() => {\n if (!renderImageToStringPromise) {\n renderImageToStringPromise = import(`./lazy-hydrate`).then(\n ({ renderImageToString, swapPlaceholderImage }) => {\n renderImage = renderImageToString\n\n return {\n renderImageToString,\n swapPlaceholderImage,\n }\n }\n )\n }\n\n // The plugin image component is a bit special where if it's server-side rendered, we add extra script tags to support lazy-loading without\n // In this case we stop hydration but fire the correct events.\n const ssrImage = root.current.querySelector(\n `[data-gatsby-image-ssr]`\n ) as HTMLImageElement\n if (ssrImage && hasNativeLazyLoadSupport()) {\n if (ssrImage.complete) {\n // Trigger onStartload and onLoad events\n onStartLoad?.({\n wasCached: true,\n })\n onLoad?.({\n wasCached: true,\n })\n\n // remove ssr key for state updates but add delay to not fight with native code snippt of gatsby-ssr\n setTimeout(() => {\n ssrImage.removeAttribute(`data-gatsby-image-ssr`)\n }, 0)\n } else {\n onStartLoad?.({\n wasCached: true,\n })\n\n ssrImage.addEventListener(`load`, function onLoadListener() {\n ssrImage.removeEventListener(`load`, onLoadListener)\n\n onLoad?.({\n wasCached: true,\n })\n // remove ssr key for state updates but add delay to not fight with native code snippt of gatsby-ssr\n setTimeout(() => {\n ssrImage.removeAttribute(`data-gatsby-image-ssr`)\n }, 0)\n })\n }\n\n imageCache.add(cacheKey)\n\n return\n }\n\n if (renderImage && imageCache.has(cacheKey)) {\n return\n }\n\n let animationFrame\n let cleanupCallback\n renderImageToStringPromise.then(\n ({ renderImageToString, swapPlaceholderImage }) => {\n if (!root.current) {\n return\n }\n\n root.current.innerHTML = renderImageToString({\n isLoading: true,\n isLoaded: imageCache.has(cacheKey),\n image,\n ...props,\n })\n\n if (!imageCache.has(cacheKey)) {\n animationFrame = requestAnimationFrame(() => {\n if (root.current) {\n cleanupCallback = swapPlaceholderImage(\n root.current,\n cacheKey,\n imageCache,\n style,\n onStartLoad,\n onLoad,\n onError\n )\n }\n })\n }\n }\n )\n\n // eslint-disable-next-line consistent-return\n return (): void => {\n if (animationFrame) {\n cancelAnimationFrame(animationFrame)\n }\n if (cleanupCallback) {\n cleanupCallback()\n }\n }\n }, [image])\n\n // useLayoutEffect is ran before React commits to the DOM. This allows us to make sure our HTML is using our cached image version\n useLayoutEffect(() => {\n if (imageCache.has(cacheKey) && renderImage) {\n root.current.innerHTML = renderImage({\n isLoading: imageCache.has(cacheKey),\n isLoaded: imageCache.has(cacheKey),\n image,\n ...props,\n })\n\n // Trigger onStartload and onLoad events\n onStartLoad?.({\n wasCached: true,\n })\n onLoad?.({\n wasCached: true,\n })\n }\n }, [image])\n\n // By keeping all props equal React will keep the component in the DOM\n return createElement(as, {\n ...wrapperProps,\n style: {\n ...wStyle,\n ...style,\n backgroundColor,\n },\n className: `${wClass}${className ? ` ${className}` : ``}`,\n ref: root,\n dangerouslySetInnerHTML: {\n __html: sizer,\n },\n suppressHydrationWarning: true,\n })\n}\n\nexport const GatsbyImage: FunctionComponent = memo(\n function GatsbyImage(props) {\n if (!props.image) {\n if (process.env.NODE_ENV === `development`) {\n console.warn(`[gatsby-plugin-image] Missing image prop`)\n }\n\n return null\n }\n\n if (!gatsbyImageIsInstalled() && process.env.NODE_ENV === `development`) {\n console.warn(\n `[gatsby-plugin-image] You're missing out on some cool performance features. Please add \"gatsby-plugin-image\" to your gatsby-config.js`\n )\n }\n\n return createElement(GatsbyImageHydrator, props)\n }\n)\n\nGatsbyImage.propTypes = propTypes\nGatsbyImage.displayName = `GatsbyImage`\n","import React, { FunctionComponent, ReactElement } from \"react\"\nimport {\n altValidator,\n GatsbyImage as GatsbyImageServer,\n} from \"./gatsby-image.server\"\nimport { GatsbyImageProps, IGatsbyImageData } from \"./gatsby-image.browser\"\nimport PropTypes from \"prop-types\"\nimport { ISharpGatsbyImageArgs } from \"../image-utils\"\n\nexport interface IStaticImageProps\n extends Omit,\n Omit {\n src: string\n filename?: string\n}\n\n// These values are added by Babel. Do not add them manually\ninterface IPrivateProps {\n __imageData?: IGatsbyImageData\n __error?: string\n}\n\nexport function _getStaticImage(\n GatsbyImage: FunctionComponent\n): React.FC {\n return function StaticImage({\n src,\n __imageData: imageData,\n __error,\n // We extract these because they're not meant to be passed-down to GatsbyImage\n /* eslint-disable @typescript-eslint/no-unused-vars */\n width,\n height,\n aspectRatio,\n tracedSVGOptions,\n placeholder,\n formats,\n quality,\n transformOptions,\n jpgOptions,\n pngOptions,\n webpOptions,\n avifOptions,\n blurredOptions,\n breakpoints,\n outputPixelDensities,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...props\n }): ReactElement {\n if (__error) {\n console.warn(__error)\n }\n\n if (imageData) {\n return \n }\n console.warn(`Image not loaded`, src)\n if (!__error && process.env.NODE_ENV === `development`) {\n console.warn(\n `Please ensure that \"gatsby-plugin-image\" is included in the plugins array in gatsby-config.js, and that your version of gatsby is at least 2.24.78`\n )\n }\n return null\n }\n}\n\nconst StaticImage: React.FC =\n _getStaticImage(GatsbyImageServer)\n\nconst checkDimensionProps: PropTypes.Validator = (\n props: IStaticImageProps & IPrivateProps,\n propName: keyof IStaticImageProps & IPrivateProps,\n ...rest\n) => {\n if (\n props.layout === `fullWidth` &&\n (propName === `width` || propName === `height`) &&\n props[propName]\n ) {\n return new Error(\n `\"${propName}\" ${props[propName]} may not be passed when layout is fullWidth.`\n )\n }\n return PropTypes.number(props, propName, ...rest)\n}\n\nconst validLayouts = new Set([`fixed`, `fullWidth`, `constrained`])\n\nexport const propTypes = {\n src: PropTypes.string.isRequired,\n alt: altValidator,\n width: checkDimensionProps,\n height: checkDimensionProps,\n sizes: PropTypes.string,\n layout: (props: IStaticImageProps & IPrivateProps): Error | undefined => {\n if (props.layout === undefined) {\n return undefined\n }\n if (validLayouts.has(props.layout)) {\n return undefined\n }\n\n return new Error(\n `Invalid value ${props.layout}\" provided for prop \"layout\". Defaulting to \"constrained\". Valid values are \"fixed\", \"fullWidth\" or \"constrained\".`\n )\n },\n}\n\nStaticImage.displayName = `StaticImage`\nStaticImage.propTypes = propTypes\n\nexport { StaticImage }\n","import {\n GatsbyImage as GatsbyImageBrowser,\n IGatsbyImageData,\n} from \"./gatsby-image.browser\"\nimport React from \"react\"\nimport {\n _getStaticImage,\n propTypes,\n IStaticImageProps,\n} from \"./static-image.server\"\n// These values are added by Babel. Do not add them manually\ninterface IPrivateProps {\n __imageData?: IGatsbyImageData\n __error?: string\n}\n\nconst StaticImage: React.FC =\n _getStaticImage(GatsbyImageBrowser)\n\nStaticImage.displayName = `StaticImage`\nStaticImage.propTypes = propTypes\n\nexport { StaticImage }\n","import React from \"react\"\nimport {Link} from \"gatsby\"\nimport PropTypes from \"prop-types\"\n\nconst NavBar = ({siteTitle, menuLinks}) => (\n\n \n)\n\nNavBar.propTypes = {\n siteTitle: PropTypes.string,\n menuLinks: PropTypes.array\n}\n\nNavBar.defaultProps = {\n siteTitle: ``,\n menuLinks: ``\n}\n\nexport default NavBar\n","import React from 'react';\nimport {StaticQuery, graphql} from \"gatsby\"\nimport {GatsbyImage, getImage} from \"gatsby-plugin-image\"\nimport {Container, Col, Row} from \"react-bootstrap\";\n\nclass Logos extends React.Component {\n\n render() {\n\n return (\n \n \n \n {this.props.logos.nodes.map((item, i) => (\n \n \n \n \n ))}\n\n \n \n \n )\n }\n}\n\nconst PartnerLogos = () => (\n (\n \n )}\n />\n);\n\nexport default PartnerLogos;\n","import React from \"react\";\nimport { Col, Container, Row } from \"react-bootstrap\";\nimport PropTypes from \"prop-types\";\nimport {Link} from \"gatsby\";\n\nconst Footer = ({siteTitle, footerLinks},) => {\n return (\n <>\n \n \n
    \n\n\n
    \n \n \n \n

    {siteTitle}

    \n
    \n\n \n\n \n

    Further information

    \n
    \n
      \n {footerLinks.map(link => (\n
    • {link.name}
    • \n ))}\n
    \n\n \n\n \n

    Contact

    \n \n

    \n c/o Historic England
    \n 4th Floor
    \n Cannon Bridge House
    \n 25 Dowgate Hill
    \n London
    \n EC4R 2YA\n

    \n \n
    \n
    \n
    \n\n
    \n\n
    \n
    \n \n );\n};\nFooter.propTypes = {\n siteTitle: PropTypes.string,\n footerLinks: PropTypes.array\n}\n\nFooter.defaultProps = {\n siteTitle: ``,\n footerLinks: ``\n}\n\nexport default Footer;\n","import { useEffect } from \"react\";\n\nimport 'vanilla-cookieconsent';\nimport 'vanilla-cookieconsent/dist/cookieconsent.css';\n\nexport default function CookieConsent() {\n useEffect(() => {\n const logo = '';\n const cookie = '🍪';\n if (!document.getElementById('cc--main')) {\n window.CookieConsentApi = window.initCookieConsent();\n window.CookieConsentApi.run({\n current_lang : 'en',\n autoclear_cookies : true, // default: false\n cookie_name: 'dejp3-cookies', // default: 'cc_cookie'\n cookie_expiration : 365, // default: 182\n page_scripts: true, // default: false\n\n force_consent: true,\n hide_from_bots: true, // default: false\n\n gui_options: {\n consent_modal: {\n layout: 'box', // box,cloud,bar\n position: 'bottom left', // bottom,middle,top + left,right,center\n transition: 'slide' // zoom,slide\n },\n settings_modal: {\n layout: 'box', // box,bar\n position: 'left', // right,left (available only if bar layout selected)\n transition: 'slide' // zoom,slide\n }\n },\n\n onFirstAction: function(){\n console.log('onFirstAction fired');\n },\n\n onAccept: function (cookie) {\n console.log('onAccept fired ...');\n },\n\n onChange: function (cookie, changed_preferences) {\n console.log('onChange fired ...');\n },\n\n languages: {\n 'en': {\n consent_modal: {\n title: cookie + ' We use cookies! ',\n description: 'Hi, this website uses essential cookies to ensure its proper operation and tracking cookies to understand how you interact with it. The latter will be set only after consent. ',\n primary_btn: {\n text: 'Accept all',\n role: 'accept_all' // 'accept_selected' or 'accept_all'\n },\n secondary_btn: {\n text: 'Reject all',\n role: 'accept_necessary' // 'settings' or 'accept_necessary'\n }\n },\n settings_modal: {\n title: logo,\n save_settings_btn: 'Save my choices',\n accept_all_btn: 'Accept all',\n reject_all_btn: 'Reject all',\n close_btn_label: 'Close',\n cookie_table_headers: [\n {col1: 'Name'},\n {col2: 'Domain'},\n {col3: 'Expiration'},\n {col4: 'Description'}\n ],\n blocks: [\n {\n title: 'Cookie usage and the Fitzwilliam website',\n description: 'I use cookies to ensure the basic functionalities of the website and to enhance your online experience. You can choose for each category to opt-in/out whenever you want.'\n }, {\n title: 'Strictly necessary cookies',\n description: 'These cookies are essential for the proper functioning of my website. Without these cookies, the website would not work properly',\n toggle: {\n value: 'necessary',\n enabled: true,\n readonly: true // cookie categories with readonly=true are all treated as \"necessary cookies\"\n }\n }, {\n title: 'Performance and Analytics cookies',\n description: 'These cookies allow the website to remember the choices you have made in the past',\n toggle: {\n value: 'analytics', // there are no default categories => you specify them\n enabled: true,\n readonly: false\n },\n cookie_table: [\n {\n col1: '^_ga',\n col2: 'google.com',\n col3: '2 years',\n col4: 'Google Analytics identifies unique users across GA sessions through client ID. The client ID is stored in the Google Analytics cookie. The GA cookie is set when a person visits your website for the first time. Google Analytics sends the client ID with each hit to associate hits with a user.',\n is_regex: true\n },\n {\n col1: '_gid',\n col2: 'google.com',\n col3: '1 day',\n col4: 'This cookie is installed by Google Analytics. The cookie is used to store information of how visitors use a website and helps in creating an analytics report of how the website is doing.',\n }\n ]\n }, {\n title: 'Advertisement and Targeting cookies',\n description: 'These cookies collect information about how you use the website, which pages you visited and which links you clicked on. All of the data is anonymized and cannot be used to identify you',\n toggle: {\n value: 'targeting',\n enabled: false,\n readonly: false\n }\n }, {\n title: 'More information',\n description: 'For any queries in relation to our policy on cookies and your choices, please review the University of Cambridge policy.',\n }\n ]\n }\n }\n }\n });\n }\n\n }, []);\n\n return null;\n}","import * as React from \"react\"\nimport {useStaticQuery, graphql} from \"gatsby\"\n\nimport NavBar from \"./structure/nav\";\nimport Logos from \"./structure/logos\";\nimport Footer from \"./structure/footer\";\nimport BackToTop from 'react-back-to-top';\nimport CookieConsent from '../services/cookieconsent';\nimport \"./layout.css\"\nconst Layout = ({children}) => {\n\n const data = useStaticQuery(graphql`\n query SiteTitleQuery {\n site {\n siteMetadata {\n title\n menuLinks {\n name\n link\n id\n }\n footerLinks {\n name\n link\n id\n }\n }\n }\n }\n `)\n\n return (\n <>\n \n
    \n\n
    \n {children}\n
    \n
    \n \n
    \n \n \n\n \n )\n}\n\nexport default Layout\n","import React from \"react\";\nimport { useSiteMetadata } from \"../../hooks/use-site-metadata\";\n\nconst Seo = ({ title, description, pathname, children }) => {\n const { title: defaultTitle, description: defaultDescription, image, siteUrl, twitterHandle } = useSiteMetadata();\n const seo = {\n title: title || defaultTitle,\n description: description || defaultDescription,\n image: `${siteUrl}${image}`,\n url: `${siteUrl}${pathname || ``}`,\n twitterHandle\n };\n\n return (\n <>\n {seo.title}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {children}\n \n );\n};\n\nexport default Seo;","import { graphql, useStaticQuery } from \"gatsby\"\n\nexport const useSiteMetadata = () => {\n const data = useStaticQuery(graphql`\n query {\n site {\n siteMetadata {\n title\n description\n twitterHandle\n image \n siteUrl\n }\n }\n }\n `)\n\n return data.site.siteMetadata\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nvar _react = _interopRequireWildcard(require(\"react\"));\n\nvar _utils = require(\"./utils\");\n\nrequire(\"./BackToTop.css\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar BackToTop =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(BackToTop, _Component);\n\n function BackToTop(props) {\n var _this;\n\n _classCallCheck(this, BackToTop);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(BackToTop).call(this, props));\n _this.state = {\n percent: 0,\n current: 0\n };\n _this.animate = _this.props.animate || 'fade';\n /**1、fade(default) 2、rotate 3、none */\n\n _this.mainStyle = _this.props.mainStyle || {};\n _this.percentStyle = _this.props.percentStyle || {};\n _this.offsetTop = _this.props.offsetTop || 0;\n _this.step = _this.props.step || 50;\n _this.visiblePercent = _this.props.visiblePercent > 0 ? _this.props.visiblePercent : 1;\n _this.isPercent = _this.props.isPercent === undefined ? true : _this.props.isPercent;\n return _this;\n }\n\n _createClass(BackToTop, [{\n key: \"scrollToTop\",\n value: function scrollToTop() {\n (0, _utils.ScrollToAnimate)(this.props.offsetTop, this.props.step, this.state.current);\n }\n }, {\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n if (window) {\n window.onscroll = function () {\n _this2.setState({\n percent: (0, _utils.getScrollPercent)(_this2.props.offsetTop),\n current: (0, _utils.getScrollTop)()\n }); // this.setState({ current: getScrollTop() });\n\n };\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this3 = this;\n\n var _this$props = this.props,\n animate = _this$props.animate,\n children = _this$props.children;\n var visible = this.state.percent >= this.visiblePercent;\n var animateHide = 'c-animate-hide';\n var animateShow = 'c-animate-show';\n\n if (animate !== 'fade' && animate !== 'rotate') {\n if (animate !== 'none') {\n animateHide = 'fade-hide';\n animateShow = 'fade-show';\n }\n } else {\n animateHide = animate + '-hide';\n animateShow = animate + '-show';\n }\n\n return _react[\"default\"].createElement(\"div\", {\n onClick: function onClick() {\n return _this3.scrollToTop();\n },\n className: 'base-back-to-up ' + (visible ? animateShow : animateHide)\n }, _react[\"default\"].createElement(\"div\", {\n className: \"back-to-up-default\",\n style: this.mainStyle\n }, children ? Array.isArray(children) ? children.map(child, function (index) {\n return _react[\"default\"].createElement(\"div\", {\n key: index\n }, child);\n }) : children && _react[\"default\"].createElement(\"div\", null, children) : _react[\"default\"].createElement(\"div\", {\n className: \"back-to-up-default-text\"\n }, _react[\"default\"].createElement(\"span\", null, \"UP\")), _react[\"default\"].createElement(\"div\", {\n className: 'to-up-percent' + (this.isPercent ? '' : ' percent-hide'),\n style: this.percentStyle\n }, this.state.percent + '%')));\n }\n }]);\n\n return BackToTop;\n}(_react.Component);\n\nvar _default = BackToTop;\nexports[\"default\"] = _default;\n//# sourceMappingURL=BackToTop.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getScrollTop = getScrollTop;\nexports.ScrollToAnimate = ScrollToAnimate;\nexports.getScrollPercent = getScrollPercent;\n\n/**\n * 获取当前滚动条所在位置\n */\nfunction getScrollTop() {\n var scrollTop = 0;\n\n if (document.documentElement && document.documentElement.scrollTop) {\n scrollTop = document.documentElement.scrollTop;\n } else if (document.body) {\n scrollTop = document.body.scrollTop;\n }\n\n return scrollTop;\n}\n/**\n * TODO\n * @param {*} position 滚动到何处\n * @param {*} step 步长\n * @param {*} current 滚动条当前位置\n */\n\n\nfunction ScrollToAnimate(position, step, current) {\n var start = 0;\n var timer = setInterval(function () {\n if (current - start >= position) {\n start += step;\n\n if (current - start >= position) {\n window.scrollTo(0, current - start);\n } else {\n window.scrollTo(0, position);\n }\n } else {\n clearInterval(timer);\n }\n }, 0);\n}\n/**\n * 获取滚动条位置百分比\n */\n\n\nfunction getScrollPercent(offsetTop) {\n var percent = 0;\n\n if (offsetTop < getScrollTop()) {\n percent = Math.round((getScrollTop() - offsetTop) / (document.body.scrollHeight - offsetTop - window.innerHeight) * 100);\n }\n\n return percent > 100 ? 100 : percent;\n}\n//# sourceMappingURL=utils.js.map","module.exports = require(\"./dist/BackToTop\");\nexports.default = require(\"./dist/BackToTop\");\n","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport function useCol({\n as,\n bsPrefix,\n className,\n ...props\n}) {\n bsPrefix = useBootstrapPrefix(bsPrefix, 'col');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const spans = [];\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let span;\n let offset;\n let order;\n if (typeof propValue === 'object' && propValue != null) {\n ({\n span,\n offset,\n order\n } = propValue);\n } else {\n span = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (span) spans.push(span === true ? `${bsPrefix}${infix}` : `${bsPrefix}${infix}-${span}`);\n if (order != null) classes.push(`order${infix}-${order}`);\n if (offset != null) classes.push(`offset${infix}-${offset}`);\n });\n return [{\n ...props,\n className: classNames(className, ...spans, ...classes)\n }, {\n as,\n bsPrefix,\n spans\n }];\n}\nconst Col = /*#__PURE__*/React.forwardRef(\n// Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n(props, ref) => {\n const [{\n className,\n ...colProps\n }, {\n as: Component = 'div',\n bsPrefix,\n spans\n }] = useCol(props);\n return /*#__PURE__*/_jsx(Component, {\n ...colProps,\n ref: ref,\n className: classNames(className, !spans.length && bsPrefix)\n });\n});\nCol.displayName = 'Col';\nexport default Col;","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Container = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n fluid = false,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n className,\n ...props\n}, ref) => {\n const prefix = useBootstrapPrefix(bsPrefix, 'container');\n const suffix = typeof fluid === 'string' ? `-${fluid}` : '-fluid';\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, fluid ? `${prefix}${suffix}` : prefix)\n });\n});\nContainer.displayName = 'Container';\nexport default Container;","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;","\"use client\";\n\nimport * as React from 'react';\nimport { useContext, useMemo } from 'react';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const DEFAULT_BREAKPOINTS = ['xxl', 'xl', 'lg', 'md', 'sm', 'xs'];\nexport const DEFAULT_MIN_BREAKPOINT = 'xs';\nconst ThemeContext = /*#__PURE__*/React.createContext({\n prefixes: {},\n breakpoints: DEFAULT_BREAKPOINTS,\n minBreakpoint: DEFAULT_MIN_BREAKPOINT\n});\nconst {\n Consumer,\n Provider\n} = ThemeContext;\nfunction ThemeProvider({\n prefixes = {},\n breakpoints = DEFAULT_BREAKPOINTS,\n minBreakpoint = DEFAULT_MIN_BREAKPOINT,\n dir,\n children\n}) {\n const contextValue = useMemo(() => ({\n prefixes: {\n ...prefixes\n },\n breakpoints,\n minBreakpoint,\n dir\n }), [prefixes, breakpoints, minBreakpoint, dir]);\n return /*#__PURE__*/_jsx(Provider, {\n value: contextValue,\n children: children\n });\n}\nexport function useBootstrapPrefix(prefix, defaultPrefix) {\n const {\n prefixes\n } = useContext(ThemeContext);\n return prefix || prefixes[defaultPrefix] || defaultPrefix;\n}\nexport function useBootstrapBreakpoints() {\n const {\n breakpoints\n } = useContext(ThemeContext);\n return breakpoints;\n}\nexport function useBootstrapMinBreakpoint() {\n const {\n minBreakpoint\n } = useContext(ThemeContext);\n return minBreakpoint;\n}\nexport function useIsRTL() {\n const {\n dir\n } = useContext(ThemeContext);\n return dir === 'rtl';\n}\nfunction createBootstrapComponent(Component, opts) {\n if (typeof opts === 'string') opts = {\n prefix: opts\n };\n const isClassy = Component.prototype && Component.prototype.isReactComponent;\n // If it's a functional component make sure we don't break it with a ref\n const {\n prefix,\n forwardRefAs = isClassy ? 'ref' : 'innerRef'\n } = opts;\n const Wrapped = /*#__PURE__*/React.forwardRef(({\n ...props\n }, ref) => {\n props[forwardRefAs] = ref;\n const bsPrefix = useBootstrapPrefix(props.bsPrefix, prefix);\n return /*#__PURE__*/_jsx(Component, {\n ...props,\n bsPrefix: bsPrefix\n });\n });\n Wrapped.displayName = `Bootstrap(${Component.displayName || Component.name})`;\n return Wrapped;\n}\nexport { createBootstrapComponent, Consumer as ThemeConsumer };\nexport default ThemeProvider;","/*!\n * CookieConsent v2.9.2\n * https://www.github.com/orestbida/cookieconsent\n * Author Orest Bida\n * Released under the MIT License\n */\n!function(){'use strict';var n='initCookieConsent';'undefined'!=typeof window&&'function'!=typeof window[n]&&(window[n]=function(n){var t,o,e,i,r,a,c,u,f,d,v,l,s,p,b,m,y,g,h,_,w,k,x,S,J,O,j,N,T,D,C,U,z,E,I,L={mode:'opt-in',current_lang:'en',auto_language:null,autorun:!0,page_scripts:!0,hide_from_bots:!0,cookie_name:'cc_cookie',cookie_expiration:182,cookie_domain:location.hostname,cookie_path:'/',cookie_same_site:'Lax',use_rfc_cookie:!1,autoclear_cookies:!0,revision:0,script_selector:'data-cookiecategory'},M={},R={},A=null,G=!0,H=!1,P=!1,q=!1,B=!1,F=!0,K=[],Q=!1,V=[],W=[],X=[],Y=!1,Z=[],$=[],nn=[],tn=[],on=[],en=document.documentElement,rn=function(n){'number'==typeof(t=n).cookie_expiration&&(L.cookie_expiration=t.cookie_expiration),'number'==typeof t.cookie_necessary_only_expiration&&(L.cookie_necessary_only_expiration=t.cookie_necessary_only_expiration),'boolean'==typeof t.autorun&&(L.autorun=t.autorun),'string'==typeof t.cookie_domain&&(L.cookie_domain=t.cookie_domain),'string'==typeof t.cookie_same_site&&(L.cookie_same_site=t.cookie_same_site),'string'==typeof t.cookie_path&&(L.cookie_path=t.cookie_path),'string'==typeof t.cookie_name&&(L.cookie_name=t.cookie_name),'function'==typeof t.onAccept&&(v=t.onAccept),'function'==typeof t.onFirstAction&&(s=t.onFirstAction),'function'==typeof t.onChange&&(l=t.onChange),'opt-out'===t.mode&&(L.mode='opt-out'),'number'==typeof t.revision&&(t.revision>-1&&(L.revision=t.revision),B=!0),'boolean'==typeof t.autoclear_cookies&&(L.autoclear_cookies=t.autoclear_cookies),!0===t.use_rfc_cookie&&(L.use_rfc_cookie=!0),'boolean'==typeof t.hide_from_bots&&(L.hide_from_bots=t.hide_from_bots),L.hide_from_bots&&(Y=navigator&&(navigator.userAgent&&/bot|crawl|spider|slurp|teoma/i.test(navigator.userAgent)||navigator.webdriver)),L.page_scripts=!0===t.page_scripts,'browser'===t.auto_language||!0===t.auto_language?L.auto_language='browser':'document'===t.auto_language&&(L.auto_language='document'),L.auto_language,L.current_lang=sn(t.languages,t.current_lang)},an=function(n){for(var t='accept-',o=c('c-settings'),e=c(t+'all'),i=c(t+'necessary'),r=c(t+'custom'),a=0;a0?t.hasOwnProperty(L.current_lang)?L.current_lang:kn(t)[0]:void 0},un=function(n){if(!0===t.force_consent&&xn(en,'force--consent'),!h){h=ln('div');var o=ln('div'),e=ln('div');h.id='cm',o.id='c-inr-i',e.id='cm-ov',h.tabIndex=-1,h.setAttribute('role','dialog'),h.setAttribute('aria-modal','true'),h.setAttribute('aria-hidden','false'),h.setAttribute('aria-labelledby','c-ttl'),h.setAttribute('aria-describedby','c-txt'),g.appendChild(h),g.appendChild(e),h.style.visibility=e.style.visibility='hidden',e.style.opacity=0}var i=t.languages[n].consent_modal.title;i&&(_||((_=ln('h2')).id='c-ttl',o.appendChild(_)),_.innerHTML=i);var r=t.languages[n].consent_modal.description;B&&(r=F?r.replace('{{revision_message}}',''):r.replace('{{revision_message}}',t.languages[n].consent_modal.revision_message||'')),w||((w=ln('div')).id='c-txt',o.appendChild(w)),w.innerHTML=r;var a,c=t.languages[n].consent_modal.primary_btn,u=t.languages[n].consent_modal.secondary_btn;c&&(k||((k=ln('button')).id='c-p-bn',k.className='c-bn',k.appendChild(On(1)),'accept_all'===c.role&&(a='all'),wn(k,'click',(function(){M.hide(),M.accept(a)}))),k.firstElementChild.innerHTML=t.languages[n].consent_modal.primary_btn.text),u&&(x||((x=ln('button')).id='c-s-bn',x.className='c-bn c_link',x.appendChild(On(1)),'accept_necessary'===u.role?wn(x,'click',(function(){M.hide(),M.accept([])})):wn(x,'click',(function(){M.showSettings(0)}))),x.firstElementChild.innerHTML=t.languages[n].consent_modal.secondary_btn.text);var f=t.gui_options;J||((J=ln('div')).id='c-inr',J.appendChild(o)),S||((S=ln('div')).id='c-bns',f&&f.consent_modal&&!0===f.consent_modal.swap_buttons?(u&&S.appendChild(x),c&&S.appendChild(k),S.className='swap'):(c&&S.appendChild(k),u&&S.appendChild(x)),(c||u)&&J.appendChild(S),h.appendChild(J)),H=!0,an(J)},fn=function(n){if(O)(C=ln('div')).id='s-bl';else{(O=ln('div')).tabIndex=-1;var o=ln('div'),e=ln('div'),i=ln('div');j=ln('div'),N=ln('h2');var r=ln('div');(T=ln('button')).appendChild(On(2));var a=ln('div');D=ln('div');var c=ln('div'),u=!1;wn(O,'mouseup',(function(n){!q||u||j.contains(n.target)||M.hideSettings()})),wn(O,'mousedown',(function(n){q&&(u=j.contains(n.target))})),O.id='s-cnt',o.id='c-vln',i.id='c-s-in',e.id='cs',N.id='s-ttl',j.id='s-inr',r.id='s-hdr',D.id='s-bl',T.id='s-c-bn',c.id='cs-ov',a.id='s-c-bnc',T.className='c-bn',O.setAttribute('role','dialog'),O.setAttribute('aria-modal','true'),O.setAttribute('aria-hidden','true'),O.setAttribute('aria-labelledby','s-ttl'),O.style.visibility=c.style.visibility='hidden',c.style.opacity=0,a.appendChild(T),wn(document,'keydown',(function(n){27===n.keyCode&&q&&M.hideSettings()}),!0),wn(T,'click',(function(){M.hideSettings()}))}var v=t.languages[n].settings_modal;T.setAttribute('aria-label',v.close_btn_label||'Close'),d=v.blocks,f=v.cookie_table_headers;var l=v.cookie_table_caption,s=d.length;N.innerHTML=v.title;for(var p=0;p-1?(P.checked=!0,!C&&nn.push(!0)):!C&&nn.push(!1),!C&&tn.push(V),y.readonly&&(P.disabled=!0,xn(B,'c-ro'),!C&&on.push(V)),xn(x,'b-acc'),xn(J,'b-bn'),xn(k,'b-ex'),x.id=L,x.setAttribute('aria-hidden','true'),H.appendChild(P),H.appendChild(B),H.appendChild(F),J.appendChild(H),w&&function(n,t,o){wn(A,'click',(function(){Jn(t,'act')?(Sn(t,'act'),o.setAttribute('aria-expanded','false'),n.setAttribute('aria-hidden','true')):(xn(t,'act'),o.setAttribute('aria-expanded','true'),n.setAttribute('aria-hidden','false'))}),!1)}(x,k,A)}else if(b){var W=ln('div');W.className='b-tl',W.setAttribute('role','heading'),W.setAttribute('aria-level','3'),W.insertAdjacentHTML('beforeend',b),J.appendChild(W)}if(b&&k.appendChild(J),m&&x.appendChild(S),!_&&void 0!==h){for(var Y=document.createDocumentFragment(),Z=0;Z-1;if(!nn[++o]&&c.hasOwnProperty('cookie_table')&&(n||u)){var v=c.cookie_table,l=kn(f[0])[0],s=v.length;'on_disable'===c.toggle.reload&&u&&(Q=!0);for(var p=0;p-1&&y.push(e[x])}y.length>0&&(_n(y,w,b),'on_clear'===c.toggle.reload&&(Q=!0))}}}}},vn=function(n,t){return n.indexOf(t)},ln=function(n){var t=document.createElement(n);return'button'===n&&t.setAttribute('type',n),t},sn=function(n,t){return'browser'===L.auto_language?cn(pn(),n):'document'===L.auto_language?cn(document.documentElement.lang,n):'string'==typeof t?L.current_lang=cn(t,n):(L.current_lang,L.current_lang)},pn=function(){var n=navigator.language||navigator.browserLanguage;return n.length>2&&(n=n[0]+n[1]),n.toLowerCase()};M.allowedCategory=function(n){if(G&&'opt-in'!==L.mode)t=X;else var t=JSON.parse(hn(L.cookie_name,'one',!0)||'{}').categories||[];return vn(t,n)>-1},M.run=function(t){if(!document.getElementById('cc_div')){if(rn(t),Y)return;R=JSON.parse(hn(L.cookie_name,'one',!0)||'{}');var c=void 0!==(i=R.consent_uuid);if((o=R.consent_date)&&(o=new Date(o)),(e=R.last_consent_update)&&(e=new Date(e)),A=void 0!==R.data?R.data:null,B&&R.revision!==L.revision&&(F=!1),H=G=!(c&&F&&o&&e&&i),function(){(y=ln('div')).id='cc--main',y.style.position='fixed',y.innerHTML='
    ',g=y.children[0];var t=L.current_lang;H&&un(t),fn(t),(n||document.body).appendChild(y)}(),function(){var n=['[href]','button','input','details','[tabindex=\"0\"]'];function t(t,o){try{var e=t.querySelectorAll(n.join(':not([tabindex=\"-1\"]), '))}catch(o){return t.querySelectorAll(n.join(', '))}o[0]=e[0],o[1]=e[e.length-1]}t(j,$),H&&t(h,Z)}(),function(n,t){if('object'==typeof n){var o=n.consent_modal,e=n.settings_modal;H&&o&&i(h,['box','bar','cloud'],['top','middle','bottom'],['zoom','slide'],o.layout,o.position,o.transition),e&&i(O,['bar'],['left','right'],['zoom','slide'],e.layout,e.position,e.transition)}function i(n,t,o,e,i,r,a){if(r=r&&r.split(' ')||[],vn(t,i)>-1&&(xn(n,i),('bar'!==i||'middle'!==r[0])&&vn(o,r[0])>-1))for(var c=0;c-1&&xn(n,a)}}(t.gui_options),an(),L.autorun&&H&&M.show(t.delay||0),setTimeout((function(){xn(y,'c--anim')}),30),setTimeout((function(){wn(document,'keydown',(function(n){if('Tab'===n.key&&(P||q)&&r){var t=Tn();n.shiftKey?t!==r[0]&&a.contains(t)||(n.preventDefault(),jn(r[1])):t!==r[1]&&a.contains(t)||(n.preventDefault(),jn(r[0]))}}))}),100),G)'opt-out'===L.mode&&(L.mode,bn());else{var u='boolean'==typeof R.rfc_cookie;(!u||u&&R.rfc_cookie!==L.use_rfc_cookie)&&(R.rfc_cookie=L.use_rfc_cookie,gn(L.cookie_name,JSON.stringify(R))),p=yn(mn()),bn(),'function'==typeof v&&v(R)}}};var bn=function(){if(L.page_scripts){var n=R.categories||[];G&&'opt-out'===L.mode&&(n=X);var t=document.querySelectorAll('script['+L.script_selector+']'),o=function(t,e){if(e-1){i.type=i.getAttribute('data-type')||'text/javascript',i.removeAttribute(L.script_selector);var a=i.getAttribute('data-src');a&&i.removeAttribute('data-src');var c=ln('script');if(c.textContent=i.innerHTML,function(n,t){for(var o=t.attributes,e=o.length,i=0;i0)for(var r=0;r0?n:t?30:0))},M.hide=function(){H&&(P=!1,jn(c),h.setAttribute('aria-hidden','true'),Sn(en,'show--consent'),jn(b),b=null)},M.showSettings=function(n){q=!0,O.removeAttribute('aria-hidden'),P?m=Tn():b=Tn(),a=O,r=$,setTimeout((function(){xn(en,'show--settings')}),n>0?n:0)},M.hideSettings=function(){q=!1,Nn(),jn(u),O.setAttribute('aria-hidden','true'),Sn(en,'show--settings'),P?(jn(m),m=null,a=h,r=Z):(jn(b),b=null)},M.accept=function(n,t){var r=n||void 0,a=t||[],c=[];if(r)if('object'==typeof r&&'number'==typeof r.length)for(var u=0;u=1)for(u=0;u0)for(var r=0;r0&&dn(),o||(o=new Date),i||(i=([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(function(n){try{return(n^(window.crypto||window.msCrypto).getRandomValues(new Uint8Array(1))[0]&15>>n/4).toString(16)}catch(n){return''}}))),R={categories:n,level:n,revision:L.revision,data:A,rfc_cookie:L.use_rfc_cookie,consent_date:o.toISOString(),consent_uuid:i},(G||K.length>0)&&(F=!0,e=e?new Date:o,R.last_consent_update=e.toISOString(),p=yn(mn()),gn(L.cookie_name,JSON.stringify(R)),bn()),G&&(L.autoclear_cookies&&dn(!0),'function'==typeof s&&s(M.getUserPreferences(),R),'function'==typeof v&&v(R),G=!1,'opt-in'===L.mode)||('function'==typeof l&&K.length>0&&l(R,K),Q&&location.reload())}(c)},M.eraseCookies=function(n,t,o){var e=[],i=o?[o,'.'+o]:[L.cookie_domain,'.'+L.cookie_domain];if('object'==typeof n&&n.length>0)for(var r=0;r-1&&L.cookie_domain&&(i+=' Domain='+L.cookie_domain+';'),'https:'===location.protocol&&(i+=' Secure;'),document.cookie=i},hn=function(n,t,o){var e;if('one'===t){if((e=(e=document.cookie.match('(^|;)\\\\s*'+n+'\\\\s*=\\\\s*([^;]+)'))?o?e.pop():n:'')&&n===L.cookie_name){try{e=JSON.parse(e)}catch(n){try{e=JSON.parse(decodeURIComponent(e))}catch(n){e={}}}e=JSON.stringify(e)}}else if('all'===t){var i=document.cookie.split(/;\\s*/);e=[];for(var r=0;r{if("string"!=typeof e&&!Array.isArray(e))throw new TypeError("Expected the input to be `string | string[]`");if(o={pascalCase:!1,preserveConsecutiveUppercase:!1,...o},0===(e=Array.isArray(e)?e.map((e=>e.trim())).filter((e=>e.length)).join("-"):e.trim()).length)return"";const r=!1===o.locale?e=>e.toLowerCase():e=>e.toLocaleLowerCase(o.locale),l=!1===o.locale?e=>e.toUpperCase():e=>e.toLocaleUpperCase(o.locale);if(1===e.length)return o.pascalCase?l(e):r(e);return e!==r(e)&&(e=((e,a,o)=>{let r=!1,i=!1,c=!1;for(let s=0;s(a.lastIndex=0,e.replace(a,(e=>t(e)))))(e,r):r(e),o.pascalCase&&(e=l(e.charAt(0))+e.slice(1)),((e,t)=>(c.lastIndex=0,s.lastIndex=0,e.replace(c,((e,n)=>t(n))).replace(s,(e=>t(e)))))(e,l)};e.exports=l,e.exports.default=l},2532:function(e,t,n){"use strict";n.d(t,{G:function(){return H},L:function(){return g},M:function(){return E},P:function(){return w},S:function(){return q},_:function(){return c},a:function(){return i},b:function(){return d},c:function(){return l},g:function(){return p},h:function(){return s}});var a=n(6540),o=(n(2729),n(5556)),r=n.n(o);function i(){return i=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0||(o[n]=e[n]);return o}const s=()=>"undefined"!=typeof HTMLImageElement&&"loading"in HTMLImageElement.prototype;const l=e=>{var t;return(e=>{var t,n;return Boolean(null==e||null==(t=e.images)||null==(n=t.fallback)?void 0:n.src)})(e)?e:(e=>Boolean(null==e?void 0:e.gatsbyImageData))(e)?e.gatsbyImageData:(e=>Boolean(null==e?void 0:e.gatsbyImage))(e)?e.gatsbyImage:null==e||null==(t=e.childImageSharp)?void 0:t.gatsbyImageData};function u(e,t,n){const a={};let o="gatsby-image-wrapper";return"fixed"===n?(a.width=e,a.height=t):"constrained"===n&&(o="gatsby-image-wrapper gatsby-image-wrapper-constrained"),{className:o,"data-gatsby-image-wrapper":"",style:a}}function d(e,t,n,a,o){return void 0===o&&(o={}),i({},n,{loading:a,shouldLoad:e,"data-main-image":"",style:i({},o,{opacity:t?1:0})})}function p(e,t,n,a,o,r,c,s){const l={};r&&(l.backgroundColor=r,"fixed"===n?(l.width=a,l.height=o,l.backgroundColor=r,l.position="relative"):("constrained"===n||"fullWidth"===n)&&(l.position="absolute",l.top=0,l.left=0,l.bottom=0,l.right=0)),c&&(l.objectFit=c),s&&(l.objectPosition=s);const u=i({},e,{"aria-hidden":!0,"data-placeholder-image":"",style:i({opacity:t?0:1,transition:"opacity 500ms linear"},l)});return u}const m=["children"],f=function(e){let{layout:t,width:n,height:o}=e;return"fullWidth"===t?a.createElement("div",{"aria-hidden":!0,style:{paddingTop:o/n*100+"%"}}):"constrained"===t?a.createElement("div",{style:{maxWidth:n,display:"block"}},a.createElement("img",{alt:"",role:"presentation","aria-hidden":"true",src:`data:image/svg+xml;charset=utf-8,%3Csvg%20height='${o}'%20width='${n}'%20xmlns='http://www.w3.org/2000/svg'%20version='1.1'%3E%3C/svg%3E`,style:{maxWidth:"100%",display:"block",position:"static"}})):null},g=function(e){let{children:t}=e,n=c(e,m);return a.createElement(a.Fragment,null,a.createElement(f,i({},n)),t,null)},h=["src","srcSet","loading","alt","shouldLoad"],v=["fallback","sources","shouldLoad"],y=function(e){let{src:t,srcSet:n,loading:o,alt:r="",shouldLoad:s}=e,l=c(e,h);return a.createElement("img",i({},l,{decoding:"async",loading:o,src:s?t:void 0,"data-src":s?void 0:t,srcSet:s?n:void 0,"data-srcset":s?void 0:n,alt:r}))},b=function(e){let{fallback:t,sources:n=[],shouldLoad:o=!0}=e,r=c(e,v);const s=r.sizes||(null==t?void 0:t.sizes),l=a.createElement(y,i({},r,t,{sizes:s,shouldLoad:o}));return n.length?a.createElement("picture",null,n.map((e=>{let{media:t,srcSet:n,type:r}=e;return a.createElement("source",{key:`${t}-${r}-${n}`,type:r,media:t,srcSet:o?n:void 0,"data-srcset":o?void 0:n,sizes:s})})),l):l};var _;y.propTypes={src:o.string.isRequired,alt:o.string.isRequired,sizes:o.string,srcSet:o.string,shouldLoad:o.bool},b.displayName="Picture",b.propTypes={alt:o.string.isRequired,shouldLoad:o.bool,fallback:o.exact({src:o.string.isRequired,srcSet:o.string,sizes:o.string}),sources:o.arrayOf(o.oneOfType([o.exact({media:o.string.isRequired,type:o.string,sizes:o.string,srcSet:o.string.isRequired}),o.exact({media:o.string,type:o.string.isRequired,sizes:o.string,srcSet:o.string.isRequired})]))};const k=["fallback"],w=function(e){let{fallback:t}=e,n=c(e,k);return t?a.createElement(b,i({},n,{fallback:{src:t},"aria-hidden":!0,alt:""})):a.createElement("div",i({},n))};w.displayName="Placeholder",w.propTypes={fallback:o.string,sources:null==(_=b.propTypes)?void 0:_.sources,alt:function(e,t,n){return e[t]?new Error(`Invalid prop \`${t}\` supplied to \`${n}\`. Validation failed.`):null}};const E=function(e){return a.createElement(a.Fragment,null,a.createElement(b,i({},e)),a.createElement("noscript",null,a.createElement(b,i({},e,{shouldLoad:!0}))))};E.displayName="MainImage",E.propTypes=b.propTypes;const C=["as","className","class","style","image","loading","imgClassName","imgStyle","backgroundColor","objectFit","objectPosition"],x=["style","className"],S=e=>e.replace(/\n/g,""),A=function(e,t,n){for(var a=arguments.length,o=new Array(a>3?a-3:0),i=3;iJSON.stringify(o.images)),[o.images]);p&&(d=p);const S=function(e,t,n){let a="";return"fullWidth"===e&&(a=``),"constrained"===e&&(a=`
    `),a}(b,v,y);return(0,a.useEffect)((()=>{O||(O=n.e(108).then(n.bind(n,1108)).then((e=>{let{renderImageToString:t,swapPlaceholderImage:n}=e;return P=t,{renderImageToString:t,swapPlaceholderImage:n}})));const e=C.current.querySelector("[data-gatsby-image-ssr]");if(e&&s())return e.complete?(null==m||m({wasCached:!0}),null==f||f({wasCached:!0}),setTimeout((()=>{e.removeAttribute("data-gatsby-image-ssr")}),0)):(null==m||m({wasCached:!0}),e.addEventListener("load",(function t(){e.removeEventListener("load",t),null==f||f({wasCached:!0}),setTimeout((()=>{e.removeAttribute("data-gatsby-image-ssr")}),0)}))),void j.add(x);if(P&&j.has(x))return;let t,a;return O.then((e=>{let{renderImageToString:n,swapPlaceholderImage:c}=e;C.current&&(C.current.innerHTML=n(i({isLoading:!0,isLoaded:j.has(x),image:o},h)),j.has(x)||(t=requestAnimationFrame((()=>{C.current&&(a=c(C.current,x,j,r,m,f,g))}))))})),()=>{t&&cancelAnimationFrame(t),a&&a()}}),[o]),(0,a.useLayoutEffect)((()=>{j.has(x)&&P&&(C.current.innerHTML=P(i({isLoading:j.has(x),isLoaded:j.has(x),image:o},h)),null==m||m({wasCached:!0}),null==f||f({wasCached:!0}))}),[o]),(0,a.createElement)(t,i({},E,{style:i({},k,r,{backgroundColor:l}),className:`${w}${d?` ${d}`:""}`,ref:C,dangerouslySetInnerHTML:{__html:S},suppressHydrationWarning:!0}))},H=(0,a.memo)((function(e){return e.image?(0,a.createElement)(M,e):null}));H.propTypes=N,H.displayName="GatsbyImage";const $=["src","__imageData","__error","width","height","aspectRatio","tracedSVGOptions","placeholder","formats","quality","transformOptions","jpgOptions","pngOptions","webpOptions","avifOptions","blurredOptions","breakpoints","outputPixelDensities"];function I(e){return function(t){let{src:n,__imageData:o,__error:r}=t,s=c(t,$);return r&&console.warn(r),o?a.createElement(e,i({image:o},s)):(console.warn("Image not loaded",n),null)}}const Z=I((function(e){let{as:t="div",className:n,class:o,style:r,image:s,loading:l="lazy",imgClassName:m,imgStyle:f,backgroundColor:h,objectFit:v,objectPosition:y}=e,b=c(e,C);if(!s)return console.warn("[gatsby-plugin-image] Missing image prop"),null;o&&(n=o),f=i({objectFit:v,objectPosition:y,backgroundColor:h},f);const{width:_,height:k,layout:A,images:N,placeholder:T,backgroundColor:L}=s,j=u(_,k,A),{style:O,className:P}=j,M=c(j,x),H={fallback:void 0,sources:[]};return N.fallback&&(H.fallback=i({},N.fallback,{srcSet:N.fallback.srcSet?S(N.fallback.srcSet):void 0})),N.sources&&(H.sources=N.sources.map((e=>i({},e,{srcSet:S(e.srcSet)})))),a.createElement(t,i({},M,{style:i({},O,r,{backgroundColor:h}),className:`${P}${n?` ${n}`:""}`}),a.createElement(g,{layout:A,width:_,height:k},a.createElement(w,i({},p(T,!1,A,_,k,L,v,y))),a.createElement(E,i({"data-gatsby-image-ssr":"",className:m},b,d("eager"===l,!1,H,l,f)))))})),V=function(e,t){for(var n=arguments.length,a=new Array(n>2?n-2:0),o=2;o{if(void 0!==e.layout&&!D.has(e.layout))return new Error(`Invalid value ${e.layout}" provided for prop "layout". Defaulting to "constrained". Valid values are "fixed", "fullWidth" or "constrained".`)}};Z.displayName="StaticImage",Z.propTypes=R;const q=I(H);q.displayName="StaticImage",q.propTypes=R},2166:function(e,t,n){"use strict";n.d(t,{A:function(){return y}});var a=n(6540),o=n(4794);const r=e=>{let{siteTitle:t,menuLinks:n}=e;return a.createElement("nav",{className:"navbar navbar-expand-lg navbar-light fixed-top",style:{background:"white",marginBottom:"2.45rem",color:"black"}},a.createElement("div",{className:"container"},a.createElement(o.Link,{to:"/",className:"navbar-brand text-gray"},a.createElement("span",{className:"d-lg-none"},a.createElement("abbr",{title:t},"FISH"))," ",a.createElement("span",{className:"d-none d-lg-block"},t)),a.createElement("button",{className:"navbar-toggler",type:"button","data-bs-toggle":"collapse","data-bs-target":"#navbarSupportedContent","aria-controls":"navbarSupportedContent","aria-expanded":"false","aria-label":"Toggle navigation"},a.createElement("span",{className:"navbar-toggler-icon"})),a.createElement("div",{className:"collapse navbar-collapse",id:"navbarSupportedContent"},a.createElement("div",{className:"navbar-nav"},n.map((e=>a.createElement(o.Link,{to:e.link,key:e.id,style:{color:"black"},className:"nav-link"},e.name)))))))};r.defaultProps={siteTitle:"",menuLinks:""};var i=r,c=n(7387),s=n(2532),l=n(3048),u=n(1105),d=n(4479);let p=function(e){function t(){return e.apply(this,arguments)||this}return(0,c.A)(t,e),t.prototype.render=function(){return a.createElement(l.A,{fluid:!0,className:"bg-white my-3 py-3"},a.createElement(l.A,null,a.createElement("h3",{className:"display-5 text-center fw-bold text-success"},"Current partners")),a.createElement(u.A,{md:10,className:"mx-auto pt-2 my-4"},a.createElement(d.A,{className:"justify-content-center mb-2"},this.props.logos.nodes.map(((e,t)=>a.createElement(u.A,{md:2,sm:2,className:"col-md-2 text-center mx-2 my-2",key:t},a.createElement("a",{href:e.url},a.createElement(s.G,{image:(0,s.c)(e.logo),alt:e.name,className:"img-fluid rounded-start rounded-end"}))))))))},t}(a.Component);var m=()=>a.createElement(o.StaticQuery,{query:"3133867949",render:e=>a.createElement(p,{logos:e.allPartnersJson})});const f=e=>{let{siteTitle:t,footerLinks:n}=e;return a.createElement(a.Fragment,null,a.createElement(l.A,{fluid:!0,style:{backgroundColor:"var(--color-footer-bg)"}},a.createElement(l.A,null,a.createElement("footer",{className:"text-center text-lg-start text-black"},a.createElement("section",{className:"pt-4"},a.createElement(l.A,{className:"text-center text-md-start mt-5"},a.createElement(d.A,{className:"mt-3"},a.createElement(u.A,{md:3,lg:4,xl:3,className:"cmx-auto mb-4"},a.createElement("h3",{className:"text-uppercase fw-bold"},t),a.createElement("hr",{className:"mb-4 mt-0 d-inline-block mx-auto"})),a.createElement(u.A,{md:2,lg:2,xl:2,className:"mx-auto mb-4"},a.createElement("h3",{className:"text-uppercase fw-bold"},"Further information"),a.createElement("hr",{className:"mb-4 mt-0 d-inline-block mx-auto"}),a.createElement("ul",{className:"list-unstyled",style:{marginLeft:0}},n.map((e=>a.createElement("li",null,a.createElement(o.Link,{key:e.id,to:e.link,className:"text-black"},e.name)))))),a.createElement(u.A,{md:4,lg:3,xl:3,className:"mx-auto mb-md-0 mb-4"},a.createElement("h3",{className:"text-uppercase fw-bold"},"Contact"),a.createElement("hr",{className:"mb-4 mt-0 d-inline-block mx-auto"}),a.createElement("p",null,"c/o Historic England",a.createElement("br",null),"4th Floor",a.createElement("br",null),"Cannon Bridge House",a.createElement("br",null),"25 Dowgate Hill",a.createElement("br",null),"London",a.createElement("br",null),"EC4R 2YA")))))))))};f.defaultProps={siteTitle:"",footerLinks:""};var g=f,h=n(4968);n(5846);function v(){return(0,a.useEffect)((()=>{document.getElementById("cc--main")||(window.CookieConsentApi=window.initCookieConsent(),window.CookieConsentApi.run({current_lang:"en",autoclear_cookies:!0,cookie_name:"dejp3-cookies",cookie_expiration:365,page_scripts:!0,force_consent:!0,hide_from_bots:!0,gui_options:{consent_modal:{layout:"box",position:"bottom left",transition:"slide"},settings_modal:{layout:"box",position:"left",transition:"slide"}},onFirstAction:function(){console.log("onFirstAction fired")},onAccept:function(e){console.log("onAccept fired ...")},onChange:function(e,t){console.log("onChange fired ...")},languages:{en:{consent_modal:{title:"🍪 We use cookies! ",description:'Hi, this website uses essential cookies to ensure its proper operation and tracking cookies to understand how you interact with it. The latter will be set only after consent. ',primary_btn:{text:"Accept all",role:"accept_all"},secondary_btn:{text:"Reject all",role:"accept_necessary"}},settings_modal:{title:'',save_settings_btn:"Save my choices",accept_all_btn:"Accept all",reject_all_btn:"Reject all",close_btn_label:"Close",cookie_table_headers:[{col1:"Name"},{col2:"Domain"},{col3:"Expiration"},{col4:"Description"}],blocks:[{title:"Cookie usage and the Fitzwilliam website",description:"I use cookies to ensure the basic functionalities of the website and to enhance your online experience. You can choose for each category to opt-in/out whenever you want."},{title:"Strictly necessary cookies",description:"These cookies are essential for the proper functioning of my website. Without these cookies, the website would not work properly",toggle:{value:"necessary",enabled:!0,readonly:!0}},{title:"Performance and Analytics cookies",description:"These cookies allow the website to remember the choices you have made in the past",toggle:{value:"analytics",enabled:!0,readonly:!1},cookie_table:[{col1:"^_ga",col2:"google.com",col3:"2 years",col4:"Google Analytics identifies unique users across GA sessions through client ID. The client ID is stored in the Google Analytics cookie. The GA cookie is set when a person visits your website for the first time. Google Analytics sends the client ID with each hit to associate hits with a user.",is_regex:!0},{col1:"_gid",col2:"google.com",col3:"1 day",col4:"This cookie is installed by Google Analytics. The cookie is used to store information of how visitors use a website and helps in creating an analytics report of how the website is doing."}]},{title:"Advertisement and Targeting cookies",description:"These cookies collect information about how you use the website, which pages you visited and which links you clicked on. All of the data is anonymized and cannot be used to identify you",toggle:{value:"targeting",enabled:!1,readonly:!1}},{title:"More information",description:'For any queries in relation to our policy on cookies and your choices, please review the University of Cambridge policy.'}]}}}}))}),[]),null}var y=e=>{let{children:t}=e;const n=(0,o.useStaticQuery)("2494122958");return a.createElement(a.Fragment,null,a.createElement(i,{menuLinks:n.site.siteMetadata.menuLinks,siteTitle:n.site.siteMetadata.title}),a.createElement("div",{style:{margin:"0 auto"}},a.createElement("main",null,t)),a.createElement(m,{style:{margin:"0 auto",width:"100%"}}),a.createElement(g,{siteTitle:n.site.siteMetadata.title,footerLinks:n.site.siteMetadata.footerLinks,style:{margin:"0 auto",width:"100%"}}),a.createElement(h.default,{mainStyle:{width:"100%",height:"100%",backgroundColor:"#2f0520",color:"white"},percentStyle:{width:"100%",height:"100%",display:"none"},animate:"rotate",offsetTop:20,step:50,percent:!1,visiblePercent:50}),a.createElement(v,null))}},3430:function(e,t,n){"use strict";n.d(t,{A:function(){return r}});var a=n(6540),o=n(4794);var r=e=>{let{title:t,description:n,pathname:r,children:i}=e;const{title:c,description:s,image:l,siteUrl:u,twitterHandle:d}=(0,o.useStaticQuery)("4037206124").site.siteMetadata,p={title:t||c,description:n||s,image:`${u}${l}`,url:`${u}${r||""}`,twitterHandle:d};return a.createElement(a.Fragment,null,a.createElement("title",null,p.title),a.createElement("meta",{name:"description",content:p.description}),a.createElement("meta",{name:"image",content:p.image}),a.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),a.createElement("meta",{name:"twitter:title",content:p.title}),a.createElement("meta",{name:"twitter:url",content:p.url.toString()}),a.createElement("meta",{name:"twitter:description",content:p.description}),a.createElement("meta",{name:"twitter:image",content:p.image.toString()}),a.createElement("meta",{name:"twitter:creator",content:p.twitterHandle}),a.createElement("meta",{property:"og:url",content:p.url.toString()}),a.createElement("meta",{property:"og:title",content:p.title}),a.createElement("meta",{property:"og:type",content:"website"}),a.createElement("meta",{property:"og:site_name",content:"Forum on Information Standards in Heritage"}),a.createElement("meta",{property:"og:description",content:p.description}),a.createElement("meta",{property:"og:locale",content:"en-gb"}),a.createElement("meta",{property:"og:image",content:p.image.toString()}),a.createElement("meta",{property:"og:image:alt",content:"An image representing this post"}),a.createElement("meta",{property:"og:image:width",content:"600"}),a.createElement("meta",{property:"og:image:width",content:"600"}),a.createElement("meta",{property:"og:image:type",content:"image/jpeg"}),i)}},7625:function(e,t,n){"use strict";n.r(t)},256:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var a=function(e){if(e&&e.__esModule)return e;if(null===e||"object"!==i(e)&&"function"!=typeof e)return{default:e};var t=r();if(t&&t.has(e))return t.get(e);var n={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if(Object.prototype.hasOwnProperty.call(e,o)){var c=a?Object.getOwnPropertyDescriptor(e,o):null;c&&(c.get||c.set)?Object.defineProperty(n,o,c):n[o]=e[o]}n.default=e,t&&t.set(e,n);return n}(n(6540)),o=n(6180);function r(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return r=function(){return e},e}function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}function c(e,t){for(var n=0;n0?n.props.visiblePercent:1,n.isPercent=void 0===n.props.isPercent||n.props.isPercent,n}var n,r,i;return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&u(e,t)}(t,e),n=t,(r=[{key:"scrollToTop",value:function(){(0,o.ScrollToAnimate)(this.props.offsetTop,this.props.step,this.state.current)}},{key:"componentDidMount",value:function(){var e=this;window&&(window.onscroll=function(){e.setState({percent:(0,o.getScrollPercent)(e.props.offsetTop),current:(0,o.getScrollTop)()})})}},{key:"render",value:function(){var e=this,t=this.props,n=t.animate,o=t.children,r=this.state.percent>=this.visiblePercent,i="c-animate-hide",c="c-animate-show";return"fade"!==n&&"rotate"!==n?"none"!==n&&(i="fade-hide",c="fade-show"):(i=n+"-hide",c=n+"-show"),a.default.createElement("div",{onClick:function(){return e.scrollToTop()},className:"base-back-to-up "+(r?c:i)},a.default.createElement("div",{className:"back-to-up-default",style:this.mainStyle},o?Array.isArray(o)?o.map(child,(function(e){return a.default.createElement("div",{key:e},child)})):o&&a.default.createElement("div",null,o):a.default.createElement("div",{className:"back-to-up-default-text"},a.default.createElement("span",null,"UP")),a.default.createElement("div",{className:"to-up-percent"+(this.isPercent?"":" percent-hide"),style:this.percentStyle},this.state.percent+"%")))}}])&&c(n.prototype,r),i&&c(n,i),t}(a.Component);t.default=d},6180:function(e,t){"use strict";function n(){var e=0;return document.documentElement&&document.documentElement.scrollTop?e=document.documentElement.scrollTop:document.body&&(e=document.body.scrollTop),e}Object.defineProperty(t,"__esModule",{value:!0}),t.getScrollTop=n,t.ScrollToAnimate=function(e,t,n){var a=0,o=setInterval((function(){n-a>=e?n-(a+=t)>=e?window.scrollTo(0,n-a):window.scrollTo(0,e):clearInterval(o)}),0)},t.getScrollPercent=function(e){var t=0;e100?100:t}},4968:function(e,t,n){e.exports=n(256),t.default=n(256)},1105:function(e,t,n){"use strict";var a=n(6942),o=n.n(a),r=n(6540),i=n(6519),c=n(4848);const s=r.forwardRef(((e,t)=>{const[{className:n,...a},{as:r="div",bsPrefix:s,spans:l}]=function({as:e,bsPrefix:t,className:n,...a}){t=(0,i.oU)(t,"col");const r=(0,i.gy)(),c=(0,i.Jm)(),s=[],l=[];return r.forEach((e=>{const n=a[e];let o,r,i;delete a[e],"object"==typeof n&&null!=n?({span:o,offset:r,order:i}=n):o=n;const u=e!==c?`-${e}`:"";o&&s.push(!0===o?`${t}${u}`:`${t}${u}-${o}`),null!=i&&l.push(`order${u}-${i}`),null!=r&&l.push(`offset${u}-${r}`)})),[{...a,className:o()(n,...s,...l)},{as:e,bsPrefix:t,spans:s}]}(e);return(0,c.jsx)(r,{...a,ref:t,className:o()(n,!l.length&&s)})}));s.displayName="Col",t.A=s},3048:function(e,t,n){"use strict";var a=n(6942),o=n.n(a),r=n(6540),i=n(6519),c=n(4848);const s=r.forwardRef((({bsPrefix:e,fluid:t=!1,as:n="div",className:a,...r},s)=>{const l=(0,i.oU)(e,"container"),u="string"==typeof t?`-${t}`:"-fluid";return(0,c.jsx)(n,{ref:s,...r,className:o()(a,t?`${l}${u}`:l)})}));s.displayName="Container",t.A=s},4479:function(e,t,n){"use strict";var a=n(6942),o=n.n(a),r=n(6540),i=n(6519),c=n(4848);const s=r.forwardRef((({bsPrefix:e,className:t,as:n="div",...a},r)=>{const s=(0,i.oU)(e,"row"),l=(0,i.gy)(),u=(0,i.Jm)(),d=`${s}-cols`,p=[];return l.forEach((e=>{const t=a[e];let n;delete a[e],null!=t&&"object"==typeof t?({cols:n}=t):n=t;const o=e!==u?`-${e}`:"";null!=n&&p.push(`${d}${o}-${n}`)})),(0,c.jsx)(n,{ref:r,...a,className:o()(t,s,...p)})}));s.displayName="Row",t.A=s},6519:function(e,t,n){"use strict";n.d(t,{Jm:function(){return u},gy:function(){return l},oU:function(){return s}});var a=n(6540);n(4848);const o=["xxl","xl","lg","md","sm","xs"],r=a.createContext({prefixes:{},breakpoints:o,minBreakpoint:"xs"}),{Consumer:i,Provider:c}=r;function s(e,t){const{prefixes:n}=(0,a.useContext)(r);return e||n[t]||t}function l(){const{breakpoints:e}=(0,a.useContext)(r);return e}function u(){const{minBreakpoint:e}=(0,a.useContext)(r);return e}},5846:function(){!function(){"use strict";var e="initCookieConsent";"undefined"!=typeof window&&"function"!=typeof window[e]&&(window[e]=function(e){var t,n,a,o,r,i,c,s,l,u,d,p,m,f,g,h,v,y,b,_,k,w,E,C,x,S,A,N,T,L,j,O,P,M,H,$={mode:"opt-in",current_lang:"en",auto_language:null,autorun:!0,page_scripts:!0,hide_from_bots:!0,cookie_name:"cc_cookie",cookie_expiration:182,cookie_domain:location.hostname,cookie_path:"/",cookie_same_site:"Lax",use_rfc_cookie:!1,autoclear_cookies:!0,revision:0,script_selector:"data-cookiecategory"},I={},Z={},V=null,D=!0,R=!1,q=!1,F=!1,U=!1,z=!0,J=[],W=!1,G=[],B=[],Q=[],Y=!1,K=[],X=[],ee=[],te=[],ne=[],ae=document.documentElement,oe=function(e){"number"==typeof(t=e).cookie_expiration&&($.cookie_expiration=t.cookie_expiration),"number"==typeof t.cookie_necessary_only_expiration&&($.cookie_necessary_only_expiration=t.cookie_necessary_only_expiration),"boolean"==typeof t.autorun&&($.autorun=t.autorun),"string"==typeof t.cookie_domain&&($.cookie_domain=t.cookie_domain),"string"==typeof t.cookie_same_site&&($.cookie_same_site=t.cookie_same_site),"string"==typeof t.cookie_path&&($.cookie_path=t.cookie_path),"string"==typeof t.cookie_name&&($.cookie_name=t.cookie_name),"function"==typeof t.onAccept&&(d=t.onAccept),"function"==typeof t.onFirstAction&&(m=t.onFirstAction),"function"==typeof t.onChange&&(p=t.onChange),"opt-out"===t.mode&&($.mode="opt-out"),"number"==typeof t.revision&&(t.revision>-1&&($.revision=t.revision),U=!0),"boolean"==typeof t.autoclear_cookies&&($.autoclear_cookies=t.autoclear_cookies),!0===t.use_rfc_cookie&&($.use_rfc_cookie=!0),"boolean"==typeof t.hide_from_bots&&($.hide_from_bots=t.hide_from_bots),$.hide_from_bots&&(Y=navigator&&(navigator.userAgent&&/bot|crawl|spider|slurp|teoma/i.test(navigator.userAgent)||navigator.webdriver)),$.page_scripts=!0===t.page_scripts,"browser"===t.auto_language||!0===t.auto_language?$.auto_language="browser":"document"===t.auto_language&&($.auto_language="document"),$.auto_language,$.current_lang=pe(t.languages,t.current_lang)},re=function(e){for(var t="accept-",n=c("c-settings"),a=c(t+"all"),o=c(t+"necessary"),r=c(t+"custom"),i=0;i0?t.hasOwnProperty($.current_lang)?$.current_lang:ke(t)[0]:void 0},ce=function(e){if(!0===t.force_consent&&we(ae,"force--consent"),!b){b=de("div");var n=de("div"),a=de("div");b.id="cm",n.id="c-inr-i",a.id="cm-ov",b.tabIndex=-1,b.setAttribute("role","dialog"),b.setAttribute("aria-modal","true"),b.setAttribute("aria-hidden","false"),b.setAttribute("aria-labelledby","c-ttl"),b.setAttribute("aria-describedby","c-txt"),y.appendChild(b),y.appendChild(a),b.style.visibility=a.style.visibility="hidden",a.style.opacity=0}var o=t.languages[e].consent_modal.title;o&&(_||((_=de("h2")).id="c-ttl",n.appendChild(_)),_.innerHTML=o);var r=t.languages[e].consent_modal.description;U&&(r=z?r.replace("{{revision_message}}",""):r.replace("{{revision_message}}",t.languages[e].consent_modal.revision_message||"")),k||((k=de("div")).id="c-txt",n.appendChild(k)),k.innerHTML=r;var i,c=t.languages[e].consent_modal.primary_btn,s=t.languages[e].consent_modal.secondary_btn;c&&(w||((w=de("button")).id="c-p-bn",w.className="c-bn",w.appendChild(xe(1)),"accept_all"===c.role&&(i="all"),_e(w,"click",(function(){I.hide(),I.accept(i)}))),w.firstElementChild.innerHTML=t.languages[e].consent_modal.primary_btn.text),s&&(E||((E=de("button")).id="c-s-bn",E.className="c-bn c_link",E.appendChild(xe(1)),"accept_necessary"===s.role?_e(E,"click",(function(){I.hide(),I.accept([])})):_e(E,"click",(function(){I.showSettings(0)}))),E.firstElementChild.innerHTML=t.languages[e].consent_modal.secondary_btn.text);var l=t.gui_options;x||((x=de("div")).id="c-inr",x.appendChild(n)),C||((C=de("div")).id="c-bns",l&&l.consent_modal&&!0===l.consent_modal.swap_buttons?(s&&C.appendChild(E),c&&C.appendChild(w),C.className="swap"):(c&&C.appendChild(w),s&&C.appendChild(E)),(c||s)&&x.appendChild(C),b.appendChild(x)),R=!0,re(x)},se=function(e){if(S)(j=de("div")).id="s-bl";else{(S=de("div")).tabIndex=-1;var n=de("div"),a=de("div"),o=de("div");A=de("div"),N=de("h2");var r=de("div");(T=de("button")).appendChild(xe(2));var i=de("div");L=de("div");var c=de("div"),s=!1;_e(S,"mouseup",(function(e){!F||s||A.contains(e.target)||I.hideSettings()})),_e(S,"mousedown",(function(e){F&&(s=A.contains(e.target))})),S.id="s-cnt",n.id="c-vln",o.id="c-s-in",a.id="cs",N.id="s-ttl",A.id="s-inr",r.id="s-hdr",L.id="s-bl",T.id="s-c-bn",c.id="cs-ov",i.id="s-c-bnc",T.className="c-bn",S.setAttribute("role","dialog"),S.setAttribute("aria-modal","true"),S.setAttribute("aria-hidden","true"),S.setAttribute("aria-labelledby","s-ttl"),S.style.visibility=c.style.visibility="hidden",c.style.opacity=0,i.appendChild(T),_e(document,"keydown",(function(e){27===e.keyCode&&F&&I.hideSettings()}),!0),_e(T,"click",(function(){I.hideSettings()}))}var d=t.languages[e].settings_modal;T.setAttribute("aria-label",d.close_btn_label||"Close"),u=d.blocks,l=d.cookie_table_headers;var p=d.cookie_table_caption,m=u.length;N.innerHTML=d.title;for(var f=0;f-1?(q.checked=!0,!j&&ee.push(!0)):!j&&ee.push(!1),!j&&te.push(G),v.readonly&&(q.disabled=!0,we(U,"c-ro"),!j&&ne.push(G)),we(E,"b-acc"),we(x,"b-bn"),we(w,"b-ex"),E.id=$,E.setAttribute("aria-hidden","true"),R.appendChild(q),R.appendChild(U),R.appendChild(z),x.appendChild(R),k&&function(e,t,n){_e(V,"click",(function(){Ce(t,"act")?(Ee(t,"act"),n.setAttribute("aria-expanded","false"),e.setAttribute("aria-hidden","true")):(we(t,"act"),n.setAttribute("aria-expanded","true"),e.setAttribute("aria-hidden","false"))}),!1)}(E,w,V)}else if(g){var B=de("div");B.className="b-tl",B.setAttribute("role","heading"),B.setAttribute("aria-level","3"),B.insertAdjacentHTML("beforeend",g),x.appendChild(B)}if(g&&w.appendChild(x),h&&E.appendChild(C),!_&&void 0!==b){for(var Y=document.createDocumentFragment(),K=0;K-1;if(!ee[++n]&&c.hasOwnProperty("cookie_table")&&(e||s)){var d=c.cookie_table,p=ke(l[0])[0],m=d.length;"on_disable"===c.toggle.reload&&s&&(W=!0);for(var f=0;f-1&&v.push(a[E])}v.length>0&&(be(v,k,g),"on_clear"===c.toggle.reload&&(W=!0))}}}}},ue=function(e,t){return e.indexOf(t)},de=function(e){var t=document.createElement(e);return"button"===e&&t.setAttribute("type",e),t},pe=function(e,t){return"browser"===$.auto_language?ie(me(),e):"document"===$.auto_language?ie(document.documentElement.lang,e):"string"==typeof t?$.current_lang=ie(t,e):($.current_lang,$.current_lang)},me=function(){var e=navigator.language||navigator.browserLanguage;return e.length>2&&(e=e[0]+e[1]),e.toLowerCase()};I.allowedCategory=function(e){if(D&&"opt-in"!==$.mode)t=Q;else var t=JSON.parse(ye($.cookie_name,"one",!0)||"{}").categories||[];return ue(t,e)>-1},I.run=function(t){if(!document.getElementById("cc_div")){if(oe(t),Y)return;Z=JSON.parse(ye($.cookie_name,"one",!0)||"{}");var c=void 0!==(o=Z.consent_uuid);if((n=Z.consent_date)&&(n=new Date(n)),(a=Z.last_consent_update)&&(a=new Date(a)),V=void 0!==Z.data?Z.data:null,U&&Z.revision!==$.revision&&(z=!1),R=D=!(c&&z&&n&&a&&o),function(){(v=de("div")).id="cc--main",v.style.position="fixed",v.innerHTML='
    ',y=v.children[0];var t=$.current_lang;R&&ce(t),se(t),(e||document.body).appendChild(v)}(),function(){var e=["[href]","button","input","details",'[tabindex="0"]'];function t(t,n){try{var a=t.querySelectorAll(e.join(':not([tabindex="-1"]), '))}catch(n){return t.querySelectorAll(e.join(", "))}n[0]=a[0],n[1]=a[a.length-1]}t(A,X),R&&t(b,K)}(),function(e,t){if("object"==typeof e){var n=e.consent_modal,a=e.settings_modal;R&&n&&o(b,["box","bar","cloud"],["top","middle","bottom"],["zoom","slide"],n.layout,n.position,n.transition),a&&o(S,["bar"],["left","right"],["zoom","slide"],a.layout,a.position,a.transition)}function o(e,t,n,a,o,r,i){if(r=r&&r.split(" ")||[],ue(t,o)>-1&&(we(e,o),("bar"!==o||"middle"!==r[0])&&ue(n,r[0])>-1))for(var c=0;c-1&&we(e,i)}}(t.gui_options),re(),$.autorun&&R&&I.show(t.delay||0),setTimeout((function(){we(v,"c--anim")}),30),setTimeout((function(){_e(document,"keydown",(function(e){if("Tab"===e.key&&(q||F)&&r){var t=Ne();e.shiftKey?t!==r[0]&&i.contains(t)||(e.preventDefault(),Se(r[1])):t!==r[1]&&i.contains(t)||(e.preventDefault(),Se(r[0]))}}))}),100),D)"opt-out"===$.mode&&($.mode,fe());else{var s="boolean"==typeof Z.rfc_cookie;(!s||s&&Z.rfc_cookie!==$.use_rfc_cookie)&&(Z.rfc_cookie=$.use_rfc_cookie,ve($.cookie_name,JSON.stringify(Z))),f=he(ge()),fe(),"function"==typeof d&&d(Z)}}};var fe=function(){if($.page_scripts){var e=Z.categories||[];D&&"opt-out"===$.mode&&(e=Q);var t=document.querySelectorAll("script["+$.script_selector+"]"),n=function(t,a){if(a-1){o.type=o.getAttribute("data-type")||"text/javascript",o.removeAttribute($.script_selector);var i=o.getAttribute("data-src");i&&o.removeAttribute("data-src");var c=de("script");if(c.textContent=o.innerHTML,function(e,t){for(var n=t.attributes,a=n.length,o=0;o0)for(var r=0;r0?e:t?30:0))},I.hide=function(){R&&(q=!1,Se(c),b.setAttribute("aria-hidden","true"),Ee(ae,"show--consent"),Se(g),g=null)},I.showSettings=function(e){F=!0,S.removeAttribute("aria-hidden"),q?h=Ne():g=Ne(),i=S,r=X,setTimeout((function(){we(ae,"show--settings")}),e>0?e:0)},I.hideSettings=function(){F=!1,Ae(),Se(s),S.setAttribute("aria-hidden","true"),Ee(ae,"show--settings"),q?(Se(h),h=null,i=b,r=K):(Se(g),g=null)},I.accept=function(e,t){var r=e||void 0,i=t||[],c=[];if(r)if("object"==typeof r&&"number"==typeof r.length)for(var s=0;s=1)for(s=0;s0)for(var r=0;r0&&le(),n||(n=new Date),o||(o=([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(function(e){try{return(e^(window.crypto||window.msCrypto).getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)}catch(e){return""}}))),Z={categories:e,level:e,revision:$.revision,data:V,rfc_cookie:$.use_rfc_cookie,consent_date:n.toISOString(),consent_uuid:o},(D||J.length>0)&&(z=!0,a=a?new Date:n,Z.last_consent_update=a.toISOString(),f=he(ge()),ve($.cookie_name,JSON.stringify(Z)),fe()),D&&($.autoclear_cookies&&le(!0),"function"==typeof m&&m(I.getUserPreferences(),Z),"function"==typeof d&&d(Z),D=!1,"opt-in"===$.mode)||("function"==typeof p&&J.length>0&&p(Z,J),W&&location.reload())}(c)},I.eraseCookies=function(e,t,n){var a=[],o=n?[n,"."+n]:[$.cookie_domain,"."+$.cookie_domain];if("object"==typeof e&&e.length>0)for(var r=0;r-1&&$.cookie_domain&&(o+=" Domain="+$.cookie_domain+";"),"https:"===location.protocol&&(o+=" Secure;"),document.cookie=o},ye=function(e,t,n){var a;if("one"===t){if((a=(a=document.cookie.match("(^|;)\\s*"+e+"\\s*=\\s*([^;]+)"))?n?a.pop():e:"")&&e===$.cookie_name){try{a=JSON.parse(a)}catch(e){try{a=JSON.parse(decodeURIComponent(a))}catch(e){a={}}}a=JSON.stringify(a)}}else if("all"===t){var o=document.cookie.split(/;\s*/);a=[];for(var r=0;r {\n\tlet isLastCharLower = false;\n\tlet isLastCharUpper = false;\n\tlet isLastLastCharUpper = false;\n\n\tfor (let i = 0; i < string.length; i++) {\n\t\tconst character = string[i];\n\n\t\tif (isLastCharLower && UPPERCASE.test(character)) {\n\t\t\tstring = string.slice(0, i) + '-' + string.slice(i);\n\t\t\tisLastCharLower = false;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = true;\n\t\t\ti++;\n\t\t} else if (isLastCharUpper && isLastLastCharUpper && LOWERCASE.test(character)) {\n\t\t\tstring = string.slice(0, i - 1) + '-' + string.slice(i - 1);\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = false;\n\t\t\tisLastCharLower = true;\n\t\t} else {\n\t\t\tisLastCharLower = toLowerCase(character) === character && toUpperCase(character) !== character;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = toUpperCase(character) === character && toLowerCase(character) !== character;\n\t\t}\n\t}\n\n\treturn string;\n};\n\nconst preserveConsecutiveUppercase = (input, toLowerCase) => {\n\tLEADING_CAPITAL.lastIndex = 0;\n\n\treturn input.replace(LEADING_CAPITAL, m1 => toLowerCase(m1));\n};\n\nconst postProcess = (input, toUpperCase) => {\n\tSEPARATORS_AND_IDENTIFIER.lastIndex = 0;\n\tNUMBERS_AND_IDENTIFIER.lastIndex = 0;\n\n\treturn input.replace(SEPARATORS_AND_IDENTIFIER, (_, identifier) => toUpperCase(identifier))\n\t\t.replace(NUMBERS_AND_IDENTIFIER, m => toUpperCase(m));\n};\n\nconst camelCase = (input, options) => {\n\tif (!(typeof input === 'string' || Array.isArray(input))) {\n\t\tthrow new TypeError('Expected the input to be `string | string[]`');\n\t}\n\n\toptions = {\n\t\tpascalCase: false,\n\t\tpreserveConsecutiveUppercase: false,\n\t\t...options\n\t};\n\n\tif (Array.isArray(input)) {\n\t\tinput = input.map(x => x.trim())\n\t\t\t.filter(x => x.length)\n\t\t\t.join('-');\n\t} else {\n\t\tinput = input.trim();\n\t}\n\n\tif (input.length === 0) {\n\t\treturn '';\n\t}\n\n\tconst toLowerCase = options.locale === false ?\n\t\tstring => string.toLowerCase() :\n\t\tstring => string.toLocaleLowerCase(options.locale);\n\tconst toUpperCase = options.locale === false ?\n\t\tstring => string.toUpperCase() :\n\t\tstring => string.toLocaleUpperCase(options.locale);\n\n\tif (input.length === 1) {\n\t\treturn options.pascalCase ? toUpperCase(input) : toLowerCase(input);\n\t}\n\n\tconst hasUpperCase = input !== toLowerCase(input);\n\n\tif (hasUpperCase) {\n\t\tinput = preserveCamelCase(input, toLowerCase, toUpperCase);\n\t}\n\n\tinput = input.replace(LEADING_SEPARATORS, '');\n\n\tif (options.preserveConsecutiveUppercase) {\n\t\tinput = preserveConsecutiveUppercase(input, toLowerCase);\n\t} else {\n\t\tinput = toLowerCase(input);\n\t}\n\n\tif (options.pascalCase) {\n\t\tinput = toUpperCase(input.charAt(0)) + input.slice(1);\n\t}\n\n\treturn postProcess(input, toUpperCase);\n};\n\nmodule.exports = camelCase;\n// TODO: Remove this for the next major release\nmodule.exports.default = camelCase;\n","import camelCase from \"camelcase\"\nimport type { IGatsbyImageData } from \"./index\"\n\nconst DEFAULT_PIXEL_DENSITIES = [0.25, 0.5, 1, 2]\nexport const DEFAULT_BREAKPOINTS = [750, 1080, 1366, 1920]\nexport const EVERY_BREAKPOINT = [\n 320, 654, 768, 1024, 1366, 1600, 1920, 2048, 2560, 3440, 3840, 4096,\n]\nconst DEFAULT_FLUID_WIDTH = 800\nconst DEFAULT_FIXED_WIDTH = 800\nconst DEFAULT_ASPECT_RATIO = 4 / 3\n\nexport type Fit = \"cover\" | \"fill\" | \"inside\" | \"outside\" | \"contain\"\n\nexport type Layout = \"fixed\" | \"fullWidth\" | \"constrained\"\nexport type ImageFormat = \"jpg\" | \"png\" | \"webp\" | \"avif\" | \"auto\" | \"\"\n\n/**\n * The minimal required reporter, as we don't want to import it from gatsby-cli\n */\nexport interface IReporter {\n warn(message: string): void\n}\n\nexport interface ISharpGatsbyImageArgs {\n layout?: Layout\n formats?: Array\n placeholder?: \"tracedSVG\" | \"dominantColor\" | \"blurred\" | \"none\"\n tracedSVGOptions?: Record\n width?: number\n height?: number\n aspectRatio?: number\n sizes?: string\n quality?: number\n transformOptions?: {\n fit?: Fit\n cropFocus?: number | string\n duotone?: {\n highlight: string\n shadow: string\n opacity?: number\n }\n grayscale?: boolean\n rotate?: number\n trim?: number\n }\n jpgOptions?: Record\n pngOptions?: Record\n webpOptions?: Record\n avifOptions?: Record\n blurredOptions?: { width?: number; toFormat?: ImageFormat }\n breakpoints?: Array\n outputPixelDensities?: Array\n backgroundColor?: string\n}\n\nexport interface IImageSizeArgs {\n width?: number\n height?: number\n layout?: Layout\n filename: string\n outputPixelDensities?: Array\n breakpoints?: Array\n fit?: Fit\n reporter?: IReporter\n sourceMetadata: { width: number; height: number }\n}\n\nexport interface IImageSizes {\n sizes: Array\n presentationWidth: number\n presentationHeight: number\n aspectRatio: number\n unscaledWidth: number\n}\n\nexport interface IImage {\n src: string\n width: number\n height: number\n format: ImageFormat\n}\n\nexport interface IGatsbyImageHelperArgs {\n pluginName: string\n generateImageSource: (\n filename: string,\n width: number,\n height: number,\n format: ImageFormat,\n fit?: Fit,\n options?: Record\n ) => IImage\n layout?: Layout\n formats?: Array\n filename: string\n placeholderURL?: string\n width?: number\n height?: number\n sizes?: string\n reporter?: IReporter\n sourceMetadata?: { width: number; height: number; format: ImageFormat }\n fit?: Fit\n options?: Record\n breakpoints?: Array\n backgroundColor?: string\n aspectRatio?: number\n}\n\nconst warn = (message: string): void => console.warn(message)\n\nconst sortNumeric = (a: number, b: number): number => a - b\n\nexport const getSizes = (width: number, layout: Layout): string | undefined => {\n switch (layout) {\n // If screen is wider than the max size, image width is the max size,\n // otherwise it's the width of the screen\n case `constrained`:\n return `(min-width: ${width}px) ${width}px, 100vw`\n\n // Image is always the same width, whatever the size of the screen\n case `fixed`:\n return `${width}px`\n\n // Image is always the width of the screen\n case `fullWidth`:\n return `100vw`\n\n default:\n return undefined\n }\n}\n\nexport const getSrcSet = (images: Array): string =>\n images.map(image => `${image.src} ${image.width}w`).join(`,\\n`)\n\nexport function formatFromFilename(filename: string): ImageFormat | undefined {\n const dot = filename.lastIndexOf(`.`)\n if (dot !== -1) {\n const ext = filename.slice(dot + 1)\n if (ext === `jpeg`) {\n return `jpg`\n }\n if (ext.length === 3 || ext.length === 4) {\n return ext as ImageFormat\n }\n }\n return undefined\n}\n\nexport function setDefaultDimensions(\n args: IGatsbyImageHelperArgs\n): IGatsbyImageHelperArgs {\n let {\n layout = `constrained`,\n width,\n height,\n sourceMetadata,\n breakpoints,\n aspectRatio,\n formats = [`auto`, `webp`],\n } = args\n formats = formats.map(format => format.toLowerCase() as ImageFormat)\n layout = camelCase(layout) as Layout\n\n if (width && height) {\n return { ...args, formats, layout, aspectRatio: width / height }\n }\n if (sourceMetadata.width && sourceMetadata.height && !aspectRatio) {\n aspectRatio = sourceMetadata.width / sourceMetadata.height\n }\n\n if (layout === `fullWidth`) {\n width = width || sourceMetadata.width || breakpoints[breakpoints.length - 1]\n height = height || Math.round(width / (aspectRatio || DEFAULT_ASPECT_RATIO))\n } else {\n if (!width) {\n if (height && aspectRatio) {\n width = height * aspectRatio\n } else if (sourceMetadata.width) {\n width = sourceMetadata.width\n } else if (height) {\n width = Math.round(height / DEFAULT_ASPECT_RATIO)\n } else {\n width = DEFAULT_FIXED_WIDTH\n }\n }\n\n if (aspectRatio && !height) {\n height = Math.round(width / aspectRatio)\n } else if (!aspectRatio) {\n aspectRatio = width / height\n }\n }\n return { ...args, width, height, aspectRatio, layout, formats }\n}\n\n/**\n * Use this for getting an image for the blurred placeholder. This ensures the\n * aspect ratio and crop match the main image\n */\nexport function getLowResolutionImageURL(\n args: IGatsbyImageHelperArgs,\n width = 20\n): string {\n args = setDefaultDimensions(args)\n const { generateImageSource, filename, aspectRatio } = args\n return generateImageSource(\n filename,\n width,\n Math.round(width / aspectRatio),\n args.sourceMetadata.format || `jpg`,\n args.fit,\n args.options\n )?.src\n}\n\nexport function generateImageData(\n args: IGatsbyImageHelperArgs\n): IGatsbyImageData {\n args = setDefaultDimensions(args)\n\n let {\n pluginName,\n sourceMetadata,\n generateImageSource,\n layout,\n fit,\n options,\n width,\n height,\n filename,\n reporter = { warn },\n backgroundColor,\n placeholderURL,\n } = args\n\n if (!pluginName) {\n reporter.warn(\n `[gatsby-plugin-image] \"generateImageData\" was not passed a plugin name`\n )\n }\n\n if (typeof generateImageSource !== `function`) {\n throw new Error(`generateImageSource must be a function`)\n }\n\n if (!sourceMetadata || (!sourceMetadata.width && !sourceMetadata.height)) {\n // No metadata means we let the CDN handle max size etc, aspect ratio etc\n sourceMetadata = {\n width,\n height,\n format: sourceMetadata?.format || formatFromFilename(filename) || `auto`,\n }\n } else if (!sourceMetadata.format) {\n sourceMetadata.format = formatFromFilename(filename)\n }\n\n const formats = new Set(args.formats)\n\n if (formats.size === 0 || formats.has(`auto`) || formats.has(``)) {\n formats.delete(`auto`)\n formats.delete(``)\n formats.add(sourceMetadata.format)\n }\n\n if (formats.has(`jpg`) && formats.has(`png`)) {\n reporter.warn(\n `[${pluginName}] Specifying both 'jpg' and 'png' formats is not supported. Using 'auto' instead`\n )\n if (sourceMetadata.format === `jpg`) {\n formats.delete(`png`)\n } else {\n formats.delete(`jpg`)\n }\n }\n\n const imageSizes = calculateImageSizes({ ...args, sourceMetadata })\n\n const result: IGatsbyImageData[\"images\"] = {\n sources: [],\n }\n\n let sizes = args.sizes\n if (!sizes) {\n sizes = getSizes(imageSizes.presentationWidth, layout)\n }\n\n formats.forEach(format => {\n const images = imageSizes.sizes\n .map(size => {\n const imageSrc = generateImageSource(\n filename,\n size,\n Math.round(size / imageSizes.aspectRatio),\n format,\n fit,\n options\n )\n if (\n !imageSrc?.width ||\n !imageSrc.height ||\n !imageSrc.src ||\n !imageSrc.format\n ) {\n reporter.warn(\n `[${pluginName}] The resolver for image ${filename} returned an invalid value.`\n )\n return undefined\n }\n return imageSrc\n })\n .filter(Boolean)\n\n if (format === `jpg` || format === `png` || format === `auto`) {\n const unscaled =\n images.find(img => img.width === imageSizes.unscaledWidth) || images[0]\n\n if (unscaled) {\n result.fallback = {\n src: unscaled.src,\n srcSet: getSrcSet(images),\n sizes,\n }\n }\n } else {\n result.sources?.push({\n srcSet: getSrcSet(images),\n sizes,\n type: `image/${format}`,\n })\n }\n })\n\n const imageProps: Partial = {\n images: result,\n layout,\n backgroundColor,\n }\n\n if (placeholderURL) {\n imageProps.placeholder = { fallback: placeholderURL }\n }\n\n switch (layout) {\n case `fixed`:\n imageProps.width = imageSizes.presentationWidth\n imageProps.height = imageSizes.presentationHeight\n break\n\n case `fullWidth`:\n imageProps.width = 1\n imageProps.height = 1 / imageSizes.aspectRatio\n break\n\n case `constrained`:\n imageProps.width = args.width || imageSizes.presentationWidth || 1\n imageProps.height = (imageProps.width || 1) / imageSizes.aspectRatio\n }\n\n return imageProps as IGatsbyImageData\n}\n\nconst dedupeAndSortDensities = (values: Array): Array =>\n Array.from(new Set([1, ...values])).sort(sortNumeric)\n\nexport function calculateImageSizes(args: IImageSizeArgs): IImageSizes {\n const {\n width,\n height,\n filename,\n layout = `constrained`,\n sourceMetadata: imgDimensions,\n reporter = { warn },\n breakpoints = DEFAULT_BREAKPOINTS,\n } = args\n\n // check that all dimensions provided are positive\n const userDimensions = { width, height }\n const erroneousUserDimensions = Object.entries(userDimensions).filter(\n ([_, size]) => typeof size === `number` && size < 1\n )\n if (erroneousUserDimensions.length) {\n throw new Error(\n `Specified dimensions for images must be positive numbers (> 0). Problem dimensions you have are ${erroneousUserDimensions\n .map(dim => dim.join(`: `))\n .join(`, `)}`\n )\n }\n\n if (layout === `fixed`) {\n return fixedImageSizes(args)\n } else if (layout === `constrained`) {\n return responsiveImageSizes(args)\n } else if (layout === `fullWidth`) {\n return responsiveImageSizes({ breakpoints, ...args })\n } else {\n reporter.warn(\n `No valid layout was provided for the image at ${filename}. Valid image layouts are fixed, fullWidth, and constrained. Found ${layout}`\n )\n return {\n sizes: [imgDimensions.width],\n presentationWidth: imgDimensions.width,\n presentationHeight: imgDimensions.height,\n aspectRatio: imgDimensions.width / imgDimensions.height,\n unscaledWidth: imgDimensions.width,\n }\n }\n}\nexport function fixedImageSizes({\n filename,\n sourceMetadata: imgDimensions,\n width,\n height,\n fit = `cover`,\n outputPixelDensities = DEFAULT_PIXEL_DENSITIES,\n reporter = { warn },\n}: IImageSizeArgs): IImageSizes {\n let aspectRatio = imgDimensions.width / imgDimensions.height\n // Sort, dedupe and ensure there's a 1\n const densities = dedupeAndSortDensities(outputPixelDensities)\n\n // If both are provided then we need to check the fit\n if (width && height) {\n const calculated = getDimensionsAndAspectRatio(imgDimensions, {\n width,\n height,\n fit,\n })\n width = calculated.width\n height = calculated.height\n aspectRatio = calculated.aspectRatio\n }\n\n if (!width) {\n if (!height) {\n width = DEFAULT_FIXED_WIDTH\n } else {\n width = Math.round(height * aspectRatio)\n }\n } else if (!height) {\n height = Math.round(width / aspectRatio)\n }\n\n const originalWidth = width // will use this for presentationWidth, don't want to lose it\n const isTopSizeOverriden =\n imgDimensions.width < width || imgDimensions.height < (height as number)\n\n // If the image is smaller than requested, warn the user that it's being processed as such\n // print out this message with the necessary information before we overwrite it for sizing\n if (isTopSizeOverriden) {\n const fixedDimension = imgDimensions.width < width ? `width` : `height`\n reporter.warn(`\nThe requested ${fixedDimension} \"${\n fixedDimension === `width` ? width : height\n }px\" for the image ${filename} was larger than the actual image ${fixedDimension} of ${\n imgDimensions[fixedDimension]\n }px. If possible, replace the current image with a larger one.`)\n\n if (fixedDimension === `width`) {\n width = imgDimensions.width\n height = Math.round(width / aspectRatio)\n } else {\n height = imgDimensions.height\n width = height * aspectRatio\n }\n }\n\n const sizes = densities\n .filter(size => size >= 1) // remove smaller densities because fixed images don't need them\n .map(density => Math.round(density * (width as number)))\n .filter(size => size <= imgDimensions.width)\n\n return {\n sizes,\n aspectRatio,\n presentationWidth: originalWidth,\n presentationHeight: Math.round(originalWidth / aspectRatio),\n unscaledWidth: width,\n }\n}\n\nexport function responsiveImageSizes({\n sourceMetadata: imgDimensions,\n width,\n height,\n fit = `cover`,\n outputPixelDensities = DEFAULT_PIXEL_DENSITIES,\n breakpoints,\n layout,\n}: IImageSizeArgs): IImageSizes {\n let sizes\n let aspectRatio = imgDimensions.width / imgDimensions.height\n // Sort, dedupe and ensure there's a 1\n const densities = dedupeAndSortDensities(outputPixelDensities)\n\n // If both are provided then we need to check the fit\n if (width && height) {\n const calculated = getDimensionsAndAspectRatio(imgDimensions, {\n width,\n height,\n fit,\n })\n width = calculated.width\n height = calculated.height\n aspectRatio = calculated.aspectRatio\n }\n\n // Case 1: width of height were passed in, make sure it isn't larger than the actual image\n width = width && Math.min(width, imgDimensions.width)\n height = height && Math.min(height, imgDimensions.height)\n\n // Case 2: neither width or height were passed in, use default size\n if (!width && !height) {\n width = Math.min(DEFAULT_FLUID_WIDTH, imgDimensions.width)\n height = width / aspectRatio\n }\n\n // if it still hasn't been found, calculate width from the derived height.\n // TS isn't smart enough to realise the type for height has been narrowed here\n if (!width) {\n width = (height as number) * aspectRatio\n }\n\n const originalWidth = width\n const isTopSizeOverriden =\n imgDimensions.width < width || imgDimensions.height < (height as number)\n if (isTopSizeOverriden) {\n width = imgDimensions.width\n height = imgDimensions.height\n }\n\n width = Math.round(width)\n\n if (breakpoints?.length > 0) {\n sizes = breakpoints.filter(size => size <= imgDimensions.width)\n\n // If a larger breakpoint has been filtered-out, add the actual image width instead\n if (\n sizes.length < breakpoints.length &&\n !sizes.includes(imgDimensions.width)\n ) {\n sizes.push(imgDimensions.width)\n }\n } else {\n sizes = densities.map(density => Math.round(density * (width as number)))\n sizes = sizes.filter(size => size <= imgDimensions.width)\n }\n\n // ensure that the size passed in is included in the final output\n if (layout === `constrained` && !sizes.includes(width)) {\n sizes.push(width)\n }\n sizes = sizes.sort(sortNumeric)\n return {\n sizes,\n aspectRatio,\n presentationWidth: originalWidth,\n presentationHeight: Math.round(originalWidth / aspectRatio),\n unscaledWidth: width,\n }\n}\n\nexport function getDimensionsAndAspectRatio(\n dimensions,\n options\n): { width: number; height: number; aspectRatio: number } {\n // Calculate the eventual width/height of the image.\n const imageAspectRatio = dimensions.width / dimensions.height\n\n let width = options.width\n let height = options.height\n\n switch (options.fit) {\n case `fill`: {\n width = options.width ? options.width : dimensions.width\n height = options.height ? options.height : dimensions.height\n break\n }\n case `inside`: {\n const widthOption = options.width\n ? options.width\n : Number.MAX_SAFE_INTEGER\n const heightOption = options.height\n ? options.height\n : Number.MAX_SAFE_INTEGER\n\n width = Math.min(widthOption, Math.round(heightOption * imageAspectRatio))\n height = Math.min(\n heightOption,\n Math.round(widthOption / imageAspectRatio)\n )\n break\n }\n case `outside`: {\n const widthOption = options.width ? options.width : 0\n const heightOption = options.height ? options.height : 0\n\n width = Math.max(widthOption, Math.round(heightOption * imageAspectRatio))\n height = Math.max(\n heightOption,\n Math.round(widthOption / imageAspectRatio)\n )\n break\n }\n\n default: {\n if (options.width && !options.height) {\n width = options.width\n height = Math.round(options.width / imageAspectRatio)\n }\n\n if (options.height && !options.width) {\n width = Math.round(options.height * imageAspectRatio)\n height = options.height\n }\n }\n }\n\n return {\n width,\n height,\n aspectRatio: width / height,\n }\n}\n","/* global GATSBY___IMAGE */\nimport { generateImageData, EVERY_BREAKPOINT } from \"../image-utils\"\nimport type { CSSProperties, HTMLAttributes, ImgHTMLAttributes } from \"react\"\nimport type { Node } from \"gatsby\"\nimport type { PlaceholderProps } from \"./placeholder\"\nimport type { MainImageProps } from \"./main-image\"\nimport type { IGatsbyImageData } from \"./gatsby-image.browser\"\nimport type {\n IGatsbyImageHelperArgs,\n Layout,\n IImage,\n ImageFormat,\n} from \"../image-utils\"\n\n// Native lazy-loading support: https://addyosmani.com/blog/lazy-loading/\nexport const hasNativeLazyLoadSupport = (): boolean =>\n typeof HTMLImageElement !== `undefined` &&\n `loading` in HTMLImageElement.prototype\n\nexport function gatsbyImageIsInstalled(): boolean {\n return typeof GATSBY___IMAGE !== `undefined` && GATSBY___IMAGE\n}\n\nexport type IGatsbyImageDataParent = T & {\n gatsbyImageData: IGatsbyImageData\n}\nexport type IGatsbyImageParent = T & {\n gatsbyImage: IGatsbyImageData\n}\nexport type FileNode = Partial & {\n childImageSharp?: IGatsbyImageDataParent>\n}\n\nconst isGatsbyImageData = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n node: IGatsbyImageData | any\n): node is IGatsbyImageData =>\n // 🦆 check for a deep prop to be sure this is a valid gatsbyImageData object\n Boolean(node?.images?.fallback?.src)\n\nconst isGatsbyImageDataParent = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n node: IGatsbyImageDataParent | any\n): node is IGatsbyImageDataParent => Boolean(node?.gatsbyImageData)\n\nconst isGatsbyImageParent = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n node: IGatsbyImageParent | any\n): node is IGatsbyImageParent => Boolean(node?.gatsbyImage)\n\nexport type ImageDataLike =\n | FileNode\n | IGatsbyImageDataParent\n | IGatsbyImageParent\n | IGatsbyImageData\n\nexport const getImage = (\n node: ImageDataLike | null\n): IGatsbyImageData | undefined => {\n // This checks both for gatsbyImageData and gatsbyImage\n if (isGatsbyImageData(node)) {\n return node\n }\n // gatsbyImageData GraphQL field\n if (isGatsbyImageDataParent(node)) {\n return node.gatsbyImageData\n }\n // gatsbyImage GraphQL field for Gatsby's Image CDN service\n if (isGatsbyImageParent(node)) {\n return node.gatsbyImage\n }\n return node?.childImageSharp?.gatsbyImageData\n}\n\nexport const getSrc = (node: ImageDataLike): string | undefined =>\n getImage(node)?.images?.fallback?.src\n\nexport const getSrcSet = (node: ImageDataLike): string | undefined =>\n getImage(node)?.images?.fallback?.srcSet\n\nexport function getWrapperProps(\n width: number,\n height: number,\n layout: Layout\n): Pick, \"className\" | \"style\"> & {\n \"data-gatsby-image-wrapper\": string\n} {\n const wrapperStyle: CSSProperties = {}\n\n let className = `gatsby-image-wrapper`\n\n // If the plugin isn't installed we need to apply the styles inline\n if (!gatsbyImageIsInstalled()) {\n wrapperStyle.position = `relative`\n wrapperStyle.overflow = `hidden`\n }\n\n if (layout === `fixed`) {\n wrapperStyle.width = width\n wrapperStyle.height = height\n } else if (layout === `constrained`) {\n if (!gatsbyImageIsInstalled()) {\n wrapperStyle.display = `inline-block`\n wrapperStyle.verticalAlign = `top`\n }\n className = `gatsby-image-wrapper gatsby-image-wrapper-constrained`\n }\n\n return {\n className,\n \"data-gatsby-image-wrapper\": ``,\n style: wrapperStyle,\n }\n}\n\nexport interface IUrlBuilderArgs {\n width: number\n height: number\n baseUrl: string\n format: ImageFormat\n options: OptionsType\n}\nexport interface IGetImageDataArgs> {\n baseUrl: string\n /**\n * For constrained and fixed images, the size of the image element\n */\n width?: number\n height?: number\n /**\n * If available, pass the source image width and height\n */\n sourceWidth?: number\n sourceHeight?: number\n /**\n * If only one dimension is passed, then this will be used to calculate the other.\n */\n aspectRatio?: number\n layout?: Layout\n /**\n * Returns a URL based on the passed arguments. Should be a pure function\n */\n urlBuilder: (args: IUrlBuilderArgs) => string\n\n /**\n * Should be a data URI\n */\n placeholderURL?: string\n backgroundColor?: string\n /**\n * Used in error messages etc\n */\n pluginName?: string\n\n /**\n * If you do not support auto-format, pass an array of image types here\n */\n formats?: Array\n\n breakpoints?: Array\n\n /**\n * Passed to the urlBuilder function\n */\n options?: OptionsType\n}\n\n/**\n * Use this hook to generate gatsby-plugin-image data in the browser.\n */\nexport function getImageData({\n baseUrl,\n urlBuilder,\n sourceWidth,\n sourceHeight,\n pluginName = `getImageData`,\n formats = [`auto`],\n breakpoints,\n options,\n ...props\n}: IGetImageDataArgs): IGatsbyImageData {\n if (\n !breakpoints?.length &&\n (props.layout === `fullWidth` || (props.layout as string) === `FULL_WIDTH`)\n ) {\n breakpoints = EVERY_BREAKPOINT\n }\n const generateImageSource = (\n baseUrl: string,\n width: number,\n height?: number,\n format?: ImageFormat\n ): IImage => {\n return {\n width,\n height,\n format,\n src: urlBuilder({ baseUrl, width, height, options, format }),\n }\n }\n\n const sourceMetadata: IGatsbyImageHelperArgs[\"sourceMetadata\"] = {\n width: sourceWidth,\n height: sourceHeight,\n format: `auto`,\n }\n\n const args: IGatsbyImageHelperArgs = {\n ...props,\n pluginName,\n generateImageSource,\n filename: baseUrl,\n formats,\n breakpoints,\n sourceMetadata,\n }\n return generateImageData(args)\n}\n\nexport function getMainProps(\n isLoading: boolean,\n isLoaded: boolean,\n images: IGatsbyImageData[\"images\"],\n loading?: \"eager\" | \"lazy\",\n style: CSSProperties = {}\n): Partial {\n // fallback when it's not configured in gatsby-config.\n if (!gatsbyImageIsInstalled()) {\n style = {\n height: `100%`,\n left: 0,\n position: `absolute`,\n top: 0,\n transform: `translateZ(0)`,\n transition: `opacity 250ms linear`,\n width: `100%`,\n willChange: `opacity`,\n ...style,\n }\n }\n\n const result = {\n ...images,\n loading,\n shouldLoad: isLoading,\n \"data-main-image\": ``,\n style: {\n ...style,\n opacity: isLoaded ? 1 : 0,\n },\n }\n\n return result\n}\n\nexport type PlaceholderImageAttrs = ImgHTMLAttributes &\n Pick & {\n \"data-placeholder-image\"?: string\n }\n\nexport function getPlaceholderProps(\n placeholder: PlaceholderImageAttrs | undefined,\n isLoaded: boolean,\n layout: Layout,\n width?: number,\n height?: number,\n backgroundColor?: string,\n objectFit?: CSSProperties[\"objectFit\"],\n objectPosition?: CSSProperties[\"objectPosition\"]\n): PlaceholderImageAttrs {\n const wrapperStyle: CSSProperties = {}\n\n if (backgroundColor) {\n wrapperStyle.backgroundColor = backgroundColor\n\n if (layout === `fixed`) {\n wrapperStyle.width = width\n wrapperStyle.height = height\n wrapperStyle.backgroundColor = backgroundColor\n wrapperStyle.position = `relative`\n } else if (layout === `constrained`) {\n wrapperStyle.position = `absolute`\n wrapperStyle.top = 0\n wrapperStyle.left = 0\n wrapperStyle.bottom = 0\n wrapperStyle.right = 0\n } else if (layout === `fullWidth`) {\n wrapperStyle.position = `absolute`\n wrapperStyle.top = 0\n wrapperStyle.left = 0\n wrapperStyle.bottom = 0\n wrapperStyle.right = 0\n }\n }\n\n if (objectFit) {\n wrapperStyle.objectFit = objectFit\n }\n\n if (objectPosition) {\n wrapperStyle.objectPosition = objectPosition\n }\n const result: PlaceholderImageAttrs = {\n ...placeholder,\n \"aria-hidden\": true,\n \"data-placeholder-image\": ``,\n style: {\n opacity: isLoaded ? 0 : 1,\n transition: `opacity 500ms linear`,\n ...wrapperStyle,\n },\n }\n\n // fallback when it's not configured in gatsby-config.\n if (!gatsbyImageIsInstalled()) {\n result.style = {\n height: `100%`,\n left: 0,\n position: `absolute`,\n top: 0,\n width: `100%`,\n }\n }\n\n return result\n}\n\nexport interface IArtDirectedImage {\n media: string\n image: IGatsbyImageData\n}\n\n/**\n * Generate a Gatsby image data object with multiple, art-directed images that display at different\n * resolutions.\n *\n * @param defaultImage The image displayed when no media query matches.\n * It is also used for all other settings applied to the image, such as width, height and layout.\n * You should pass a className to the component with media queries to adjust the size of the container,\n * as this cannot be adjusted automatically.\n * @param artDirected Array of objects which each contains a `media` string which is a media query\n * such as `(min-width: 320px)`, and the image object to use when that query matches.\n */\nexport function withArtDirection(\n defaultImage: IGatsbyImageData,\n artDirected: Array\n): IGatsbyImageData {\n const { images, placeholder, ...props } = defaultImage\n const output: IGatsbyImageData = {\n ...props,\n images: {\n ...images,\n sources: [],\n },\n placeholder: placeholder && {\n ...placeholder,\n sources: [],\n },\n }\n\n artDirected.forEach(({ media, image }) => {\n if (!media) {\n if (process.env.NODE_ENV === `development`) {\n console.warn(\n \"[gatsby-plugin-image] All art-directed images passed to must have a value set for `media`. Skipping.\"\n )\n }\n return\n }\n\n if (\n image.layout !== defaultImage.layout &&\n process.env.NODE_ENV === `development`\n ) {\n console.warn(\n `[gatsby-plugin-image] Mismatched image layout: expected \"${defaultImage.layout}\" but received \"${image.layout}\". All art-directed images use the same layout as the default image`\n )\n }\n\n output.images.sources.push(\n ...image.images.sources.map(source => {\n return { ...source, media }\n }),\n {\n media,\n srcSet: image.images.fallback.srcSet,\n }\n )\n\n if (!output.placeholder) {\n return\n }\n\n output.placeholder.sources.push({\n media,\n srcSet: image.placeholder.fallback,\n })\n })\n output.images.sources.push(...images.sources)\n if (placeholder?.sources) {\n output.placeholder?.sources.push(...placeholder.sources)\n }\n return output\n}\n","import React, { Fragment, FunctionComponent, PropsWithChildren } from \"react\"\nimport terserMacro from \"../../macros/terser.macro\"\nimport { Layout } from \"../image-utils\"\n\nexport interface ILayoutWrapperProps {\n layout: Layout\n width: number\n height: number\n}\n\nconst NativeScriptLoading: FunctionComponent = () => (\n \n)\n\nexport function getSizer(\n layout: Layout,\n width: number,\n height: number\n): string {\n let sizer = ``\n if (layout === `fullWidth`) {\n sizer = `
    `\n }\n\n if (layout === `constrained`) {\n sizer = `
    \"\"
    `\n }\n\n return sizer\n}\n\nconst Sizer: FunctionComponent = function Sizer({\n layout,\n width,\n height,\n}) {\n if (layout === `fullWidth`) {\n return (\n
    \n )\n }\n\n if (layout === `constrained`) {\n return (\n
    \n \n
    \n )\n }\n\n return null\n}\n\nexport const LayoutWrapper: FunctionComponent<\n PropsWithChildren\n> = function LayoutWrapper({ children, ...props }) {\n return (\n \n \n {children}\n\n {SERVER ? : null}\n \n )\n}\n","import React, { FunctionComponent, ImgHTMLAttributes } from \"react\"\nimport * as PropTypes from \"prop-types\"\n\nexport interface IResponsiveImageProps {\n sizes?: string\n srcSet: string\n}\n\nexport type SourceProps = IResponsiveImageProps &\n (\n | {\n media: string\n type?: string\n }\n | {\n media?: string\n type: string\n }\n )\n\ntype FallbackProps = { src: string } & Partial\n\ntype ImageProps = ImgHTMLAttributes & {\n src: string\n alt: string\n shouldLoad: boolean\n}\n\nexport type PictureProps = ImgHTMLAttributes & {\n fallback?: FallbackProps\n sources?: Array\n alt: string\n shouldLoad?: boolean\n}\n\nconst Image: FunctionComponent = function Image({\n src,\n srcSet,\n loading,\n alt = ``,\n shouldLoad,\n ...props\n}) {\n return (\n \n )\n}\n\nexport const Picture: React.FC = function Picture({\n fallback,\n sources = [],\n shouldLoad = true,\n ...props\n}) {\n const sizes = props.sizes || fallback?.sizes\n const fallbackImage = (\n \n )\n\n if (!sources.length) {\n return fallbackImage\n }\n\n return (\n \n {sources.map(({ media, srcSet, type }) => (\n \n ))}\n {fallbackImage}\n \n )\n}\n\nImage.propTypes = {\n src: PropTypes.string.isRequired,\n alt: PropTypes.string.isRequired,\n sizes: PropTypes.string,\n srcSet: PropTypes.string,\n shouldLoad: PropTypes.bool,\n}\n\nPicture.displayName = `Picture`\nPicture.propTypes = {\n alt: PropTypes.string.isRequired,\n shouldLoad: PropTypes.bool,\n fallback: PropTypes.exact({\n src: PropTypes.string.isRequired,\n srcSet: PropTypes.string,\n sizes: PropTypes.string,\n }),\n sources: PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.exact({\n media: PropTypes.string.isRequired,\n type: PropTypes.string,\n sizes: PropTypes.string,\n srcSet: PropTypes.string.isRequired,\n }),\n PropTypes.exact({\n media: PropTypes.string,\n type: PropTypes.string.isRequired,\n sizes: PropTypes.string,\n srcSet: PropTypes.string.isRequired,\n }),\n ])\n ),\n}\n","import React, { FunctionComponent, ImgHTMLAttributes } from \"react\"\nimport * as PropTypes from \"prop-types\"\nimport { Picture, SourceProps } from \"./picture\"\n\nexport type PlaceholderProps = ImgHTMLAttributes & {\n fallback?: string\n sources?: Array\n}\n\nexport const Placeholder: FunctionComponent =\n function Placeholder({ fallback, ...props }) {\n if (fallback) {\n return (\n \n )\n } else {\n return
    \n }\n }\n\nPlaceholder.displayName = `Placeholder`\nPlaceholder.propTypes = {\n fallback: PropTypes.string,\n sources: Picture.propTypes?.sources,\n alt: function (props, propName, componentName): Error | null {\n if (!props[propName]) {\n return null\n }\n\n return new Error(\n `Invalid prop \\`${propName}\\` supplied to \\`${componentName}\\`. Validation failed.`\n )\n },\n}\n","import React from \"react\"\nimport { Picture, PictureProps } from \"./picture\"\n\nexport type MainImageProps = PictureProps\n\nexport const MainImage: React.FC = function MainImage(props) {\n return (\n <>\n \n \n \n )\n}\n\nMainImage.displayName = `MainImage`\nMainImage.propTypes = Picture.propTypes\n","import React from \"react\"\nimport { getWrapperProps, getMainProps, getPlaceholderProps } from \"./hooks\"\nimport { Placeholder } from \"./placeholder\"\nimport { MainImage, MainImageProps } from \"./main-image\"\nimport { LayoutWrapper } from \"./layout-wrapper\"\nimport PropTypes from \"prop-types\"\nimport type { FunctionComponent, WeakValidationMap } from \"react\"\nimport type { GatsbyImageProps, IGatsbyImageData } from \"./gatsby-image.browser\"\n\nconst removeNewLines = (str: string): string => str.replace(/\\n/g, ``)\n\nexport const GatsbyImage: FunctionComponent =\n function GatsbyImage({\n as = `div`,\n className,\n class: preactClass,\n style,\n image,\n loading = `lazy`,\n imgClassName,\n imgStyle,\n backgroundColor,\n objectFit,\n objectPosition,\n ...props\n }) {\n if (!image) {\n console.warn(`[gatsby-plugin-image] Missing image prop`)\n return null\n }\n\n if (preactClass) {\n className = preactClass\n }\n\n imgStyle = {\n objectFit,\n objectPosition,\n backgroundColor,\n ...imgStyle,\n }\n\n const {\n width,\n height,\n layout,\n images,\n placeholder,\n backgroundColor: placeholderBackgroundColor,\n } = image\n\n const {\n style: wStyle,\n className: wClass,\n ...wrapperProps\n } = getWrapperProps(width, height, layout)\n\n const cleanedImages: IGatsbyImageData[\"images\"] = {\n fallback: undefined,\n sources: [],\n }\n if (images.fallback) {\n cleanedImages.fallback = {\n ...images.fallback,\n srcSet: images.fallback.srcSet\n ? removeNewLines(images.fallback.srcSet)\n : undefined,\n }\n }\n\n if (images.sources) {\n cleanedImages.sources = images.sources.map(source => {\n return {\n ...source,\n srcSet: removeNewLines(source.srcSet),\n }\n })\n }\n\n return React.createElement(\n as,\n {\n ...wrapperProps,\n style: {\n ...wStyle,\n ...style,\n backgroundColor,\n },\n className: `${wClass}${className ? ` ${className}` : ``}`,\n },\n \n \n\n )}\n // When eager is set we want to start the isLoading state on true (we want to load the img without react)\n {...getMainProps(\n loading === `eager`,\n false,\n cleanedImages,\n loading,\n imgStyle\n )}\n />\n \n )\n }\n\nexport const altValidator: PropTypes.Validator = (\n props: GatsbyImageProps,\n propName,\n componentName,\n ...rest\n): Error | undefined => {\n if (!props.alt && props.alt !== ``) {\n return new Error(\n `The \"alt\" prop is required in ${componentName}. If the image is purely presentational then pass an empty string: e.g. alt=\"\". Learn more: https://a11y-style-guide.com/style-guide/section-media.html`\n )\n }\n\n return PropTypes.string(props, propName, componentName, ...rest)\n}\n\nexport const propTypes = {\n image: PropTypes.object.isRequired,\n alt: altValidator,\n} as WeakValidationMap\n","import {\n createElement,\n memo,\n useMemo,\n useEffect,\n useLayoutEffect,\n useRef,\n} from \"react\"\nimport {\n getWrapperProps,\n gatsbyImageIsInstalled,\n hasNativeLazyLoadSupport,\n} from \"./hooks\"\nimport { getSizer } from \"./layout-wrapper\"\nimport { propTypes } from \"./gatsby-image.server\"\nimport type {\n FC,\n ElementType,\n FunctionComponent,\n ImgHTMLAttributes,\n CSSProperties,\n ReactEventHandler,\n} from \"react\"\nimport type { renderImageToString } from \"./lazy-hydrate\"\nimport type { PlaceholderProps } from \"./placeholder\"\nimport type { MainImageProps } from \"./main-image\"\nimport type { Layout } from \"../image-utils\"\n\nconst imageCache = new Set()\nlet renderImageToStringPromise\nlet renderImage: typeof renderImageToString | undefined\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport interface GatsbyImageProps\n extends Omit<\n ImgHTMLAttributes,\n \"placeholder\" | \"onLoad\" | \"src\" | \"srcSet\" | \"width\" | \"height\"\n > {\n alt: string\n as?: ElementType\n className?: string\n class?: string\n imgClassName?: string\n image: IGatsbyImageData\n imgStyle?: CSSProperties\n backgroundColor?: string\n objectFit?: CSSProperties[\"objectFit\"]\n objectPosition?: CSSProperties[\"objectPosition\"]\n onLoad?: (props: { wasCached: boolean }) => void\n onError?: ReactEventHandler\n onStartLoad?: (props: { wasCached: boolean }) => void\n}\n\nexport interface IGatsbyImageData {\n layout: Layout\n width: number\n height: number\n backgroundColor?: string\n images: Pick\n placeholder?: Pick\n}\n\nconst GatsbyImageHydrator: FC = function GatsbyImageHydrator({\n as = `div`,\n image,\n style,\n backgroundColor,\n className,\n class: preactClass,\n onStartLoad,\n onLoad,\n onError,\n ...props\n}) {\n const { width, height, layout } = image\n const {\n style: wStyle,\n className: wClass,\n ...wrapperProps\n } = getWrapperProps(width, height, layout)\n const root = useRef()\n const cacheKey = useMemo(() => JSON.stringify(image.images), [image.images])\n\n // Preact uses class instead of className so we need to check for both\n if (preactClass) {\n className = preactClass\n }\n\n const sizer = getSizer(layout, width, height)\n\n useEffect(() => {\n if (!renderImageToStringPromise) {\n renderImageToStringPromise = import(`./lazy-hydrate`).then(\n ({ renderImageToString, swapPlaceholderImage }) => {\n renderImage = renderImageToString\n\n return {\n renderImageToString,\n swapPlaceholderImage,\n }\n }\n )\n }\n\n // The plugin image component is a bit special where if it's server-side rendered, we add extra script tags to support lazy-loading without\n // In this case we stop hydration but fire the correct events.\n const ssrImage = root.current.querySelector(\n `[data-gatsby-image-ssr]`\n ) as HTMLImageElement\n if (ssrImage && hasNativeLazyLoadSupport()) {\n if (ssrImage.complete) {\n // Trigger onStartload and onLoad events\n onStartLoad?.({\n wasCached: true,\n })\n onLoad?.({\n wasCached: true,\n })\n\n // remove ssr key for state updates but add delay to not fight with native code snippt of gatsby-ssr\n setTimeout(() => {\n ssrImage.removeAttribute(`data-gatsby-image-ssr`)\n }, 0)\n } else {\n onStartLoad?.({\n wasCached: true,\n })\n\n ssrImage.addEventListener(`load`, function onLoadListener() {\n ssrImage.removeEventListener(`load`, onLoadListener)\n\n onLoad?.({\n wasCached: true,\n })\n // remove ssr key for state updates but add delay to not fight with native code snippt of gatsby-ssr\n setTimeout(() => {\n ssrImage.removeAttribute(`data-gatsby-image-ssr`)\n }, 0)\n })\n }\n\n imageCache.add(cacheKey)\n\n return\n }\n\n if (renderImage && imageCache.has(cacheKey)) {\n return\n }\n\n let animationFrame\n let cleanupCallback\n renderImageToStringPromise.then(\n ({ renderImageToString, swapPlaceholderImage }) => {\n if (!root.current) {\n return\n }\n\n root.current.innerHTML = renderImageToString({\n isLoading: true,\n isLoaded: imageCache.has(cacheKey),\n image,\n ...props,\n })\n\n if (!imageCache.has(cacheKey)) {\n animationFrame = requestAnimationFrame(() => {\n if (root.current) {\n cleanupCallback = swapPlaceholderImage(\n root.current,\n cacheKey,\n imageCache,\n style,\n onStartLoad,\n onLoad,\n onError\n )\n }\n })\n }\n }\n )\n\n // eslint-disable-next-line consistent-return\n return (): void => {\n if (animationFrame) {\n cancelAnimationFrame(animationFrame)\n }\n if (cleanupCallback) {\n cleanupCallback()\n }\n }\n }, [image])\n\n // useLayoutEffect is ran before React commits to the DOM. This allows us to make sure our HTML is using our cached image version\n useLayoutEffect(() => {\n if (imageCache.has(cacheKey) && renderImage) {\n root.current.innerHTML = renderImage({\n isLoading: imageCache.has(cacheKey),\n isLoaded: imageCache.has(cacheKey),\n image,\n ...props,\n })\n\n // Trigger onStartload and onLoad events\n onStartLoad?.({\n wasCached: true,\n })\n onLoad?.({\n wasCached: true,\n })\n }\n }, [image])\n\n // By keeping all props equal React will keep the component in the DOM\n return createElement(as, {\n ...wrapperProps,\n style: {\n ...wStyle,\n ...style,\n backgroundColor,\n },\n className: `${wClass}${className ? ` ${className}` : ``}`,\n ref: root,\n dangerouslySetInnerHTML: {\n __html: sizer,\n },\n suppressHydrationWarning: true,\n })\n}\n\nexport const GatsbyImage: FunctionComponent = memo(\n function GatsbyImage(props) {\n if (!props.image) {\n if (process.env.NODE_ENV === `development`) {\n console.warn(`[gatsby-plugin-image] Missing image prop`)\n }\n\n return null\n }\n\n if (!gatsbyImageIsInstalled() && process.env.NODE_ENV === `development`) {\n console.warn(\n `[gatsby-plugin-image] You're missing out on some cool performance features. Please add \"gatsby-plugin-image\" to your gatsby-config.js`\n )\n }\n\n return createElement(GatsbyImageHydrator, props)\n }\n)\n\nGatsbyImage.propTypes = propTypes\nGatsbyImage.displayName = `GatsbyImage`\n","import React, { FunctionComponent, ReactElement } from \"react\"\nimport {\n altValidator,\n GatsbyImage as GatsbyImageServer,\n} from \"./gatsby-image.server\"\nimport { GatsbyImageProps, IGatsbyImageData } from \"./gatsby-image.browser\"\nimport PropTypes from \"prop-types\"\nimport { ISharpGatsbyImageArgs } from \"../image-utils\"\n\nexport interface IStaticImageProps\n extends Omit,\n Omit {\n src: string\n filename?: string\n}\n\n// These values are added by Babel. Do not add them manually\ninterface IPrivateProps {\n __imageData?: IGatsbyImageData\n __error?: string\n}\n\nexport function _getStaticImage(\n GatsbyImage: FunctionComponent\n): React.FC {\n return function StaticImage({\n src,\n __imageData: imageData,\n __error,\n // We extract these because they're not meant to be passed-down to GatsbyImage\n /* eslint-disable @typescript-eslint/no-unused-vars */\n width,\n height,\n aspectRatio,\n tracedSVGOptions,\n placeholder,\n formats,\n quality,\n transformOptions,\n jpgOptions,\n pngOptions,\n webpOptions,\n avifOptions,\n blurredOptions,\n breakpoints,\n outputPixelDensities,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...props\n }): ReactElement {\n if (__error) {\n console.warn(__error)\n }\n\n if (imageData) {\n return \n }\n console.warn(`Image not loaded`, src)\n if (!__error && process.env.NODE_ENV === `development`) {\n console.warn(\n `Please ensure that \"gatsby-plugin-image\" is included in the plugins array in gatsby-config.js, and that your version of gatsby is at least 2.24.78`\n )\n }\n return null\n }\n}\n\nconst StaticImage: React.FC =\n _getStaticImage(GatsbyImageServer)\n\nconst checkDimensionProps: PropTypes.Validator = (\n props: IStaticImageProps & IPrivateProps,\n propName: keyof IStaticImageProps & IPrivateProps,\n ...rest\n) => {\n if (\n props.layout === `fullWidth` &&\n (propName === `width` || propName === `height`) &&\n props[propName]\n ) {\n return new Error(\n `\"${propName}\" ${props[propName]} may not be passed when layout is fullWidth.`\n )\n }\n return PropTypes.number(props, propName, ...rest)\n}\n\nconst validLayouts = new Set([`fixed`, `fullWidth`, `constrained`])\n\nexport const propTypes = {\n src: PropTypes.string.isRequired,\n alt: altValidator,\n width: checkDimensionProps,\n height: checkDimensionProps,\n sizes: PropTypes.string,\n layout: (props: IStaticImageProps & IPrivateProps): Error | undefined => {\n if (props.layout === undefined) {\n return undefined\n }\n if (validLayouts.has(props.layout)) {\n return undefined\n }\n\n return new Error(\n `Invalid value ${props.layout}\" provided for prop \"layout\". Defaulting to \"constrained\". Valid values are \"fixed\", \"fullWidth\" or \"constrained\".`\n )\n },\n}\n\nStaticImage.displayName = `StaticImage`\nStaticImage.propTypes = propTypes\n\nexport { StaticImage }\n","import {\n GatsbyImage as GatsbyImageBrowser,\n IGatsbyImageData,\n} from \"./gatsby-image.browser\"\nimport React from \"react\"\nimport {\n _getStaticImage,\n propTypes,\n IStaticImageProps,\n} from \"./static-image.server\"\n// These values are added by Babel. Do not add them manually\ninterface IPrivateProps {\n __imageData?: IGatsbyImageData\n __error?: string\n}\n\nconst StaticImage: React.FC =\n _getStaticImage(GatsbyImageBrowser)\n\nStaticImage.displayName = `StaticImage`\nStaticImage.propTypes = propTypes\n\nexport { StaticImage }\n","import React from \"react\"\nimport {Link} from \"gatsby\"\nimport PropTypes from \"prop-types\"\n\nconst NavBar = ({siteTitle, menuLinks}) => (\n\n \n)\n\nNavBar.propTypes = {\n siteTitle: PropTypes.string,\n menuLinks: PropTypes.array\n}\n\nNavBar.defaultProps = {\n siteTitle: ``,\n menuLinks: ``\n}\n\nexport default NavBar\n","import React from 'react';\nimport {StaticQuery, graphql} from \"gatsby\"\nimport {GatsbyImage, getImage} from \"gatsby-plugin-image\"\nimport {Container, Col, Row} from \"react-bootstrap\";\n\nclass Logos extends React.Component {\n\n render() {\n\n return (\n \n

    Current partners

    \n \n \n {this.props.logos.nodes.map((item, i) => (\n \n \n \n \n ))}\n\n \n \n
    \n )\n }\n}\n\nconst PartnerLogos = () => (\n (\n \n )}\n />\n);\n\nexport default PartnerLogos;\n","import React from \"react\";\nimport { Col, Container, Row } from \"react-bootstrap\";\nimport PropTypes from \"prop-types\";\nimport {Link} from \"gatsby\";\n\nconst Footer = ({siteTitle, footerLinks},) => {\n return (\n <>\n \n \n
    \n\n\n
    \n \n \n \n

    {siteTitle}

    \n
    \n\n \n\n \n

    Further information

    \n
    \n
      \n {footerLinks.map(link => (\n
    • {link.name}
    • \n ))}\n
    \n\n \n\n \n

    Contact

    \n \n

    \n c/o Historic England
    \n 4th Floor
    \n Cannon Bridge House
    \n 25 Dowgate Hill
    \n London
    \n EC4R 2YA\n

    \n \n
    \n
    \n
    \n\n
    \n\n
    \n
    \n \n );\n};\nFooter.propTypes = {\n siteTitle: PropTypes.string,\n footerLinks: PropTypes.array\n}\n\nFooter.defaultProps = {\n siteTitle: ``,\n footerLinks: ``\n}\n\nexport default Footer;\n","import { useEffect } from \"react\";\n\nimport 'vanilla-cookieconsent';\nimport 'vanilla-cookieconsent/dist/cookieconsent.css';\n\nexport default function CookieConsent() {\n useEffect(() => {\n const logo = '';\n const cookie = '🍪';\n if (!document.getElementById('cc--main')) {\n window.CookieConsentApi = window.initCookieConsent();\n window.CookieConsentApi.run({\n current_lang : 'en',\n autoclear_cookies : true, // default: false\n cookie_name: 'dejp3-cookies', // default: 'cc_cookie'\n cookie_expiration : 365, // default: 182\n page_scripts: true, // default: false\n\n force_consent: true,\n hide_from_bots: true, // default: false\n\n gui_options: {\n consent_modal: {\n layout: 'box', // box,cloud,bar\n position: 'bottom left', // bottom,middle,top + left,right,center\n transition: 'slide' // zoom,slide\n },\n settings_modal: {\n layout: 'box', // box,bar\n position: 'left', // right,left (available only if bar layout selected)\n transition: 'slide' // zoom,slide\n }\n },\n\n onFirstAction: function(){\n console.log('onFirstAction fired');\n },\n\n onAccept: function (cookie) {\n console.log('onAccept fired ...');\n },\n\n onChange: function (cookie, changed_preferences) {\n console.log('onChange fired ...');\n },\n\n languages: {\n 'en': {\n consent_modal: {\n title: cookie + ' We use cookies! ',\n description: 'Hi, this website uses essential cookies to ensure its proper operation and tracking cookies to understand how you interact with it. The latter will be set only after consent. ',\n primary_btn: {\n text: 'Accept all',\n role: 'accept_all' // 'accept_selected' or 'accept_all'\n },\n secondary_btn: {\n text: 'Reject all',\n role: 'accept_necessary' // 'settings' or 'accept_necessary'\n }\n },\n settings_modal: {\n title: logo,\n save_settings_btn: 'Save my choices',\n accept_all_btn: 'Accept all',\n reject_all_btn: 'Reject all',\n close_btn_label: 'Close',\n cookie_table_headers: [\n {col1: 'Name'},\n {col2: 'Domain'},\n {col3: 'Expiration'},\n {col4: 'Description'}\n ],\n blocks: [\n {\n title: 'Cookie usage and the Fitzwilliam website',\n description: 'I use cookies to ensure the basic functionalities of the website and to enhance your online experience. You can choose for each category to opt-in/out whenever you want.'\n }, {\n title: 'Strictly necessary cookies',\n description: 'These cookies are essential for the proper functioning of my website. Without these cookies, the website would not work properly',\n toggle: {\n value: 'necessary',\n enabled: true,\n readonly: true // cookie categories with readonly=true are all treated as \"necessary cookies\"\n }\n }, {\n title: 'Performance and Analytics cookies',\n description: 'These cookies allow the website to remember the choices you have made in the past',\n toggle: {\n value: 'analytics', // there are no default categories => you specify them\n enabled: true,\n readonly: false\n },\n cookie_table: [\n {\n col1: '^_ga',\n col2: 'google.com',\n col3: '2 years',\n col4: 'Google Analytics identifies unique users across GA sessions through client ID. The client ID is stored in the Google Analytics cookie. The GA cookie is set when a person visits your website for the first time. Google Analytics sends the client ID with each hit to associate hits with a user.',\n is_regex: true\n },\n {\n col1: '_gid',\n col2: 'google.com',\n col3: '1 day',\n col4: 'This cookie is installed by Google Analytics. The cookie is used to store information of how visitors use a website and helps in creating an analytics report of how the website is doing.',\n }\n ]\n }, {\n title: 'Advertisement and Targeting cookies',\n description: 'These cookies collect information about how you use the website, which pages you visited and which links you clicked on. All of the data is anonymized and cannot be used to identify you',\n toggle: {\n value: 'targeting',\n enabled: false,\n readonly: false\n }\n }, {\n title: 'More information',\n description: 'For any queries in relation to our policy on cookies and your choices, please review the University of Cambridge policy.',\n }\n ]\n }\n }\n }\n });\n }\n\n }, []);\n\n return null;\n}","import * as React from \"react\"\nimport {useStaticQuery, graphql} from \"gatsby\"\n\nimport NavBar from \"./structure/nav\";\nimport Logos from \"./structure/logos\";\nimport Footer from \"./structure/footer\";\nimport BackToTop from 'react-back-to-top';\nimport CookieConsent from '../services/cookieconsent';\nimport \"./layout.css\"\nconst Layout = ({children}) => {\n\n const data = useStaticQuery(graphql`\n query SiteTitleQuery {\n site {\n siteMetadata {\n title\n menuLinks {\n name\n link\n id\n }\n footerLinks {\n name\n link\n id\n }\n }\n }\n }\n `)\n\n return (\n <>\n \n
    \n\n
    \n {children}\n
    \n
    \n \n
    \n \n \n\n \n )\n}\n\nexport default Layout\n","import React from \"react\";\nimport { useSiteMetadata } from \"../../hooks/use-site-metadata\";\n\nconst Seo = ({ title, description, pathname, children }) => {\n const { title: defaultTitle, description: defaultDescription, image, siteUrl, twitterHandle } = useSiteMetadata();\n const seo = {\n title: title || defaultTitle,\n description: description || defaultDescription,\n image: `${siteUrl}${image}`,\n url: `${siteUrl}${pathname || ``}`,\n twitterHandle\n };\n\n return (\n <>\n {seo.title}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {children}\n \n );\n};\n\nexport default Seo;","import { graphql, useStaticQuery } from \"gatsby\"\n\nexport const useSiteMetadata = () => {\n const data = useStaticQuery(graphql`\n query {\n site {\n siteMetadata {\n title\n description\n twitterHandle\n image \n siteUrl\n }\n }\n }\n `)\n\n return data.site.siteMetadata\n}","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nvar _react = _interopRequireWildcard(require(\"react\"));\n\nvar _utils = require(\"./utils\");\n\nrequire(\"./BackToTop.css\");\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { \"default\": obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj[\"default\"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nvar BackToTop =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(BackToTop, _Component);\n\n function BackToTop(props) {\n var _this;\n\n _classCallCheck(this, BackToTop);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(BackToTop).call(this, props));\n _this.state = {\n percent: 0,\n current: 0\n };\n _this.animate = _this.props.animate || 'fade';\n /**1、fade(default) 2、rotate 3、none */\n\n _this.mainStyle = _this.props.mainStyle || {};\n _this.percentStyle = _this.props.percentStyle || {};\n _this.offsetTop = _this.props.offsetTop || 0;\n _this.step = _this.props.step || 50;\n _this.visiblePercent = _this.props.visiblePercent > 0 ? _this.props.visiblePercent : 1;\n _this.isPercent = _this.props.isPercent === undefined ? true : _this.props.isPercent;\n return _this;\n }\n\n _createClass(BackToTop, [{\n key: \"scrollToTop\",\n value: function scrollToTop() {\n (0, _utils.ScrollToAnimate)(this.props.offsetTop, this.props.step, this.state.current);\n }\n }, {\n key: \"componentDidMount\",\n value: function componentDidMount() {\n var _this2 = this;\n\n if (window) {\n window.onscroll = function () {\n _this2.setState({\n percent: (0, _utils.getScrollPercent)(_this2.props.offsetTop),\n current: (0, _utils.getScrollTop)()\n }); // this.setState({ current: getScrollTop() });\n\n };\n }\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this3 = this;\n\n var _this$props = this.props,\n animate = _this$props.animate,\n children = _this$props.children;\n var visible = this.state.percent >= this.visiblePercent;\n var animateHide = 'c-animate-hide';\n var animateShow = 'c-animate-show';\n\n if (animate !== 'fade' && animate !== 'rotate') {\n if (animate !== 'none') {\n animateHide = 'fade-hide';\n animateShow = 'fade-show';\n }\n } else {\n animateHide = animate + '-hide';\n animateShow = animate + '-show';\n }\n\n return _react[\"default\"].createElement(\"div\", {\n onClick: function onClick() {\n return _this3.scrollToTop();\n },\n className: 'base-back-to-up ' + (visible ? animateShow : animateHide)\n }, _react[\"default\"].createElement(\"div\", {\n className: \"back-to-up-default\",\n style: this.mainStyle\n }, children ? Array.isArray(children) ? children.map(child, function (index) {\n return _react[\"default\"].createElement(\"div\", {\n key: index\n }, child);\n }) : children && _react[\"default\"].createElement(\"div\", null, children) : _react[\"default\"].createElement(\"div\", {\n className: \"back-to-up-default-text\"\n }, _react[\"default\"].createElement(\"span\", null, \"UP\")), _react[\"default\"].createElement(\"div\", {\n className: 'to-up-percent' + (this.isPercent ? '' : ' percent-hide'),\n style: this.percentStyle\n }, this.state.percent + '%')));\n }\n }]);\n\n return BackToTop;\n}(_react.Component);\n\nvar _default = BackToTop;\nexports[\"default\"] = _default;\n//# sourceMappingURL=BackToTop.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getScrollTop = getScrollTop;\nexports.ScrollToAnimate = ScrollToAnimate;\nexports.getScrollPercent = getScrollPercent;\n\n/**\n * 获取当前滚动条所在位置\n */\nfunction getScrollTop() {\n var scrollTop = 0;\n\n if (document.documentElement && document.documentElement.scrollTop) {\n scrollTop = document.documentElement.scrollTop;\n } else if (document.body) {\n scrollTop = document.body.scrollTop;\n }\n\n return scrollTop;\n}\n/**\n * TODO\n * @param {*} position 滚动到何处\n * @param {*} step 步长\n * @param {*} current 滚动条当前位置\n */\n\n\nfunction ScrollToAnimate(position, step, current) {\n var start = 0;\n var timer = setInterval(function () {\n if (current - start >= position) {\n start += step;\n\n if (current - start >= position) {\n window.scrollTo(0, current - start);\n } else {\n window.scrollTo(0, position);\n }\n } else {\n clearInterval(timer);\n }\n }, 0);\n}\n/**\n * 获取滚动条位置百分比\n */\n\n\nfunction getScrollPercent(offsetTop) {\n var percent = 0;\n\n if (offsetTop < getScrollTop()) {\n percent = Math.round((getScrollTop() - offsetTop) / (document.body.scrollHeight - offsetTop - window.innerHeight) * 100);\n }\n\n return percent > 100 ? 100 : percent;\n}\n//# sourceMappingURL=utils.js.map","module.exports = require(\"./dist/BackToTop\");\nexports.default = require(\"./dist/BackToTop\");\n","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport function useCol({\n as,\n bsPrefix,\n className,\n ...props\n}) {\n bsPrefix = useBootstrapPrefix(bsPrefix, 'col');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const spans = [];\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let span;\n let offset;\n let order;\n if (typeof propValue === 'object' && propValue != null) {\n ({\n span,\n offset,\n order\n } = propValue);\n } else {\n span = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (span) spans.push(span === true ? `${bsPrefix}${infix}` : `${bsPrefix}${infix}-${span}`);\n if (order != null) classes.push(`order${infix}-${order}`);\n if (offset != null) classes.push(`offset${infix}-${offset}`);\n });\n return [{\n ...props,\n className: classNames(className, ...spans, ...classes)\n }, {\n as,\n bsPrefix,\n spans\n }];\n}\nconst Col = /*#__PURE__*/React.forwardRef(\n// Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n(props, ref) => {\n const [{\n className,\n ...colProps\n }, {\n as: Component = 'div',\n bsPrefix,\n spans\n }] = useCol(props);\n return /*#__PURE__*/_jsx(Component, {\n ...colProps,\n ref: ref,\n className: classNames(className, !spans.length && bsPrefix)\n });\n});\nCol.displayName = 'Col';\nexport default Col;","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Container = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n fluid = false,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n className,\n ...props\n}, ref) => {\n const prefix = useBootstrapPrefix(bsPrefix, 'container');\n const suffix = typeof fluid === 'string' ? `-${fluid}` : '-fluid';\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, fluid ? `${prefix}${suffix}` : prefix)\n });\n});\nContainer.displayName = 'Container';\nexport default Container;","\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Row = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'row');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const sizePrefix = `${decoratedBsPrefix}-cols`;\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let cols;\n if (propValue != null && typeof propValue === 'object') {\n ({\n cols\n } = propValue);\n } else {\n cols = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (cols != null) classes.push(`${sizePrefix}${infix}-${cols}`);\n });\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, decoratedBsPrefix, ...classes)\n });\n});\nRow.displayName = 'Row';\nexport default Row;","\"use client\";\n\nimport * as React from 'react';\nimport { useContext, useMemo } from 'react';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const DEFAULT_BREAKPOINTS = ['xxl', 'xl', 'lg', 'md', 'sm', 'xs'];\nexport const DEFAULT_MIN_BREAKPOINT = 'xs';\nconst ThemeContext = /*#__PURE__*/React.createContext({\n prefixes: {},\n breakpoints: DEFAULT_BREAKPOINTS,\n minBreakpoint: DEFAULT_MIN_BREAKPOINT\n});\nconst {\n Consumer,\n Provider\n} = ThemeContext;\nfunction ThemeProvider({\n prefixes = {},\n breakpoints = DEFAULT_BREAKPOINTS,\n minBreakpoint = DEFAULT_MIN_BREAKPOINT,\n dir,\n children\n}) {\n const contextValue = useMemo(() => ({\n prefixes: {\n ...prefixes\n },\n breakpoints,\n minBreakpoint,\n dir\n }), [prefixes, breakpoints, minBreakpoint, dir]);\n return /*#__PURE__*/_jsx(Provider, {\n value: contextValue,\n children: children\n });\n}\nexport function useBootstrapPrefix(prefix, defaultPrefix) {\n const {\n prefixes\n } = useContext(ThemeContext);\n return prefix || prefixes[defaultPrefix] || defaultPrefix;\n}\nexport function useBootstrapBreakpoints() {\n const {\n breakpoints\n } = useContext(ThemeContext);\n return breakpoints;\n}\nexport function useBootstrapMinBreakpoint() {\n const {\n minBreakpoint\n } = useContext(ThemeContext);\n return minBreakpoint;\n}\nexport function useIsRTL() {\n const {\n dir\n } = useContext(ThemeContext);\n return dir === 'rtl';\n}\nfunction createBootstrapComponent(Component, opts) {\n if (typeof opts === 'string') opts = {\n prefix: opts\n };\n const isClassy = Component.prototype && Component.prototype.isReactComponent;\n // If it's a functional component make sure we don't break it with a ref\n const {\n prefix,\n forwardRefAs = isClassy ? 'ref' : 'innerRef'\n } = opts;\n const Wrapped = /*#__PURE__*/React.forwardRef(({\n ...props\n }, ref) => {\n props[forwardRefAs] = ref;\n const bsPrefix = useBootstrapPrefix(props.bsPrefix, prefix);\n return /*#__PURE__*/_jsx(Component, {\n ...props,\n bsPrefix: bsPrefix\n });\n });\n Wrapped.displayName = `Bootstrap(${Component.displayName || Component.name})`;\n return Wrapped;\n}\nexport { createBootstrapComponent, Consumer as ThemeConsumer };\nexport default ThemeProvider;","/*!\n * CookieConsent v2.9.2\n * https://www.github.com/orestbida/cookieconsent\n * Author Orest Bida\n * Released under the MIT License\n */\n!function(){'use strict';var n='initCookieConsent';'undefined'!=typeof window&&'function'!=typeof window[n]&&(window[n]=function(n){var t,o,e,i,r,a,c,u,f,d,v,l,s,p,b,m,y,g,h,_,w,k,x,S,J,O,j,N,T,D,C,U,z,E,I,L={mode:'opt-in',current_lang:'en',auto_language:null,autorun:!0,page_scripts:!0,hide_from_bots:!0,cookie_name:'cc_cookie',cookie_expiration:182,cookie_domain:location.hostname,cookie_path:'/',cookie_same_site:'Lax',use_rfc_cookie:!1,autoclear_cookies:!0,revision:0,script_selector:'data-cookiecategory'},M={},R={},A=null,G=!0,H=!1,P=!1,q=!1,B=!1,F=!0,K=[],Q=!1,V=[],W=[],X=[],Y=!1,Z=[],$=[],nn=[],tn=[],on=[],en=document.documentElement,rn=function(n){'number'==typeof(t=n).cookie_expiration&&(L.cookie_expiration=t.cookie_expiration),'number'==typeof t.cookie_necessary_only_expiration&&(L.cookie_necessary_only_expiration=t.cookie_necessary_only_expiration),'boolean'==typeof t.autorun&&(L.autorun=t.autorun),'string'==typeof t.cookie_domain&&(L.cookie_domain=t.cookie_domain),'string'==typeof t.cookie_same_site&&(L.cookie_same_site=t.cookie_same_site),'string'==typeof t.cookie_path&&(L.cookie_path=t.cookie_path),'string'==typeof t.cookie_name&&(L.cookie_name=t.cookie_name),'function'==typeof t.onAccept&&(v=t.onAccept),'function'==typeof t.onFirstAction&&(s=t.onFirstAction),'function'==typeof t.onChange&&(l=t.onChange),'opt-out'===t.mode&&(L.mode='opt-out'),'number'==typeof t.revision&&(t.revision>-1&&(L.revision=t.revision),B=!0),'boolean'==typeof t.autoclear_cookies&&(L.autoclear_cookies=t.autoclear_cookies),!0===t.use_rfc_cookie&&(L.use_rfc_cookie=!0),'boolean'==typeof t.hide_from_bots&&(L.hide_from_bots=t.hide_from_bots),L.hide_from_bots&&(Y=navigator&&(navigator.userAgent&&/bot|crawl|spider|slurp|teoma/i.test(navigator.userAgent)||navigator.webdriver)),L.page_scripts=!0===t.page_scripts,'browser'===t.auto_language||!0===t.auto_language?L.auto_language='browser':'document'===t.auto_language&&(L.auto_language='document'),L.auto_language,L.current_lang=sn(t.languages,t.current_lang)},an=function(n){for(var t='accept-',o=c('c-settings'),e=c(t+'all'),i=c(t+'necessary'),r=c(t+'custom'),a=0;a0?t.hasOwnProperty(L.current_lang)?L.current_lang:kn(t)[0]:void 0},un=function(n){if(!0===t.force_consent&&xn(en,'force--consent'),!h){h=ln('div');var o=ln('div'),e=ln('div');h.id='cm',o.id='c-inr-i',e.id='cm-ov',h.tabIndex=-1,h.setAttribute('role','dialog'),h.setAttribute('aria-modal','true'),h.setAttribute('aria-hidden','false'),h.setAttribute('aria-labelledby','c-ttl'),h.setAttribute('aria-describedby','c-txt'),g.appendChild(h),g.appendChild(e),h.style.visibility=e.style.visibility='hidden',e.style.opacity=0}var i=t.languages[n].consent_modal.title;i&&(_||((_=ln('h2')).id='c-ttl',o.appendChild(_)),_.innerHTML=i);var r=t.languages[n].consent_modal.description;B&&(r=F?r.replace('{{revision_message}}',''):r.replace('{{revision_message}}',t.languages[n].consent_modal.revision_message||'')),w||((w=ln('div')).id='c-txt',o.appendChild(w)),w.innerHTML=r;var a,c=t.languages[n].consent_modal.primary_btn,u=t.languages[n].consent_modal.secondary_btn;c&&(k||((k=ln('button')).id='c-p-bn',k.className='c-bn',k.appendChild(On(1)),'accept_all'===c.role&&(a='all'),wn(k,'click',(function(){M.hide(),M.accept(a)}))),k.firstElementChild.innerHTML=t.languages[n].consent_modal.primary_btn.text),u&&(x||((x=ln('button')).id='c-s-bn',x.className='c-bn c_link',x.appendChild(On(1)),'accept_necessary'===u.role?wn(x,'click',(function(){M.hide(),M.accept([])})):wn(x,'click',(function(){M.showSettings(0)}))),x.firstElementChild.innerHTML=t.languages[n].consent_modal.secondary_btn.text);var f=t.gui_options;J||((J=ln('div')).id='c-inr',J.appendChild(o)),S||((S=ln('div')).id='c-bns',f&&f.consent_modal&&!0===f.consent_modal.swap_buttons?(u&&S.appendChild(x),c&&S.appendChild(k),S.className='swap'):(c&&S.appendChild(k),u&&S.appendChild(x)),(c||u)&&J.appendChild(S),h.appendChild(J)),H=!0,an(J)},fn=function(n){if(O)(C=ln('div')).id='s-bl';else{(O=ln('div')).tabIndex=-1;var o=ln('div'),e=ln('div'),i=ln('div');j=ln('div'),N=ln('h2');var r=ln('div');(T=ln('button')).appendChild(On(2));var a=ln('div');D=ln('div');var c=ln('div'),u=!1;wn(O,'mouseup',(function(n){!q||u||j.contains(n.target)||M.hideSettings()})),wn(O,'mousedown',(function(n){q&&(u=j.contains(n.target))})),O.id='s-cnt',o.id='c-vln',i.id='c-s-in',e.id='cs',N.id='s-ttl',j.id='s-inr',r.id='s-hdr',D.id='s-bl',T.id='s-c-bn',c.id='cs-ov',a.id='s-c-bnc',T.className='c-bn',O.setAttribute('role','dialog'),O.setAttribute('aria-modal','true'),O.setAttribute('aria-hidden','true'),O.setAttribute('aria-labelledby','s-ttl'),O.style.visibility=c.style.visibility='hidden',c.style.opacity=0,a.appendChild(T),wn(document,'keydown',(function(n){27===n.keyCode&&q&&M.hideSettings()}),!0),wn(T,'click',(function(){M.hideSettings()}))}var v=t.languages[n].settings_modal;T.setAttribute('aria-label',v.close_btn_label||'Close'),d=v.blocks,f=v.cookie_table_headers;var l=v.cookie_table_caption,s=d.length;N.innerHTML=v.title;for(var p=0;p-1?(P.checked=!0,!C&&nn.push(!0)):!C&&nn.push(!1),!C&&tn.push(V),y.readonly&&(P.disabled=!0,xn(B,'c-ro'),!C&&on.push(V)),xn(x,'b-acc'),xn(J,'b-bn'),xn(k,'b-ex'),x.id=L,x.setAttribute('aria-hidden','true'),H.appendChild(P),H.appendChild(B),H.appendChild(F),J.appendChild(H),w&&function(n,t,o){wn(A,'click',(function(){Jn(t,'act')?(Sn(t,'act'),o.setAttribute('aria-expanded','false'),n.setAttribute('aria-hidden','true')):(xn(t,'act'),o.setAttribute('aria-expanded','true'),n.setAttribute('aria-hidden','false'))}),!1)}(x,k,A)}else if(b){var W=ln('div');W.className='b-tl',W.setAttribute('role','heading'),W.setAttribute('aria-level','3'),W.insertAdjacentHTML('beforeend',b),J.appendChild(W)}if(b&&k.appendChild(J),m&&x.appendChild(S),!_&&void 0!==h){for(var Y=document.createDocumentFragment(),Z=0;Z-1;if(!nn[++o]&&c.hasOwnProperty('cookie_table')&&(n||u)){var v=c.cookie_table,l=kn(f[0])[0],s=v.length;'on_disable'===c.toggle.reload&&u&&(Q=!0);for(var p=0;p-1&&y.push(e[x])}y.length>0&&(_n(y,w,b),'on_clear'===c.toggle.reload&&(Q=!0))}}}}},vn=function(n,t){return n.indexOf(t)},ln=function(n){var t=document.createElement(n);return'button'===n&&t.setAttribute('type',n),t},sn=function(n,t){return'browser'===L.auto_language?cn(pn(),n):'document'===L.auto_language?cn(document.documentElement.lang,n):'string'==typeof t?L.current_lang=cn(t,n):(L.current_lang,L.current_lang)},pn=function(){var n=navigator.language||navigator.browserLanguage;return n.length>2&&(n=n[0]+n[1]),n.toLowerCase()};M.allowedCategory=function(n){if(G&&'opt-in'!==L.mode)t=X;else var t=JSON.parse(hn(L.cookie_name,'one',!0)||'{}').categories||[];return vn(t,n)>-1},M.run=function(t){if(!document.getElementById('cc_div')){if(rn(t),Y)return;R=JSON.parse(hn(L.cookie_name,'one',!0)||'{}');var c=void 0!==(i=R.consent_uuid);if((o=R.consent_date)&&(o=new Date(o)),(e=R.last_consent_update)&&(e=new Date(e)),A=void 0!==R.data?R.data:null,B&&R.revision!==L.revision&&(F=!1),H=G=!(c&&F&&o&&e&&i),function(){(y=ln('div')).id='cc--main',y.style.position='fixed',y.innerHTML='
    ',g=y.children[0];var t=L.current_lang;H&&un(t),fn(t),(n||document.body).appendChild(y)}(),function(){var n=['[href]','button','input','details','[tabindex=\"0\"]'];function t(t,o){try{var e=t.querySelectorAll(n.join(':not([tabindex=\"-1\"]), '))}catch(o){return t.querySelectorAll(n.join(', '))}o[0]=e[0],o[1]=e[e.length-1]}t(j,$),H&&t(h,Z)}(),function(n,t){if('object'==typeof n){var o=n.consent_modal,e=n.settings_modal;H&&o&&i(h,['box','bar','cloud'],['top','middle','bottom'],['zoom','slide'],o.layout,o.position,o.transition),e&&i(O,['bar'],['left','right'],['zoom','slide'],e.layout,e.position,e.transition)}function i(n,t,o,e,i,r,a){if(r=r&&r.split(' ')||[],vn(t,i)>-1&&(xn(n,i),('bar'!==i||'middle'!==r[0])&&vn(o,r[0])>-1))for(var c=0;c-1&&xn(n,a)}}(t.gui_options),an(),L.autorun&&H&&M.show(t.delay||0),setTimeout((function(){xn(y,'c--anim')}),30),setTimeout((function(){wn(document,'keydown',(function(n){if('Tab'===n.key&&(P||q)&&r){var t=Tn();n.shiftKey?t!==r[0]&&a.contains(t)||(n.preventDefault(),jn(r[1])):t!==r[1]&&a.contains(t)||(n.preventDefault(),jn(r[0]))}}))}),100),G)'opt-out'===L.mode&&(L.mode,bn());else{var u='boolean'==typeof R.rfc_cookie;(!u||u&&R.rfc_cookie!==L.use_rfc_cookie)&&(R.rfc_cookie=L.use_rfc_cookie,gn(L.cookie_name,JSON.stringify(R))),p=yn(mn()),bn(),'function'==typeof v&&v(R)}}};var bn=function(){if(L.page_scripts){var n=R.categories||[];G&&'opt-out'===L.mode&&(n=X);var t=document.querySelectorAll('script['+L.script_selector+']'),o=function(t,e){if(e-1){i.type=i.getAttribute('data-type')||'text/javascript',i.removeAttribute(L.script_selector);var a=i.getAttribute('data-src');a&&i.removeAttribute('data-src');var c=ln('script');if(c.textContent=i.innerHTML,function(n,t){for(var o=t.attributes,e=o.length,i=0;i0)for(var r=0;r0?n:t?30:0))},M.hide=function(){H&&(P=!1,jn(c),h.setAttribute('aria-hidden','true'),Sn(en,'show--consent'),jn(b),b=null)},M.showSettings=function(n){q=!0,O.removeAttribute('aria-hidden'),P?m=Tn():b=Tn(),a=O,r=$,setTimeout((function(){xn(en,'show--settings')}),n>0?n:0)},M.hideSettings=function(){q=!1,Nn(),jn(u),O.setAttribute('aria-hidden','true'),Sn(en,'show--settings'),P?(jn(m),m=null,a=h,r=Z):(jn(b),b=null)},M.accept=function(n,t){var r=n||void 0,a=t||[],c=[];if(r)if('object'==typeof r&&'number'==typeof r.length)for(var u=0;u=1)for(u=0;u0)for(var r=0;r0&&dn(),o||(o=new Date),i||(i=([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(function(n){try{return(n^(window.crypto||window.msCrypto).getRandomValues(new Uint8Array(1))[0]&15>>n/4).toString(16)}catch(n){return''}}))),R={categories:n,level:n,revision:L.revision,data:A,rfc_cookie:L.use_rfc_cookie,consent_date:o.toISOString(),consent_uuid:i},(G||K.length>0)&&(F=!0,e=e?new Date:o,R.last_consent_update=e.toISOString(),p=yn(mn()),gn(L.cookie_name,JSON.stringify(R)),bn()),G&&(L.autoclear_cookies&&dn(!0),'function'==typeof s&&s(M.getUserPreferences(),R),'function'==typeof v&&v(R),G=!1,'opt-in'===L.mode)||('function'==typeof l&&K.length>0&&l(R,K),Q&&location.reload())}(c)},M.eraseCookies=function(n,t,o){var e=[],i=o?[o,'.'+o]:[L.cookie_domain,'.'+L.cookie_domain];if('object'==typeof n&&n.length>0)for(var r=0;r-1&&L.cookie_domain&&(i+=' Domain='+L.cookie_domain+';'),'https:'===location.protocol&&(i+=' Secure;'),document.cookie=i},hn=function(n,t,o){var e;if('one'===t){if((e=(e=document.cookie.match('(^|;)\\\\s*'+n+'\\\\s*=\\\\s*([^;]+)'))?o?e.pop():n:'')&&n===L.cookie_name){try{e=JSON.parse(e)}catch(n){try{e=JSON.parse(decodeURIComponent(e))}catch(n){e={}}}e=JSON.stringify(e)}}else if('all'===t){var i=document.cookie.split(/;\\s*/);e=[];for(var r=0;rArchaeology in Context of the compiled data.

    Digital access to full reports with scanned images, measurements and diagrams, rather than the basic metadata and summary description, is becoming increasingly realistic.

    -

    Is this something you or your organization already, or would like to, record? Is this an area for FISH to explore?

    Current partners

    UP
    +

    Is this something you or your organization already, or would like to, record? Is this an area for FISH to explore?

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/fish-heirnet/index.html b/fish-heirnet/index.html index fcf6fed..6af2db5 100644 --- a/fish-heirnet/index.html +++ b/fish-heirnet/index.html @@ -142,10 +142,10 @@

    Events

    TACOS 2014

    Past events include the TACOS seminar held in May 2014. TACOS stands for Towards a Collaborative Strategy for sector information management and was set up to aid and promote a forward plan to develop a common research agenda and strategy for UK historic environment information management in the future.

    Partnerships included FISH, the Historic Environment Information Resources Network (HEIRNET) and various heritage sector working groups such as the Chartered Institute for Archaeologists Information Management Special Interest Group (IMSIG).

    -

    For more information about the strategy, download the full TACOS report here, produced by Council for British Archaeology (CBA) in December 2014.

    Current partners

    UP
    +

    For more information about the strategy, download the full TACOS report here, produced by Council for British Archaeology (CBA) in December 2014.

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/fish-vocabularies/index.html b/fish-vocabularies/index.html index 0db9e4a..d5a3ac6 100644 --- a/fish-vocabularies/index.html +++ b/fish-vocabularies/index.html @@ -313,10 +313,10 @@

    Thesaurus Table Structure

    Table structure

    Thesaurus Updates

    Every time we release a new version of the FISH thesauri, we also include a simple list of the new terms added. The document below contains terms added to Version 27, along with those considered for addition.

    -

    New terms list

    Current partners

    UP
    +

    New terms list

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/heritage-information/index.html b/heritage-information/index.html index 94b91ab..77a6113 100644 --- a/heritage-information/index.html +++ b/heritage-information/index.html @@ -54,10 +54,10 @@

    Northern Ireland

    Isle of Man

    • iMuseum: Online database for museum collections, photographs and archive material, information about people, and over 800 records on sites and monuments of the island. Manx National Heritage
    • -

    Current partners

    UP
    +
    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/index.html b/index.html index 7165ba6..2a7640c 100644 --- a/index.html +++ b/index.html @@ -23,10 +23,10 @@

    FISH was established in 1998 as a non for profit organisation. We are a formally convened group with terms of reference and a national profile. FISH is not a legal entity and we have no employed staff, income or budget. There are currently over 400 members.

    Latest news and events

    FISH Thesauri Version 27 Released

    July 02, 2024

    Candidate terms (terminology suggestions) are submitted to FISH all year round. Terms are processed and usually added to the FISH thesauri…

    CAA 2020 Conference – 14th to 17th April 2020, Oxford

    January 21, 2020

    The 48th International Computer Applications and Quantitative Methods in Archaeology conference. For more details please visit: https://202…

    Digital Past 2020 - New technologies in heritage, interpretation and outreach 12th & 13th February 2020, Aberystwyth

    January 21, 2020

    Digital Past is an annual two day conference organised by the Royal Commission on the Ancient and Historical Monuments of -Wales. It…

    Current partners

    UP
    +Wales. It…

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/midas-heritage/index.html b/midas-heritage/index.html index ad2d994..34b994e 100644 --- a/midas-heritage/index.html +++ b/midas-heritage/index.html @@ -168,10 +168,10 @@

    Dictionary

    There are some minor discrepancies with the Mandatory/ Optional status for a few individual information units which we are aware of and plan to address in the near future.

    Each unit of information contains a brief description, guidance on usage, whether a field is free text or controlled and should be populated using a terminology list/ authority file, and one or more examples.

    -

    Current partners

    UP
    +
    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/2/index.html b/news/2/index.html index 4fd19f0..eff76c0 100644 --- a/news/2/index.html +++ b/news/2/index.html @@ -30,10 +30,10 @@ high-level principles. It represents…

    A stand in image

    IC3K 2017 (Madeira, 1-3 Nov 2017)

    August 29, 2017 Authors: Digital Standards Unit

    The 9th International Joint Conference on Knowledge Discovery, Knowledge Engineering and Knowledge Management Funchal, Madeira – Portugal (1-3 November, 2017) The conference hosts three separate mini-conferences. The purpose of the IC3K is to bring together researchers, engineers and practitioners on the areas of Knowledge Discovery, Knowledge Engineering and Knowledge Management. IC3K is composed…

    A stand in image

    Workshop: How to Build a Semantic Web database in one morning (London, 29 July 2017)

    June 22, 2017 Authors: Digital Standards Unit

    For anyone attending the Building Cultural Heritage Knowledge Conference on 27-28 July, there is also an opportunity to -attend a free workshop called **'How to build a semantic web database in one morning'. Saturday 29 July 2017, 09:00 – 13:00 BST British Museum, Great Russell Street, London WC1B 3DG Sackler Seminar Rooms, Clore Conference Center This workshop is only open to delegates attending…

    A stand in image

    Taxonomy Boot Camp (London, 17-18 Oct 2017).

    June 19, 2017 Authors: Digital Standards Unit

    Online registration now open for Taxonomy Boot Camp London Olympia, London, 17 - 18 October 2017 Whatever your level of taxonomy expertise – from newbie to seasoned professional – Taxonomy Boot Camp will help you to energise your data, content and information processes, enabling you to embed taxonomies across your websites, content management systems, enterprise search, apps and more. Learn about…

    Current partners

    UP
    +attend a free workshop called **'How to build a semantic web database in one morning'. Saturday 29 July 2017, 09:00 – 13:00 BST British Museum, Great Russell Street, London WC1B 3DG Sackler Seminar Rooms, Clore Conference Center This workshop is only open to delegates attending…

    A stand in image

    Taxonomy Boot Camp (London, 17-18 Oct 2017).

    June 19, 2017 Authors: Digital Standards Unit

    Online registration now open for Taxonomy Boot Camp London Olympia, London, 17 - 18 October 2017 Whatever your level of taxonomy expertise – from newbie to seasoned professional – Taxonomy Boot Camp will help you to energise your data, content and information processes, enabling you to embed taxonomies across your websites, content management systems, enterprise search, apps and more. Learn about…

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/3/index.html b/news/3/index.html index 8856c4c..be7264c 100644 --- a/news/3/index.html +++ b/news/3/index.html @@ -31,10 +31,10 @@ Park, Heritage Documentation Programs (NPS) and APTI Technical Committee for Documentation to host a three day summit on 3D digital documentation for cultural heritage. Date: April 18 - 20, 2017 Location: Old US Mint Museum, New Orleans, Louisiana, USA Cost of the symposium: $29…

    A stand in image

    Arches CIPA 2017 Workshop, Ottawa (27 August)

    February 14, 2017 Authors: Digital Standards Unit

    For anyone interested in attending the next International CIPA Symposium in Ottawa (see earlier post), there will be an Arches Workshop on 27 August, the day before the Symposium starts (28 August). Workshop registration: Arches Heritage Inventory and Management Platform Version 4.0 Workshop -CIPA 2017: Invitation and Registration Arches Project

    A stand in image

    Arches™ 2-Day Workshop, Liverpool (29-30 March)

    February 13, 2017 Authors: Digital Standards Unit

    Introduction to Arches v4 and the new Arches Designer Location: Liverpool John Moores University Attend for one day or two. Free workshop. Day One (Wednesday, March 29): What is Arches? An overview of Arches, including creation/management of data, search and reporting functionality, and geospatial layers Controlled vocabularies; manage satellite/aerial imagery; import and export capabilities Plans…

    Current partners

    UP
    +CIPA 2017: Invitation and Registration Arches Project

    A stand in image

    Arches™ 2-Day Workshop, Liverpool (29-30 March)

    February 13, 2017 Authors: Digital Standards Unit

    Introduction to Arches v4 and the new Arches Designer Location: Liverpool John Moores University Attend for one day or two. Free workshop. Day One (Wednesday, March 29): What is Arches? An overview of Arches, including creation/management of data, search and reporting functionality, and geospatial layers Controlled vocabularies; manage satellite/aerial imagery; import and export capabilities Plans…

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/3d-digital-documentation-summit-new-orleans-18-20-april-2017/index.html b/news/3d-digital-documentation-summit-new-orleans-18-20-april-2017/index.html index 30f9a05..b406474 100644 --- a/news/3d-digital-documentation-summit-new-orleans-18-20-april-2017/index.html +++ b/news/3d-digital-documentation-summit-new-orleans-18-20-april-2017/index.html @@ -26,10 +26,10 @@

    Also, during the first two days, a poster session will be held to highlight new, upcoming, and student research in 3D digital documentation and capture. The Summit’s third day will include hands-on sessions. These sessions will take place at the around New Orleans and be led by various companies and firms who develop and practice 3D digital documentation.

    -

    This Summit will include sessions on topics such as Data Acquisition, Data Management, and Data Applications.

    Current partners

    UP
    +

    This Summit will include sessions on topics such as Data Acquisition, Data Management, and Data Applications.

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/3rd-international-workshop-visions-internet-cultural-things-applications-naples-27-nov-1-dec-2016/index.html b/news/3rd-international-workshop-visions-internet-cultural-things-applications-naples-27-nov-1-dec-2016/index.html index c16a858..51a82f0 100644 --- a/news/3rd-international-workshop-visions-internet-cultural-things-applications-naples-27-nov-1-dec-2016/index.html +++ b/news/3rd-international-workshop-visions-internet-cultural-things-applications-naples-27-nov-1-dec-2016/index.html @@ -33,10 +33,10 @@

    Topics of interest

  • User studies, such as museum and sites applications, human interfaces, interaction and usability
  • e-Learning: Tools for Education, Documentation and Training in Cultural Heritage
  • -

    Call for papers: submission deadline 6 September 2016

    Current partners

    UP
    +

    Call for papers: submission deadline 6 September 2016

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/4/index.html b/news/4/index.html index 44362bb..73fe6ce 100644 --- a/news/4/index.html +++ b/news/4/index.html @@ -31,10 +31,10 @@ and economic impact. The main conference themes…

    A stand in image

    14th EUROGRAPHICS Workshop on Graphics and Cultural Heritage (Genova, 5-7 October)

    August 17, 2016 Authors: Digital Standards Unit

    Genova, Italy, 5-7 October 2016. The 14th EUROGRAPHICS Workshop on Graphics and Cultural Heritage (GCH 2016) aims to foster an international dialogue between ICT experts and CH scientists to have a better understanding of the critical requirements -for processing, managing, and delivering cultural information to a broader audience. The objective of the workshop is to present and showcase new…

    Current partners

    UP
    +for processing, managing, and delivering cultural information to a broader audience. The objective of the workshop is to present and showcase new…

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/5/index.html b/news/5/index.html index 97106c1..7a1ff9a 100644 --- a/news/5/index.html +++ b/news/5/index.html @@ -31,10 +31,10 @@ multilingual vocabularies play in international preservation campaigns. The illustrated glossary…

    A stand in image

    International conference on Cultural Heritage (CH)

    November 26, 2015 Authors: Digital Standards Unit

    International Euro-Mediterranean Conference (EuroMed) - Call for Participation 31 October - 5 November 2016, Lemessos, Cyprus The International Conference on Cultural Heritage (CH) brings together researchers, policy makers, professionals and practitioners to explore some of the more pressing issues concerning cultural heritage today. The main goal of the conference is to focus on…

    A stand in image

    UDC Seminar 2015: Classification & Authority Control

    November 02, 2015 Authors: Digital Standards Unit

    The International UDC Seminar entitled "Classification & Authority Control: Expanding Resource Discovery" will take place in The National Library of Portugal in Lisbon, on 29-30 October 2015. Linked data practices and techniques have opened new possibilities in exploiting controlled vocabularies and improving resource discovery. Authority data held in library systems often includes classification…

    A stand in image

    CAA 2016 conference on use and re-use of archaeological data

    November 02, 2015 Authors: Digital Standards Unit

    The next Computer Applications and Quantitative Methods in Archaeology Conference (CAA 2016 Oslo) will take place 29 March to 2 April 2016 in Oslo, Norway. The focus will be on access, discovery and research reuse of archaeological datasets, and aims to stimulate discussion between researchers and data specialists, and to: Showcase best practices and relevant work supporting access and use of…

    A stand in image

    Historic Environment Scotland merger

    October 27, 2015 Authors: Digital Standards Unit

    Historic Environment Scotland, the new lead public body for the country’s historic -environment, brings together Historic Scotland and the Royal Commission on the Ancient and Historic Monuments of Scotland, and will continue to be a vital member of FISH. More information on the merger can be found here.

    Current partners

    UP
    +environment, brings together Historic Scotland and the Royal Commission on the Ancient and Historic Monuments of Scotland, and will continue to be a vital member of FISH. More information on the merger can be found here.

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/6/index.html b/news/6/index.html index 52bc71e..c78258d 100644 --- a/news/6/index.html +++ b/news/6/index.html @@ -26,10 +26,10 @@ folklore, music, dance). To assist in the…

    A stand in image

    Heritage vocabularies as Linked Open Data

    June 30, 2013 Authors: Digital Standards Unit

    English Heritage, the Royal Commission on the Ancient and Historical Monuments of Scotland, Royal Commission on the Ancient and Historical Monuments of Wales, the Archaeology Data Service and the University of South Wales are pleased to announce that cultural heritage thesauri and vocabularies are now freely available as Linked Open Data as a preliminary outcome of -the SENESCHAL project at: http…

    Current partners

    UP
    +the SENESCHAL project at: http…

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/arches-2-day-workshop-liverpool-29-30-march/index.html b/news/arches-2-day-workshop-liverpool-29-30-march/index.html index a41175b..7d43937 100644 --- a/news/arches-2-day-workshop-liverpool-29-30-march/index.html +++ b/news/arches-2-day-workshop-liverpool-29-30-march/index.html @@ -32,10 +32,10 @@

    Day Two (Thursday, March 30): Installation and Configuration of Arches

  • Permissions/user-profile management, base maps and GIS overlays
  • For more information: http://archesproject.org/liverpool-2017/

    -

    Arches Project Logo

    Current partners

    UP
    +

    Arches Project Logo

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/arches-cipa-2017-workshop-ottawa-27-august/index.html b/news/arches-cipa-2017-workshop-ottawa-27-august/index.html index 1f0af94..fa6a4c9 100644 --- a/news/arches-cipa-2017-workshop-ottawa-27-august/index.html +++ b/news/arches-cipa-2017-workshop-ottawa-27-august/index.html @@ -16,10 +16,10 @@ Arches Workshop on 27 August, the day before the Symposium starts (28 August).

    Workshop registration: Arches Heritage Inventory and Management Platform Version 4.0 Workshop CIPA 2017: Invitation and Registration

    -

    Arches Project

    Current partners

    UP
    +

    Arches Project

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/arches-open-source-heritage-management-software-project/index.html b/news/arches-open-source-heritage-management-software-project/index.html index 93ae34a..acb03ac 100644 --- a/news/arches-open-source-heritage-management-software-project/index.html +++ b/news/arches-open-source-heritage-management-software-project/index.html @@ -21,10 +21,10 @@ to promote the understanding, appreciation, and enjoyment of these cities and their histories.

    For more information, see the Getty Conservation Institute's press release

    from November 16, 2016:

    -

    http://news.getty.edu/press-materials/press-releases/getty-conservation-institute-historic-england-city-of-lincoln.htm

    Current partners

    UP
    +

    http://news.getty.edu/press-materials/press-releases/getty-conservation-institute-historic-england-city-of-lincoln.htm

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/building-cultural-heritage-knowledge-british-museum-27-28-july-2017/index.html b/news/building-cultural-heritage-knowledge-british-museum-27-28-july-2017/index.html index 277b1d7..40553c8 100644 --- a/news/building-cultural-heritage-knowledge-british-museum-27-28-july-2017/index.html +++ b/news/building-cultural-heritage-knowledge-british-museum-27-28-july-2017/index.html @@ -27,10 +27,10 @@

    A number of bursaries are available. The event is advertised with details on EventBrite at https://www.eventbrite.co.uk/e/building-cultural-heritage-knowledge-tickets-33012703886 and will be updated regularly.

    -

    The British Museum/ResearchSpace symposium is funded by the Andrew W Mellon Foundation.

    Current partners

    UP
    +

    The British Museum/ResearchSpace symposium is funded by the Andrew W Mellon Foundation.

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/caa-2016-conference-on-use-and-re-use-of-archaeological-data/index.html b/news/caa-2016-conference-on-use-and-re-use-of-archaeological-data/index.html index 0d16529..f03e2ea 100644 --- a/news/caa-2016-conference-on-use-and-re-use-of-archaeological-data/index.html +++ b/news/caa-2016-conference-on-use-and-re-use-of-archaeological-data/index.html @@ -93,10 +93,10 @@
    CAA-2016-Logo conference
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/caa-2020-conference-14th-to-17th-april-2020-oxford/index.html b/news/caa-2020-conference-14th-to-17th-april-2020-oxford/index.html index d5c3571..765f73f 100644 --- a/news/caa-2020-conference-14th-to-17th-april-2020-oxford/index.html +++ b/news/caa-2020-conference-14th-to-17th-april-2020-oxford/index.html @@ -13,10 +13,10 @@ gtag('config', 'GTAG-5X2QZ4H', {"send_page_view":false}); } CAA 2020 Conference – 14th to 17th April 2020, Oxford

    CAA 2020 Conference – 14th to 17th April 2020, Oxford

    Published: January 21, 2020 Updated: October 20, 2023

    The 48th International Computer Applications and Quantitative Methods in Archaeology conference. For more details please -visit: https://2020.caaconference.org/

    Current partners

    UP
    +visit: https://2020.caaconference.org/

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/caa-conference-19-23-march-2018-tubingen-germany/index.html b/news/caa-conference-19-23-march-2018-tubingen-germany/index.html index 091457f..32802e9 100644 --- a/news/caa-conference-19-23-march-2018-tubingen-germany/index.html +++ b/news/caa-conference-19-23-march-2018-tubingen-germany/index.html @@ -62,10 +62,10 @@
    CAA - Computer Applications and Quantitive Methods in Archaeology
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/chnt22-urban-archaeology-integration-vienna-8-10-nov-2017/index.html b/news/chnt22-urban-archaeology-integration-vienna-8-10-nov-2017/index.html index 62a2b38..3b61354 100644 --- a/news/chnt22-urban-archaeology-integration-vienna-8-10-nov-2017/index.html +++ b/news/chnt22-urban-archaeology-integration-vienna-8-10-nov-2017/index.html @@ -58,10 +58,10 @@
    DCH 2015 Wordle diagram
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/cidoc-conference-2018-call-papers/index.html b/news/cidoc-conference-2018-call-papers/index.html index 15a25b1..80285d5 100644 --- a/news/cidoc-conference-2018-call-papers/index.html +++ b/news/cidoc-conference-2018-call-papers/index.html @@ -27,10 +27,10 @@

    Conference theme

    makes it difficult to introduce standards and processes to model and maintain the development and validity of documented information.

    The 2018 CIDOC conference aims at supporting museums by deepening the understanding of documentation as a means of knowledge -preservation, dissemination and exchange.

    Current partners

    UP
    +preservation, dissemination and exchange.

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/cifa-archive-archaeological-standards-guidance-online-discussion-10-11-may-2017/index.html b/news/cifa-archive-archaeological-standards-guidance-online-discussion-10-11-may-2017/index.html index 6964c58..9505b94 100644 --- a/news/cifa-archive-archaeological-standards-guidance-online-discussion-10-11-may-2017/index.html +++ b/news/cifa-archive-archaeological-standards-guidance-online-discussion-10-11-may-2017/index.html @@ -90,10 +90,10 @@
    Historic England Logo
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/classification-authority-control-expanding-resource-discovery/index.html b/news/classification-authority-control-expanding-resource-discovery/index.html index d6f4d10..5a7b6c5 100644 --- a/news/classification-authority-control-expanding-resource-discovery/index.html +++ b/news/classification-authority-control-expanding-resource-discovery/index.html @@ -87,10 +87,10 @@
    udcseminars logo
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/conference-cultural-heritage-new-technologies-vienna-8-10-nov-2017/index.html b/news/conference-cultural-heritage-new-technologies-vienna-8-10-nov-2017/index.html index 9dedb3a..9ac9a92 100644 --- a/news/conference-cultural-heritage-new-technologies-vienna-8-10-nov-2017/index.html +++ b/news/conference-cultural-heritage-new-technologies-vienna-8-10-nov-2017/index.html @@ -27,10 +27,10 @@

    Topics cover

  • Historical data as a basis for checking or validating digital tools applied in archaeology and vice versa.
  • Dealing with inscriptions (including cuneiform, hieroglyphs and symbols): digital methods for enhancing readability (e.g. Reflectance Transformation Imaging), pattern recognition of letters or pictograms, comparison of hand writing (same author?).
  • Statistical analysis investigating the correlation between historical place names and archaeological evidence.
  • -

    Current partners

    UP
    +
    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/conference-digital-preservation-historic-environment-april-2017/index.html b/news/conference-digital-preservation-historic-environment-april-2017/index.html index 47eda9c..3422235 100644 --- a/news/conference-digital-preservation-historic-environment-april-2017/index.html +++ b/news/conference-digital-preservation-historic-environment-april-2017/index.html @@ -50,10 +50,10 @@
    CIfA logo
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/conference-eac-symposium-2019-28-feb-2-mar-2019-dublin/index.html b/news/conference-eac-symposium-2019-28-feb-2-mar-2019-dublin/index.html index d8a0bfb..d8c8ed0 100644 --- a/news/conference-eac-symposium-2019-28-feb-2-mar-2019-dublin/index.html +++ b/news/conference-eac-symposium-2019-28-feb-2-mar-2019-dublin/index.html @@ -49,10 +49,10 @@ style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" /> -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/conference-metadata-semantics-research-tallinn-28-nov-1-dec-2017/index.html b/news/conference-metadata-semantics-research-tallinn-28-nov-1-dec-2017/index.html index 3fbf4b3..393de13 100644 --- a/news/conference-metadata-semantics-research-tallinn-28-nov-1-dec-2017/index.html +++ b/news/conference-metadata-semantics-research-tallinn-28-nov-1-dec-2017/index.html @@ -24,10 +24,10 @@

    Topics

  • Linked data applications for e-books, digital publishing and Content Management Systems (CMSs);
  • Content discovery services, search, information retrieval and data visualization applications.
  • -

    Proceedings will be published by Springer in Vol. 755 of the Communications in Computer and Information Science (CCIS) book series. CCIS is abstracted/indexed in Scopus, SCImago, EI-Compendex, Mathematical Reviews, DBLP, Google Scholar. Click here for more information about the programme, registration and venue.

    Current partners

    UP
    +

    Proceedings will be published by Springer in Vol. 755 of the Communications in Computer and Information Science (CCIS) book series. CCIS is abstracted/indexed in Scopus, SCImago, EI-Compendex, Mathematical Reviews, DBLP, Google Scholar. Click here for more information about the programme, registration and venue.

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/conference-spatial-humanities-2018-lancaster-20-21-sept-2018/index.html b/news/conference-spatial-humanities-2018-lancaster-20-21-sept-2018/index.html index b44ba90..89d2514 100644 --- a/news/conference-spatial-humanities-2018-lancaster-20-21-sept-2018/index.html +++ b/news/conference-spatial-humanities-2018-lancaster-20-21-sept-2018/index.html @@ -33,10 +33,10 @@

    Keynote speakers

  • Prof. David Bodenhamer, The Polis Center, Indiana Purdue University, Indianapolis
  • Dr. Janelle Jenstad, Department of English, University of Victoria.
  • -

    Cost: Full registration (including teas & coffees and lunch on both days) will cost £195. LANCASTER UNIVERSITY DIGITAL HUMANITIES HUB

    Current partners

    UP
    +

    Cost: Full registration (including teas & coffees and lunch on both days) will cost £195. LANCASTER UNIVERSITY DIGITAL HUMANITIES HUB

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/conference-the-25th-annual-meeting-of-the-european-archaeological-association-bern-4-7-september-2019/index.html b/news/conference-the-25th-annual-meeting-of-the-european-archaeological-association-bern-4-7-september-2019/index.html index ddf6de0..afa10cc 100644 --- a/news/conference-the-25th-annual-meeting-of-the-european-archaeological-association-bern-4-7-september-2019/index.html +++ b/news/conference-the-25th-annual-meeting-of-the-european-archaeological-association-bern-4-7-september-2019/index.html @@ -64,10 +64,10 @@

    Themes

    style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" /> -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/council-british-archaeology-post-referendum-archaeology-1-aug-2016/index.html b/news/council-british-archaeology-post-referendum-archaeology-1-aug-2016/index.html index 06d684c..d083652 100644 --- a/news/council-british-archaeology-post-referendum-archaeology-1-aug-2016/index.html +++ b/news/council-british-archaeology-post-referendum-archaeology-1-aug-2016/index.html @@ -52,10 +52,10 @@
    CBA logo 2
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/creating-data-management-plans-workshop-london-29-nov-2017/index.html b/news/creating-data-management-plans-workshop-london-29-nov-2017/index.html index f4f4636..991025d 100644 --- a/news/creating-data-management-plans-workshop-london-29-nov-2017/index.html +++ b/news/creating-data-management-plans-workshop-london-29-nov-2017/index.html @@ -107,10 +107,10 @@

    Data Management - a Life Cycle Approach

    CIFA Logo
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/cultural-heritage-reuse-remake-reimagine-berlin-21-22-nov-2016/index.html b/news/cultural-heritage-reuse-remake-reimagine-berlin-21-22-nov-2016/index.html index c7811e3..1fe8c92 100644 --- a/news/cultural-heritage-reuse-remake-reimagine-berlin-21-22-nov-2016/index.html +++ b/news/cultural-heritage-reuse-remake-reimagine-berlin-21-22-nov-2016/index.html @@ -98,10 +98,10 @@
    espace conference logo 2016
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/dcdc2016-conference-collections-connections-collaborations-potential-impact/index.html b/news/dcdc2016-conference-collections-connections-collaborations-potential-impact/index.html index d25499d..917dce3 100644 --- a/news/dcdc2016-conference-collections-connections-collaborations-potential-impact/index.html +++ b/news/dcdc2016-conference-collections-connections-collaborations-potential-impact/index.html @@ -63,10 +63,10 @@
    DCDC-web-header
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/digital-heritage-events-fablab-nerve-centre-derry-11-12-oct/index.html b/news/digital-heritage-events-fablab-nerve-centre-derry-11-12-oct/index.html index 8f6207c..45e1810 100644 --- a/news/digital-heritage-events-fablab-nerve-centre-derry-11-12-oct/index.html +++ b/news/digital-heritage-events-fablab-nerve-centre-derry-11-12-oct/index.html @@ -62,10 +62,10 @@

    Programme

    CARARE_Derry logo
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/digital-past-2020-new-technologies-in-heritage-interpretation-and-outreach-12-13-february-2020-aberystwyth/index.html b/news/digital-past-2020-new-technologies-in-heritage-interpretation-and-outreach-12-13-february-2020-aberystwyth/index.html index 5da8888..b840aed 100644 --- a/news/digital-past-2020-new-technologies-in-heritage-interpretation-and-outreach-12-13-february-2020-aberystwyth/index.html +++ b/news/digital-past-2020-new-technologies-in-heritage-interpretation-and-outreach-12-13-february-2020-aberystwyth/index.html @@ -15,10 +15,10 @@ Digital Past 2020 - New technologies in heritage, interpretation and outreach 12th & 13th February 2020, Aberystwyth

    Digital Past 2020 - New technologies in heritage, interpretation and outreach 12th & 13th February 2020, Aberystwyth

    Published: January 21, 2020 Updated: October 20, 2023

    Digital Past is an annual two day conference organised by the Royal Commission on the Ancient and Historical Monuments of Wales. It showcases innovative digital technologies and techniques for data capture, interpretation and dissemination of the heritage of Wales, the UK and beyond. For more information on the event, speakers and registration visit: -https://rcahmw.gov.uk/about-us/digital-past-conference/

    Current partners

    UP
    +https://rcahmw.gov.uk/about-us/digital-past-conference/

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/eaa-conference-call-for-papers-closes-14-february-2019/index.html b/news/eaa-conference-call-for-papers-closes-14-february-2019/index.html index e19e3aa..9b74cca 100644 --- a/news/eaa-conference-call-for-papers-closes-14-february-2019/index.html +++ b/news/eaa-conference-call-for-papers-closes-14-february-2019/index.html @@ -78,10 +78,10 @@

    Session 144 Towards a Spatial Data Infrastructure for Archaeology

    EAA Banner logo, showing details of the event
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/english-heritage-splits-into-two/index.html b/news/english-heritage-splits-into-two/index.html index 53d6f6f..6f1a238 100644 --- a/news/english-heritage-splits-into-two/index.html +++ b/news/english-heritage-splits-into-two/index.html @@ -19,10 +19,10 @@ and collections.

    Historic England will remain a Government service offering expert advice on heritage and carry on working with FISH on standards -and terminology developments.

    Current partners

    UP
    +and terminology developments.

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/fish-heirnet-meeting-29th-november-2016/index.html b/news/fish-heirnet-meeting-29th-november-2016/index.html index b9e8578..44ea636 100644 --- a/news/fish-heirnet-meeting-29th-november-2016/index.html +++ b/news/fish-heirnet-meeting-29th-november-2016/index.html @@ -25,10 +25,10 @@
  • OASIS redevelopment and ADS Library
  • Moving on from OASIS – creating knowledge from information – developing a digital platform for English Research Frameworks
  • ScARF: Scottish archaeology as a regional jigsaw – creating localised frameworks
  • -

    Current partners

    UP
    +
    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/fish-heirnet-next-meeting-9-june-2017/index.html b/news/fish-heirnet-next-meeting-9-june-2017/index.html index 98916e3..a558828 100644 --- a/news/fish-heirnet-next-meeting-9-june-2017/index.html +++ b/news/fish-heirnet-next-meeting-9-june-2017/index.html @@ -67,10 +67,10 @@ a number of survey reports.

    This then informed the design of a mock up of a new OASIS system to test potential changes in workflows and content gathered. The comments received from the community on the -mock up and the survey reports went on to produce the recommendations for a new system in the final report.

    Current partners

    UP
    +mock up and the survey reports went on to produce the recommendations for a new system in the final report.

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/fish-session-at-2018-caa-uk-conference-videos-now-online/index.html b/news/fish-session-at-2018-caa-uk-conference-videos-now-online/index.html index 3601ebb..619084f 100644 --- a/news/fish-session-at-2018-caa-uk-conference-videos-now-online/index.html +++ b/news/fish-session-at-2018-caa-uk-conference-videos-now-online/index.html @@ -31,10 +31,10 @@

    FISH session - Making the Links: Practical Applications of Data StandardsSpatial data standards matter too – Peter McKeague
  • Building a digital platform for research frameworks – Dan Miles
  • Doug Rocks-Macqueen Changing the game – managing data with the Arches platform – Phil Carlisle
  • -

    Current partners

    UP
    +
    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/fish-thesauri-27/index.html b/news/fish-thesauri-27/index.html index 7878f11..51a9bde 100644 --- a/news/fish-thesauri-27/index.html +++ b/news/fish-thesauri-27/index.html @@ -31,10 +31,10 @@

    New terms list

    Click here to view all the FISH thesauri.

    If you have any questions regarding the FISH thesauri or have candidate terms to submit please contact us at -terminologies@HistoricEngland.org.uk.

    Current partners

    UP
    +terminologies@HistoricEngland.org.uk.

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/fish-thesauri-updated-version-18-2/index.html b/news/fish-thesauri-updated-version-18-2/index.html index 2ef5704..fcb7a1f 100644 --- a/news/fish-thesauri-updated-version-18-2/index.html +++ b/news/fish-thesauri-updated-version-18-2/index.html @@ -20,10 +20,10 @@ PDF and LOD formats.

    Click here to view the latest versions of the FISH thesauri. Please get in touch if you have any questions -regarding the FISH thesauri or candidate terms. Version 19 released 10 Oct 2016

    Current partners

    UP
    +regarding the FISH thesauri or candidate terms. Version 19 released 10 Oct 2016

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/fish-thesauri-updated-version-18/index.html b/news/fish-thesauri-updated-version-18/index.html index 807fad1..87aa509 100644 --- a/news/fish-thesauri-updated-version-18/index.html +++ b/news/fish-thesauri-updated-version-18/index.html @@ -18,10 +18,10 @@

    Every six months or so the main thesauri are updated and uploaded to this website, where you can browse for a specific term, and Heritage Data, a related website, where you can download key thesauri as CSV, -PDF and LOD formats.

    Current partners

    UP
    +PDF and LOD formats.

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/fish-thesauri-updated-version-20-march-2017/index.html b/news/fish-thesauri-updated-version-20-march-2017/index.html index 0352b4a..42e98fd 100644 --- a/news/fish-thesauri-updated-version-20-march-2017/index.html +++ b/news/fish-thesauri-updated-version-20-march-2017/index.html @@ -17,10 +17,10 @@ round. Terms are processed and usually added to the FISH thesauri and authority files as and when they come in.

    Once a year the main thesauri are updated and uploaded to this website, where you can browse for a specific term, and Heritage Data, a related website, where you can download key thesauri as CSV, PDF and LOD -formats. Please get in touch if you have any questions regarding the FISH thesauri or candidate terms.

    Current partners

    UP
    +formats. Please get in touch if you have any questions regarding the FISH thesauri or candidate terms.

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/fish-website-change-1-july-2016/index.html b/news/fish-website-change-1-july-2016/index.html index 1a73068..072ad2e 100644 --- a/news/fish-website-change-1-july-2016/index.html +++ b/news/fish-website-change-1-july-2016/index.html @@ -18,10 +18,10 @@

    We have changed the URL so please update your bookmark!

    Please share and contribute content. Help us improve the website by keeping it relevant and current. Let us know of any developments within heritage data standards and terminology management that you or your organization is working on.

    We look forward to hearing from you.

    -

    FISH

    Current partners

    UP
    +

    FISH

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/heritage-vocabularies-as-linked-open-data/index.html b/news/heritage-vocabularies-as-linked-open-data/index.html index 9361cc8..3279024 100644 --- a/news/heritage-vocabularies-as-linked-open-data/index.html +++ b/news/heritage-vocabularies-as-linked-open-data/index.html @@ -50,10 +50,10 @@
    SENESCHAL Logo
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/historic-england-new-advice-and-guidance-documents-issued-dec-2018/index.html b/news/historic-england-new-advice-and-guidance-documents-issued-dec-2018/index.html index 16a0ab4..620eeaa 100644 --- a/news/historic-england-new-advice-and-guidance-documents-issued-dec-2018/index.html +++ b/news/historic-england-new-advice-and-guidance-documents-issued-dec-2018/index.html @@ -53,10 +53,10 @@
    Historic England's logo
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/historic-environment-scotland-merger/index.html b/news/historic-environment-scotland-merger/index.html index 14bf29d..b5c5d90 100644 --- a/news/historic-environment-scotland-merger/index.html +++ b/news/historic-environment-scotland-merger/index.html @@ -49,10 +49,10 @@
    Historic Environment Scotland logo
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/ic3k-2017-funchal-madeira-1-3-nov-2017/index.html b/news/ic3k-2017-funchal-madeira-1-3-nov-2017/index.html index 3e3576e..1ae5bf5 100644 --- a/news/ic3k-2017-funchal-madeira-1-3-nov-2017/index.html +++ b/news/ic3k-2017-funchal-madeira-1-3-nov-2017/index.html @@ -34,10 +34,10 @@

    Program Co-chairs

    For more information about this conference, go to: http://www.ic3k.org/

    What is KEOD?

    Knowledge Engineering (KE) refers to all technical, scientific and social aspects involved in building, maintaining and using knowledge-based systems. KE is a multidisciplinary field, bringing in concepts and methods from several computer science domains such as artificial intelligence, databases, expert systems, decision support systems and geographic information systems.

    -

    Ontology Development (OD) aims at building reusable semantic structures that can be informal vocabularies, catalogs, glossaries as well as more complex finite formal structures representing the entities within a domain and the relationships between those entities. Ontologies, have been gaining interest and acceptance in computational audiences: formal ontologies are a form of software, thus software development methodologies can be adapted to serve ontology development. A wide range of applications is emerging, especially given the current web emphasis, including library science, ontology-enhanced search, e-commerce and business process design.

    Current partners

    UP
    +

    Ontology Development (OD) aims at building reusable semantic structures that can be informal vocabularies, catalogs, glossaries as well as more complex finite formal structures representing the entities within a domain and the relationships between those entities. Ontologies, have been gaining interest and acceptance in computational audiences: formal ontologies are a form of software, thus software development methodologies can be adapted to serve ontology development. A wide range of applications is emerging, especially given the current web emphasis, including library science, ontology-enhanced search, e-commerce and business process design.

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/index.html b/news/index.html index 2eb2db0..038f226 100644 --- a/news/index.html +++ b/news/index.html @@ -30,10 +30,10 @@ pdfs and a list of recently archived advice. Examples of guidance documents include five reissued archaeological science guidance documents and some short instructional video clips.

    A stand in image

    Publication: Historic England - Latest Advice and Guidance Catalogue (April 2017)

    March 13, 2018 Authors: Digital Standards Unit

    Historic England recently published (April 2018) a catalogue of their latest advice and guidance material covering a range of subjects areas. Examples include: Caring for Heritage Heritage crime Post-war public art Planning Environmental assessment Local listing Historic area assessments Technical - Archaeological Science Land contamination Organic residue Preserving archaeological remains…

    A stand in image

    Conference: Spatial Humanities 2018 (Lancaster, 20-21 Sept 2018)

    February 16, 2018 Authors: Digital Standards Unit

    Spatial Humanities 2018 - Call for Papers Where: Lancaster University, Lancaster, UK When: 20-21 September 2018 Deadline for Abstracts - 28th February 2018 Lancaster’s Digital Humanities Hub is hosting a Spatial Humanities 2018 conference in September 2018. The conference will explore what geospatial technologies such as Geographical Information Systems (GIS) have to contribute to humanities…

    A stand in image

    CIDOC Conference 2018 - Call for Papers

    January 25, 2018 Authors: Digital Standards Unit

    Call for Papers for the next ICOM-CIDOC Conference entitled The Provenance of Knowledge. Where and when: Heraklion, Crete, 29 September - 4 October 2018. Deadline for conference proposals (presentations, workshops and case studies): 28 February. Conference theme As an essential aspect of documentation, Provenance of Knowledge refers to the attempt to trace the origins of the -information and…

    Current partners

    UP
    +information and…

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/information-sharing/index.html b/news/information-sharing/index.html index 6369ef2..5b888eb 100644 --- a/news/information-sharing/index.html +++ b/news/information-sharing/index.html @@ -21,10 +21,10 @@
  • Historic Information Access Strategy (HIAS) (create a single, logical, digital and shared national heritage record for England)
  • SHED Strategy (Scotland's Historic Environment Data (SHED) Strategy)
  • Heritage2020 Framework - England (a collaborative effort delivered by the Historic Environment Forum (HEF))
  • -

    Current partners

    UP
    +
    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/international-conference-cultural-heritage-new-technologies-vienna-16-18-nov/index.html b/news/international-conference-cultural-heritage-new-technologies-vienna-16-18-nov/index.html index 59eb984..3cb935e 100644 --- a/news/international-conference-cultural-heritage-new-technologies-vienna-16-18-nov/index.html +++ b/news/international-conference-cultural-heritage-new-technologies-vienna-16-18-nov/index.html @@ -104,10 +104,10 @@

    Round Table

    conference logo vienna CHNT 21 2016
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/international-conference-dublin-core-metadata-applications/index.html b/news/international-conference-dublin-core-metadata-applications/index.html index aeb8008..e46a631 100644 --- a/news/international-conference-dublin-core-metadata-applications/index.html +++ b/news/international-conference-dublin-core-metadata-applications/index.html @@ -123,10 +123,10 @@

    Topics

    GCH-banner-2016-1024x193
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/international-conference-terminology-and-knowledge-organization-in-preserving-digital-memories/index.html b/news/international-conference-terminology-and-knowledge-organization-in-preserving-digital-memories/index.html index 2abf478..97d1df7 100644 --- a/news/international-conference-terminology-and-knowledge-organization-in-preserving-digital-memories/index.html +++ b/news/international-conference-terminology-and-knowledge-organization-in-preserving-digital-memories/index.html @@ -96,10 +96,10 @@
    Calabria conference banner
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/international-udc-seminar-london-14-15-sept-2017/index.html b/news/international-udc-seminar-london-14-15-sept-2017/index.html index 93a47ee..7b48dfd 100644 --- a/news/international-udc-seminar-london-14-15-sept-2017/index.html +++ b/news/international-udc-seminar-london-14-15-sept-2017/index.html @@ -110,10 +110,10 @@
    International UDC Seminar 2017 banner image
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/irms-conference-21-23-may-2017-glasgow/index.html b/news/irms-conference-21-23-may-2017-glasgow/index.html index 0500815..8521d40 100644 --- a/news/irms-conference-21-23-may-2017-glasgow/index.html +++ b/news/irms-conference-21-23-may-2017-glasgow/index.html @@ -37,10 +37,10 @@

    Key Features

  • Comprehensive exhibition
  • Peer-to-peer networking
  • Fully inclusive conference and hotel packages
  • -

    Current partners

    UP
    +
    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/isko-uk-conference-knowledge-organisation-london-11-12-sept-2017/index.html b/news/isko-uk-conference-knowledge-organisation-london-11-12-sept-2017/index.html index d14dfed..0a3b268 100644 --- a/news/isko-uk-conference-knowledge-organisation-london-11-12-sept-2017/index.html +++ b/news/isko-uk-conference-knowledge-organisation-london-11-12-sept-2017/index.html @@ -103,10 +103,10 @@
    Canada Water Library
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/midas-heritage-and-qatar-her/index.html b/news/midas-heritage-and-qatar-her/index.html index 73fb534..f22ba3b 100644 --- a/news/midas-heritage-and-qatar-her/index.html +++ b/news/midas-heritage-and-qatar-her/index.html @@ -107,10 +107,10 @@
    MIDAS_Heritage_logo
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/new-consultation-on-lithic-artefact-terminologies/index.html b/news/new-consultation-on-lithic-artefact-terminologies/index.html index 91f9cb9..a9923c1 100644 --- a/news/new-consultation-on-lithic-artefact-terminologies/index.html +++ b/news/new-consultation-on-lithic-artefact-terminologies/index.html @@ -20,10 +20,10 @@

    Lithic terminologies were also one of the areas that were discussed in the FISH E-Conference a few years ago. This consultation is being conducted through the lithic and prehistory specialist societies and is aimed at lithic specialists across the sector – freelance, in house unit, academic, museum etc. The consultation is due to end on November 30th.

    -

    Current partners

    UP
    +
    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/new-framework-uk-data-protection-london-18-may-2017/index.html b/news/new-framework-uk-data-protection-london-18-may-2017/index.html index 17a4b92..eccbb41 100644 --- a/news/new-framework-uk-data-protection-london-18-may-2017/index.html +++ b/news/new-framework-uk-data-protection-london-18-may-2017/index.html @@ -65,10 +65,10 @@

    Key issues for discussion:

    style="width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;" /> -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/new-standard-pottery-studies-archaeology-2016/index.html b/news/new-standard-pottery-studies-archaeology-2016/index.html index f338066..b6b04dc 100644 --- a/news/new-standard-pottery-studies-archaeology-2016/index.html +++ b/news/new-standard-pottery-studies-archaeology-2016/index.html @@ -56,10 +56,10 @@
    A standard for pottery studies in archaeology front cover
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/new-welsh-archaeological-archives-standard-2017/index.html b/news/new-welsh-archaeological-archives-standard-2017/index.html index 71e80d6..8aa762c 100644 --- a/news/new-welsh-archaeological-archives-standard-2017/index.html +++ b/news/new-welsh-archaeological-archives-standard-2017/index.html @@ -59,10 +59,10 @@
    The flag of Wales
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/preforma-international-conference-tallinn-11-12-oct-2017/index.html b/news/preforma-international-conference-tallinn-11-12-oct-2017/index.html index 36d694c..fc7f598 100644 --- a/news/preforma-international-conference-tallinn-11-12-oct-2017/index.html +++ b/news/preforma-international-conference-tallinn-11-12-oct-2017/index.html @@ -59,10 +59,10 @@
    Preforma conference banner
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/publication-historic-england-advice-and-guidance-catalogue-april-2017/index.html b/news/publication-historic-england-advice-and-guidance-catalogue-april-2017/index.html index bace569..0c752c7 100644 --- a/news/publication-historic-england-advice-and-guidance-catalogue-april-2017/index.html +++ b/news/publication-historic-england-advice-and-guidance-catalogue-april-2017/index.html @@ -35,10 +35,10 @@

    Technical - Recording Heritage

  • Creating interpretive drawings
  • A guide to good recording practice
  • -

    https://historicengland.org.uk/advice/find/latest-guidance

    Current partners

    UP
    +

    https://historicengland.org.uk/advice/find/latest-guidance

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/tacos-one-day-seminar/index.html b/news/tacos-one-day-seminar/index.html index df65cd8..3792cc8 100644 --- a/news/tacos-one-day-seminar/index.html +++ b/news/tacos-one-day-seminar/index.html @@ -61,10 +61,10 @@
    CBA logo
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/taxonomy-boot-camp-london-october-2016/index.html b/news/taxonomy-boot-camp-london-october-2016/index.html index 9d7a04f..e81656b 100644 --- a/news/taxonomy-boot-camp-london-october-2016/index.html +++ b/news/taxonomy-boot-camp-london-october-2016/index.html @@ -48,10 +48,10 @@
    Taxonomy Boot Camp-Logo
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/taxonomy-boot-camp-olympia-london-17-18-oct-2017/index.html b/news/taxonomy-boot-camp-olympia-london-17-18-oct-2017/index.html index e9a0794..0afd512 100644 --- a/news/taxonomy-boot-camp-olympia-london-17-18-oct-2017/index.html +++ b/news/taxonomy-boot-camp-olympia-london-17-18-oct-2017/index.html @@ -35,10 +35,10 @@
  • Thomson Reuters
  • UN Framework Convention on Climate Change
  • World Bank Group, and more
  • -

    Current partners

    UP
    +
    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/termnet-international-terminology-summer-school-2017/index.html b/news/termnet-international-terminology-summer-school-2017/index.html index 85d1021..011bcfc 100644 --- a/news/termnet-international-terminology-summer-school-2017/index.html +++ b/news/termnet-international-terminology-summer-school-2017/index.html @@ -118,10 +118,10 @@

    Standards and legal issues for terminology work

    TermNet - International network for terminology
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/the-illustrated-ewaglos-conservation-glossary-now-available/index.html b/news/the-illustrated-ewaglos-conservation-glossary-now-available/index.html index 629c2c6..20943f4 100644 --- a/news/the-illustrated-ewaglos-conservation-glossary-now-available/index.html +++ b/news/the-illustrated-ewaglos-conservation-glossary-now-available/index.html @@ -96,10 +96,10 @@
    EwaGlos EU conservation
    -<img alt="Flag_of_Europe.png" src={require("..%2F..%2Fimages%2FFlag_of_Europe.png")} />

    Current partners

    UP
    +<img alt="Flag_of_Europe.png" src={require("..%2F..%2Fimages%2FFlag_of_Europe.png")} />

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/the-international-conference-on-cultural-heritage-ch/index.html b/news/the-international-conference-on-cultural-heritage-ch/index.html index 3cb0bd7..95627b8 100644 --- a/news/the-international-conference-on-cultural-heritage-ch/index.html +++ b/news/the-international-conference-on-cultural-heritage-ch/index.html @@ -57,10 +57,10 @@
    The Flag_of_Cyprus

    -

    <img alt="A banner image describing the EuroMed conference" src={require("../../images/euromed2016-header_img-300x61.jpg")} />

    Current partners

    UP
    +

    <img alt="A banner image describing the EuroMed conference" src={require("../../images/euromed2016-header_img-300x61.jpg")} />

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/tke-2016-12th-international-conference-terminology-knowledge-engineering-june-2016/index.html b/news/tke-2016-12th-international-conference-terminology-knowledge-engineering-june-2016/index.html index 6298eec..bed953b 100644 --- a/news/tke-2016-12th-international-conference-terminology-knowledge-engineering-june-2016/index.html +++ b/news/tke-2016-12th-international-conference-terminology-knowledge-engineering-june-2016/index.html @@ -69,10 +69,10 @@

    Topics

    Danish flag
    - TKE knowledge engineering logo

    Current partners

    UP
    + TKE knowledge engineering logo

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/tobias-workshops-classifying-historical-material-september-2016/index.html b/news/tobias-workshops-classifying-historical-material-september-2016/index.html index c85013a..2cba661 100644 --- a/news/tobias-workshops-classifying-historical-material-september-2016/index.html +++ b/news/tobias-workshops-classifying-historical-material-september-2016/index.html @@ -56,10 +56,10 @@
    school of advanced study logo
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/uk-digital-strategy-march-2017/index.html b/news/uk-digital-strategy-march-2017/index.html index a376cd8..3fccdbf 100644 --- a/news/uk-digital-strategy-march-2017/index.html +++ b/news/uk-digital-strategy-march-2017/index.html @@ -17,10 +17,10 @@
  • Click here to read the strategy
  • Click here to see the section on Heritage Records (see the section ‘Culture’)
  • Click here to see a useful summary by Heritage Alliance
  • -

    Current partners

    UP
    +
    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/under-represented-and-intangible-heritage-special-interest-group/index.html b/news/under-represented-and-intangible-heritage-special-interest-group/index.html index 4b915a5..9040341 100644 --- a/news/under-represented-and-intangible-heritage-special-interest-group/index.html +++ b/news/under-represented-and-intangible-heritage-special-interest-group/index.html @@ -58,10 +58,10 @@
    intagibleUNESCO.png
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/us-national-park-service-spatial-data-transfer-standards/index.html b/news/us-national-park-service-spatial-data-transfer-standards/index.html index 17367c6..b576bd5 100644 --- a/news/us-national-park-service-spatial-data-transfer-standards/index.html +++ b/news/us-national-park-service-spatial-data-transfer-standards/index.html @@ -21,10 +21,10 @@ legacy data contained within these databases, creating enhanced GIS data and forming a base for an authoritative NPS-wide cultural resource data set. The purpose of these spatial data transfer standards is to facilitate updating, transforming and integrating digital experiences within the US National Park Service to enhance public understanding as well as -internal NPS resource management.

    Current partners

    UP
    +internal NPS resource management.

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/news/workshop-build-semantic-web-database-one-morning-london-29-july-2017/index.html b/news/workshop-build-semantic-web-database-one-morning-london-29-july-2017/index.html index 29d5e00..b3f7b4f 100644 --- a/news/workshop-build-semantic-web-database-one-morning-london-29-july-2017/index.html +++ b/news/workshop-build-semantic-web-database-one-morning-london-29-july-2017/index.html @@ -57,10 +57,10 @@
    The British Museum/ResearchSpace symposium logo
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/other-guidance/index.html b/other-guidance/index.html index c7de9a0..101ce3b 100644 --- a/other-guidance/index.html +++ b/other-guidance/index.html @@ -177,10 +177,10 @@

    Watching Briefs

    Waterlogged Material

    Current partners

    UP
    +
    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/other-terminology-resources/index.html b/other-terminology-resources/index.html index a9ecb63..ef014d9 100644 --- a/other-terminology-resources/index.html +++ b/other-terminology-resources/index.html @@ -122,10 +122,10 @@

    Intangible Heritage

    A display of three books propped by a piece of wood and a roller skate on either side. Intangible indexing terms could include e.g. leisure, memento, roller skates and display.
    -

    Current partners

    UP
    +

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/page-data/app-data.json b/page-data/app-data.json index abe05c9..003d39c 100644 --- a/page-data/app-data.json +++ b/page-data/app-data.json @@ -1 +1 @@ -{"webpackCompilationHash":"68297e5f1096b365d75a"} +{"webpackCompilationHash":"f0041d5c0a8da5730949"} diff --git a/rss.xml b/rss.xml index 9c4b9b3..695dc8a 100644 --- a/rss.xml +++ b/rss.xml @@ -1,4 +1,4 @@ -<![CDATA[FISH RSS Feed]]>https://heritage-standards.museologi.stGatsbyJSTue, 07 Jan 2025 16:36:36 GMT<![CDATA[Development]]>https://heritage-standards.museologi.st/development/https://heritage-standards.museologi.st/development/<blockquote> +<![CDATA[FISH RSS Feed]]>https://heritage-standards.museologi.stGatsbyJSThu, 13 Feb 2025 10:56:35 GMT<![CDATA[Development]]>https://heritage-standards.museologi.st/development/https://heritage-standards.museologi.st/development/<blockquote> <p>Discussion and suggestions for new areas of development are welcome!</p> </blockquote> <p>Anyone interested in heritage data management is welcome to join FISH.</p> diff --git a/terminology/index.html b/terminology/index.html index 469cec5..11541ae 100644 --- a/terminology/index.html +++ b/terminology/index.html @@ -112,10 +112,10 @@

    Monument

  • First World War (project)
  • -

    Current partners

    UP
    +
    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/terms-of-reference/index.html b/terms-of-reference/index.html index 4b28528..7c316ce 100644 --- a/terms-of-reference/index.html +++ b/terms-of-reference/index.html @@ -64,10 +64,10 @@

    5. Communication

  • Forum web site: A web site will also be maintained as the responsibility of one or more core members, to support the effective communication of standards and information about the work of the forum.
  • Drafted by Edmund Lee, Forum Co-ordinator -Approved by the Forum attending membership August 1st 2001

    Current partners

    UP
    +Approved by the Forum attending membership August 1st 2001

    UP
    - \ No newline at end of file + \ No newline at end of file diff --git a/webpack-runtime-ab2f96763eba0eebf76f.js b/webpack-runtime-093556135aeb0d27e4f4.js similarity index 96% rename from webpack-runtime-ab2f96763eba0eebf76f.js rename to webpack-runtime-093556135aeb0d27e4f4.js index 754bd5a..3912433 100644 --- a/webpack-runtime-ab2f96763eba0eebf76f.js +++ b/webpack-runtime-093556135aeb0d27e4f4.js @@ -1,2 +1,2 @@ -!function(){"use strict";var e,t,n,r,o,c={},i={};function a(e){var t=i[e];if(void 0!==t)return t.exports;var n=i[e]={exports:{}};return c[e].call(n.exports,n,n.exports,a),n.exports}a.m=c,e=[],a.O=function(t,n,r,o){if(!n){var c=1/0;for(s=0;s=o)&&Object.keys(a.O).every((function(e){return a.O[e](n[u])}))?n.splice(u--,1):(i=!1,o0&&e[s-1][2]>o;s--)e[s]=e[s-1];e[s]=[n,r,o]},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},a.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);a.r(o);var c={};t=t||[null,n({}),n([]),n(n)];for(var i=2&r&&e;"object"==typeof i&&!~t.indexOf(i);i=n(i))Object.getOwnPropertyNames(i).forEach((function(t){c[t]=function(){return e[t]}}));return c.default=function(){return e},a.d(o,c),o},a.d=function(e,t){for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,n){return a.f[n](e,t),t}),[]))},a.u=function(e){return({74:"component---src-templates-blog-page-js",89:"component---src-templates-page-js",125:"component---src-pages-404-js",223:"commons",293:"component---src-pages-index-js",544:"42d6de3633a40a0addbc868d38b28ba97121cccb",861:"component---src-templates-news-js"}[e]||e)+"-"+{74:"37cc6877596c0b4e3217",89:"c3d746eb09ed5a1fb67d",108:"5033bafb0e90e184094e",125:"39d97ca7680a51587536",223:"c33d2ed027c33870d4b8",293:"337330418dbc96a7a2bf",452:"cec66380fc073aafe729",544:"9f33bff04e3491d963f4",861:"903039fb64c09a7c273b"}[e]+".js"},a.miniCssF=function(e){return"styles.98786ab3d4a644119fc4.css"},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="historic-england-heritage-standards:",a.l=function(e,t,n,c){if(r[e])r[e].push(t);else{var i,u;if(void 0!==n)for(var f=document.getElementsByTagName("script"),s=0;s=o)&&Object.keys(a.O).every((function(e){return a.O[e](n[u])}))?n.splice(u--,1):(i=!1,o0&&e[s-1][2]>o;s--)e[s]=e[s-1];e[s]=[n,r,o]},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},a.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);a.r(o);var c={};t=t||[null,n({}),n([]),n(n)];for(var i=2&r&&e;"object"==typeof i&&!~t.indexOf(i);i=n(i))Object.getOwnPropertyNames(i).forEach((function(t){c[t]=function(){return e[t]}}));return c.default=function(){return e},a.d(o,c),o},a.d=function(e,t){for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,n){return a.f[n](e,t),t}),[]))},a.u=function(e){return({74:"component---src-templates-blog-page-js",89:"component---src-templates-page-js",125:"component---src-pages-404-js",223:"commons",293:"component---src-pages-index-js",544:"42d6de3633a40a0addbc868d38b28ba97121cccb",861:"component---src-templates-news-js"}[e]||e)+"-"+{74:"37cc6877596c0b4e3217",89:"c3d746eb09ed5a1fb67d",108:"5033bafb0e90e184094e",125:"39d97ca7680a51587536",223:"7416e8653b7647b140e4",293:"337330418dbc96a7a2bf",452:"cec66380fc073aafe729",544:"9f33bff04e3491d963f4",861:"903039fb64c09a7c273b"}[e]+".js"},a.miniCssF=function(e){return"styles.98786ab3d4a644119fc4.css"},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="historic-england-heritage-standards:",a.l=function(e,t,n,c){if(r[e])r[e].push(t);else{var i,u;if(void 0!==n)for(var f=document.getElementsByTagName("script"),s=0;s 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"historic-england-heritage-standards:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"74\":\"component---src-templates-blog-page-js\",\"89\":\"component---src-templates-page-js\",\"125\":\"component---src-pages-404-js\",\"223\":\"commons\",\"293\":\"component---src-pages-index-js\",\"544\":\"42d6de3633a40a0addbc868d38b28ba97121cccb\",\"861\":\"component---src-templates-news-js\"}[chunkId] || chunkId) + \"-\" + {\"74\":\"37cc6877596c0b4e3217\",\"89\":\"c3d746eb09ed5a1fb67d\",\"108\":\"5033bafb0e90e184094e\",\"125\":\"39d97ca7680a51587536\",\"223\":\"c33d2ed027c33870d4b8\",\"293\":\"337330418dbc96a7a2bf\",\"452\":\"cec66380fc073aafe729\",\"544\":\"9f33bff04e3491d963f4\",\"861\":\"903039fb64c09a7c273b\"}[chunkId] + \".js\";\n};","// This function allow to reference all chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + \"styles\" + \".\" + \"98786ab3d4a644119fc4\" + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t311: 0,\n\t869: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(311|869)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkhistoric_england_heritage_standards\"] = self[\"webpackChunkhistoric_england_heritage_standards\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","getPrototypeOf","obj","__proto__","t","value","mode","this","then","ns","create","def","current","indexOf","getOwnPropertyNames","forEach","definition","o","defineProperty","enumerable","get","f","e","chunkId","Promise","all","reduce","promises","u","miniCssF","g","globalThis","Function","window","prop","prototype","hasOwnProperty","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","setTimeout","bind","type","target","head","appendChild","Symbol","toStringTag","p","installedChunks","installedChunkData","test","promise","resolve","reject","error","Error","errorType","realSrc","message","name","request","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","id","chunkLoadingGlobal","self"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"webpack-runtime-093556135aeb0d27e4f4.js","mappings":"6BAAIA,ECCAC,EADAC,ECAAC,EACAC,E,KCAAC,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaE,QAGrB,IAAIC,EAASN,EAAyBE,GAAY,CAGjDG,QAAS,CAAC,GAOX,OAHAE,EAAoBL,GAAUM,KAAKF,EAAOD,QAASC,EAAQA,EAAOD,QAASJ,GAGpEK,EAAOD,OACf,CAGAJ,EAAoBQ,EAAIF,EHzBpBZ,EAAW,GACfM,EAAoBS,EAAI,SAASC,EAAQC,EAAUC,EAAIC,GACtD,IAAGF,EAAH,CAMA,IAAIG,EAAeC,IACnB,IAASC,EAAI,EAAGA,EAAItB,EAASuB,OAAQD,IAAK,CACrCL,EAAWjB,EAASsB,GAAG,GACvBJ,EAAKlB,EAASsB,GAAG,GACjBH,EAAWnB,EAASsB,GAAG,GAE3B,IAJA,IAGIE,GAAY,EACPC,EAAI,EAAGA,EAAIR,EAASM,OAAQE,MACpB,EAAXN,GAAsBC,GAAgBD,IAAaO,OAAOC,KAAKrB,EAAoBS,GAAGa,OAAM,SAASC,GAAO,OAAOvB,EAAoBS,EAAEc,GAAKZ,EAASQ,GAAK,IAChKR,EAASa,OAAOL,IAAK,IAErBD,GAAY,EACTL,EAAWC,IAAcA,EAAeD,IAG7C,GAAGK,EAAW,CACbxB,EAAS8B,OAAOR,IAAK,GACrB,IAAIS,EAAIb,SACET,IAANsB,IAAiBf,EAASe,EAC/B,CACD,CACA,OAAOf,CArBP,CAJCG,EAAWA,GAAY,EACvB,IAAI,IAAIG,EAAItB,EAASuB,OAAQD,EAAI,GAAKtB,EAASsB,EAAI,GAAG,GAAKH,EAAUG,IAAKtB,EAASsB,GAAKtB,EAASsB,EAAI,GACrGtB,EAASsB,GAAK,CAACL,EAAUC,EAAIC,EAwB/B,EI5BAb,EAAoB0B,EAAI,SAASrB,GAChC,IAAIsB,EAAStB,GAAUA,EAAOuB,WAC7B,WAAa,OAAOvB,EAAgB,OAAG,EACvC,WAAa,OAAOA,CAAQ,EAE7B,OADAL,EAAoB6B,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CACR,EHPI/B,EAAWwB,OAAOW,eAAiB,SAASC,GAAO,OAAOZ,OAAOW,eAAeC,EAAM,EAAI,SAASA,GAAO,OAAOA,EAAIC,SAAW,EAQpIjC,EAAoBkC,EAAI,SAASC,EAAOC,GAEvC,GADU,EAAPA,IAAUD,EAAQE,KAAKF,IAChB,EAAPC,EAAU,OAAOD,EACpB,GAAoB,iBAAVA,GAAsBA,EAAO,CACtC,GAAW,EAAPC,GAAaD,EAAMP,WAAY,OAAOO,EAC1C,GAAW,GAAPC,GAAoC,mBAAfD,EAAMG,KAAqB,OAAOH,CAC5D,CACA,IAAII,EAAKnB,OAAOoB,OAAO,MACvBxC,EAAoByB,EAAEc,GACtB,IAAIE,EAAM,CAAC,EACX9C,EAAiBA,GAAkB,CAAC,KAAMC,EAAS,CAAC,GAAIA,EAAS,IAAKA,EAASA,IAC/E,IAAI,IAAI8C,EAAiB,EAAPN,GAAYD,EAAyB,iBAAXO,KAAyB/C,EAAegD,QAAQD,GAAUA,EAAU9C,EAAS8C,GACxHtB,OAAOwB,oBAAoBF,GAASG,SAAQ,SAAStB,GAAOkB,EAAIlB,GAAO,WAAa,OAAOY,EAAMZ,EAAM,CAAG,IAI3G,OAFAkB,EAAa,QAAI,WAAa,OAAON,CAAO,EAC5CnC,EAAoB6B,EAAEU,EAAIE,GACnBF,CACR,EIxBAvC,EAAoB6B,EAAI,SAASzB,EAAS0C,GACzC,IAAI,IAAIvB,KAAOuB,EACX9C,EAAoB+C,EAAED,EAAYvB,KAASvB,EAAoB+C,EAAE3C,EAASmB,IAC5EH,OAAO4B,eAAe5C,EAASmB,EAAK,CAAE0B,YAAY,EAAMC,IAAKJ,EAAWvB,IAG3E,ECPAvB,EAAoBmD,EAAI,CAAC,EAGzBnD,EAAoBoD,EAAI,SAASC,GAChC,OAAOC,QAAQC,IAAInC,OAAOC,KAAKrB,EAAoBmD,GAAGK,QAAO,SAASC,EAAUlC,GAE/E,OADAvB,EAAoBmD,EAAE5B,GAAK8B,EAASI,GAC7BA,CACR,GAAG,IACJ,ECPAzD,EAAoB0D,EAAI,SAASL,GAEhC,OAAa,CAAC,GAAK,yCAAyC,GAAK,oCAAoC,IAAM,+BAA+B,IAAM,UAAU,IAAM,iCAAiC,IAAM,2CAA2C,IAAM,qCAAqCA,IAAYA,GAAW,IAAM,CAAC,GAAK,uBAAuB,GAAK,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,wBAAwBA,GAAW,KAC3kB,ECHArD,EAAoB2D,SAAW,SAASN,GAEvC,MAAO,iCACR,ECJArD,EAAoB4D,EAAI,WACvB,GAA0B,iBAAfC,WAAyB,OAAOA,WAC3C,IACC,OAAOxB,MAAQ,IAAIyB,SAAS,cAAb,EAChB,CAAE,MAAOV,GACR,GAAsB,iBAAXW,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxB/D,EAAoB+C,EAAI,SAASf,EAAKgC,GAAQ,OAAO5C,OAAO6C,UAAUC,eAAe3D,KAAKyB,EAAKgC,EAAO,ERAlGnE,EAAa,CAAC,EACdC,EAAoB,uCAExBE,EAAoBmE,EAAI,SAASC,EAAKC,EAAM9C,EAAK8B,GAChD,GAAGxD,EAAWuE,GAAQvE,EAAWuE,GAAKE,KAAKD,OAA3C,CACA,IAAIE,EAAQC,EACZ,QAAWrE,IAARoB,EAEF,IADA,IAAIkD,EAAUC,SAASC,qBAAqB,UACpC3D,EAAI,EAAGA,EAAIyD,EAAQxD,OAAQD,IAAK,CACvC,IAAI4D,EAAIH,EAAQzD,GAChB,GAAG4D,EAAEC,aAAa,QAAUT,GAAOQ,EAAEC,aAAa,iBAAmB/E,EAAoByB,EAAK,CAAEgD,EAASK,EAAG,KAAO,CACpH,CAEGL,IACHC,GAAa,GACbD,EAASG,SAASI,cAAc,WAEzBC,QAAU,QACjBR,EAAOS,QAAU,IACbhF,EAAoBiF,IACvBV,EAAOW,aAAa,QAASlF,EAAoBiF,IAElDV,EAAOW,aAAa,eAAgBpF,EAAoByB,GAExDgD,EAAOY,IAAMf,GAEdvE,EAAWuE,GAAO,CAACC,GACnB,IAAIe,EAAmB,SAASC,EAAMC,GAErCf,EAAOgB,QAAUhB,EAAOiB,OAAS,KACjCC,aAAaT,GACb,IAAIU,EAAU7F,EAAWuE,GAIzB,UAHOvE,EAAWuE,GAClBG,EAAOoB,YAAcpB,EAAOoB,WAAWC,YAAYrB,GACnDmB,GAAWA,EAAQ7C,SAAQ,SAASjC,GAAM,OAAOA,EAAG0E,EAAQ,IACzDD,EAAM,OAAOA,EAAKC,EACtB,EACIN,EAAUa,WAAWT,EAAiBU,KAAK,UAAM3F,EAAW,CAAE4F,KAAM,UAAWC,OAAQzB,IAAW,MACtGA,EAAOgB,QAAUH,EAAiBU,KAAK,KAAMvB,EAAOgB,SACpDhB,EAAOiB,OAASJ,EAAiBU,KAAK,KAAMvB,EAAOiB,QACnDhB,GAAcE,SAASuB,KAAKC,YAAY3B,EApCkB,CAqC3D,ESxCAvE,EAAoByB,EAAI,SAASrB,GACX,oBAAX+F,QAA0BA,OAAOC,aAC1ChF,OAAO4B,eAAe5C,EAAS+F,OAAOC,YAAa,CAAEjE,MAAO,WAE7Df,OAAO4B,eAAe5C,EAAS,aAAc,CAAE+B,OAAO,GACvD,ECNAnC,EAAoBqG,EAAI,I,WCKxB,IAAIC,EAAkB,CACrB,IAAK,EACL,IAAK,GAGNtG,EAAoBmD,EAAEhC,EAAI,SAASkC,EAASI,GAE1C,IAAI8C,EAAqBvG,EAAoB+C,EAAEuD,EAAiBjD,GAAWiD,EAAgBjD,QAAWlD,EACtG,GAA0B,IAAvBoG,EAGF,GAAGA,EACF9C,EAASa,KAAKiC,EAAmB,SAEjC,GAAI,cAAcC,KAAKnD,GAyBhBiD,EAAgBjD,GAAW,MAzBD,CAEhC,IAAIoD,EAAU,IAAInD,SAAQ,SAASoD,EAASC,GAAUJ,EAAqBD,EAAgBjD,GAAW,CAACqD,EAASC,EAAS,IACzHlD,EAASa,KAAKiC,EAAmB,GAAKE,GAGtC,IAAIrC,EAAMpE,EAAoBqG,EAAIrG,EAAoB0D,EAAEL,GAEpDuD,EAAQ,IAAIC,MAgBhB7G,EAAoBmE,EAAEC,GAfH,SAASkB,GAC3B,GAAGtF,EAAoB+C,EAAEuD,EAAiBjD,KAEf,KAD1BkD,EAAqBD,EAAgBjD,MACRiD,EAAgBjD,QAAWlD,GACrDoG,GAAoB,CACtB,IAAIO,EAAYxB,IAAyB,SAAfA,EAAMS,KAAkB,UAAYT,EAAMS,MAChEgB,EAAUzB,GAASA,EAAMU,QAAUV,EAAMU,OAAOb,IACpDyB,EAAMI,QAAU,iBAAmB3D,EAAU,cAAgByD,EAAY,KAAOC,EAAU,IAC1FH,EAAMK,KAAO,iBACbL,EAAMb,KAAOe,EACbF,EAAMM,QAAUH,EAChBR,EAAmB,GAAGK,EACvB,CAEF,GACyC,SAAWvD,EAASA,EAC9D,CAGJ,EAUArD,EAAoBS,EAAEU,EAAI,SAASkC,GAAW,OAAoC,IAA7BiD,EAAgBjD,EAAgB,EAGrF,IAAI8D,EAAuB,SAASC,EAA4BC,GAC/D,IAKIpH,EAAUoD,EALV1C,EAAW0G,EAAK,GAChBC,EAAcD,EAAK,GACnBE,EAAUF,EAAK,GAGIrG,EAAI,EAC3B,GAAGL,EAAS6G,MAAK,SAASC,GAAM,OAA+B,IAAxBnB,EAAgBmB,EAAW,IAAI,CACrE,IAAIxH,KAAYqH,EACZtH,EAAoB+C,EAAEuE,EAAarH,KACrCD,EAAoBQ,EAAEP,GAAYqH,EAAYrH,IAGhD,GAAGsH,EAAS,IAAI7G,EAAS6G,EAAQvH,EAClC,CAEA,IADGoH,GAA4BA,EAA2BC,GACrDrG,EAAIL,EAASM,OAAQD,IACzBqC,EAAU1C,EAASK,GAChBhB,EAAoB+C,EAAEuD,EAAiBjD,IAAYiD,EAAgBjD,IACrEiD,EAAgBjD,GAAS,KAE1BiD,EAAgBjD,GAAW,EAE5B,OAAOrD,EAAoBS,EAAEC,EAC9B,EAEIgH,EAAqBC,KAAsD,gDAAIA,KAAsD,iDAAK,GAC9ID,EAAmB7E,QAAQsE,EAAqBrB,KAAK,KAAM,IAC3D4B,EAAmBpD,KAAO6C,EAAqBrB,KAAK,KAAM4B,EAAmBpD,KAAKwB,KAAK4B,G,ICxFvF1H,EAAoBiF,QAAK9E,C","sources":["webpack://historic-england-heritage-standards/webpack/runtime/chunk loaded","webpack://historic-england-heritage-standards/webpack/runtime/create fake namespace object","webpack://historic-england-heritage-standards/webpack/runtime/load script","webpack://historic-england-heritage-standards/webpack/bootstrap","webpack://historic-england-heritage-standards/webpack/runtime/compat get default export","webpack://historic-england-heritage-standards/webpack/runtime/define property getters","webpack://historic-england-heritage-standards/webpack/runtime/ensure chunk","webpack://historic-england-heritage-standards/webpack/runtime/get javascript chunk filename","webpack://historic-england-heritage-standards/webpack/runtime/get mini-css chunk filename","webpack://historic-england-heritage-standards/webpack/runtime/global","webpack://historic-england-heritage-standards/webpack/runtime/hasOwnProperty shorthand","webpack://historic-england-heritage-standards/webpack/runtime/make namespace object","webpack://historic-england-heritage-standards/webpack/runtime/publicPath","webpack://historic-england-heritage-standards/webpack/runtime/jsonp chunk loading","webpack://historic-england-heritage-standards/webpack/runtime/nonce"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"historic-england-heritage-standards:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"74\":\"component---src-templates-blog-page-js\",\"89\":\"component---src-templates-page-js\",\"125\":\"component---src-pages-404-js\",\"223\":\"commons\",\"293\":\"component---src-pages-index-js\",\"544\":\"42d6de3633a40a0addbc868d38b28ba97121cccb\",\"861\":\"component---src-templates-news-js\"}[chunkId] || chunkId) + \"-\" + {\"74\":\"37cc6877596c0b4e3217\",\"89\":\"c3d746eb09ed5a1fb67d\",\"108\":\"5033bafb0e90e184094e\",\"125\":\"39d97ca7680a51587536\",\"223\":\"7416e8653b7647b140e4\",\"293\":\"337330418dbc96a7a2bf\",\"452\":\"cec66380fc073aafe729\",\"544\":\"9f33bff04e3491d963f4\",\"861\":\"903039fb64c09a7c273b\"}[chunkId] + \".js\";\n};","// This function allow to reference all chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + \"styles\" + \".\" + \"98786ab3d4a644119fc4\" + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t311: 0,\n\t869: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(311|869)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkhistoric_england_heritage_standards\"] = self[\"webpackChunkhistoric_england_heritage_standards\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","__webpack_require__.nc = undefined;"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","getPrototypeOf","obj","__proto__","t","value","mode","this","then","ns","create","def","current","indexOf","getOwnPropertyNames","forEach","definition","o","defineProperty","enumerable","get","f","e","chunkId","Promise","all","reduce","promises","u","miniCssF","g","globalThis","Function","window","prop","prototype","hasOwnProperty","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","setTimeout","bind","type","target","head","appendChild","Symbol","toStringTag","p","installedChunks","installedChunkData","test","promise","resolve","reject","error","Error","errorType","realSrc","message","name","request","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","id","chunkLoadingGlobal","self"],"sourceRoot":""} \ No newline at end of file diff --git a/webpack.stats.json b/webpack.stats.json index ddbc4de..817bef8 100644 --- a/webpack.stats.json +++ b/webpack.stats.json @@ -1 +1 @@ -{"name":"build-javascript","namedChunkGroups":{"app":{"name":"app","assets":[{"name":"webpack-runtime-ab2f96763eba0eebf76f.js","size":4235},{"name":"styles.98786ab3d4a644119fc4.css","size":247284},{"name":"framework-b7d1c5fc76659121e0f6.js","size":141008},{"name":"app-f6366dd67339bd975dc4.js","size":208299}],"filteredAssets":0,"assetsSize":600826,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":1108438},"component---src-pages-404-js":{"name":"component---src-pages-404-js","assets":[{"name":"styles.98786ab3d4a644119fc4.css","size":247284},{"name":"framework-b7d1c5fc76659121e0f6.js","size":141008},{"name":"commons-c33d2ed027c33870d4b8.js","size":52950},{"name":"component---src-pages-404-js-39d97ca7680a51587536.js","size":864}],"filteredAssets":0,"assetsSize":442106,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":528889},"component---src-pages-index-js":{"name":"component---src-pages-index-js","assets":[{"name":"styles.98786ab3d4a644119fc4.css","size":247284},{"name":"framework-b7d1c5fc76659121e0f6.js","size":141008},{"name":"commons-c33d2ed027c33870d4b8.js","size":52950},{"name":"component---src-pages-index-js-337330418dbc96a7a2bf.js","size":4075}],"filteredAssets":0,"assetsSize":445317,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":541835},"component---src-templates-blog-page-js":{"name":"component---src-templates-blog-page-js","assets":[{"name":"styles.98786ab3d4a644119fc4.css","size":247284},{"name":"framework-b7d1c5fc76659121e0f6.js","size":141008},{"name":"commons-c33d2ed027c33870d4b8.js","size":52950},{"name":"42d6de3633a40a0addbc868d38b28ba97121cccb-9f33bff04e3491d963f4.js","size":60263},{"name":"component---src-templates-blog-page-js-37cc6877596c0b4e3217.js","size":1525}],"filteredAssets":0,"assetsSize":503030,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":856918},"component---src-templates-news-js":{"name":"component---src-templates-news-js","assets":[{"name":"styles.98786ab3d4a644119fc4.css","size":247284},{"name":"framework-b7d1c5fc76659121e0f6.js","size":141008},{"name":"commons-c33d2ed027c33870d4b8.js","size":52950},{"name":"component---src-templates-news-js-903039fb64c09a7c273b.js","size":6728}],"filteredAssets":0,"assetsSize":447970,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":546837},"component---src-templates-page-js":{"name":"component---src-templates-page-js","assets":[{"name":"styles.98786ab3d4a644119fc4.css","size":247284},{"name":"framework-b7d1c5fc76659121e0f6.js","size":141008},{"name":"commons-c33d2ed027c33870d4b8.js","size":52950},{"name":"42d6de3633a40a0addbc868d38b28ba97121cccb-9f33bff04e3491d963f4.js","size":60263},{"name":"component---src-templates-page-js-c3d746eb09ed5a1fb67d.js","size":1506}],"filteredAssets":0,"assetsSize":503011,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":856813}},"assetsByChunkName":{"app":["webpack-runtime-ab2f96763eba0eebf76f.js","styles.98786ab3d4a644119fc4.css","framework-b7d1c5fc76659121e0f6.js","app-f6366dd67339bd975dc4.js"],"component---src-pages-404-js":["styles.98786ab3d4a644119fc4.css","framework-b7d1c5fc76659121e0f6.js","commons-c33d2ed027c33870d4b8.js","component---src-pages-404-js-39d97ca7680a51587536.js"],"component---src-pages-index-js":["styles.98786ab3d4a644119fc4.css","framework-b7d1c5fc76659121e0f6.js","commons-c33d2ed027c33870d4b8.js","component---src-pages-index-js-337330418dbc96a7a2bf.js"],"component---src-templates-blog-page-js":["styles.98786ab3d4a644119fc4.css","framework-b7d1c5fc76659121e0f6.js","commons-c33d2ed027c33870d4b8.js","42d6de3633a40a0addbc868d38b28ba97121cccb-9f33bff04e3491d963f4.js","component---src-templates-blog-page-js-37cc6877596c0b4e3217.js"],"component---src-templates-news-js":["styles.98786ab3d4a644119fc4.css","framework-b7d1c5fc76659121e0f6.js","commons-c33d2ed027c33870d4b8.js","component---src-templates-news-js-903039fb64c09a7c273b.js"],"component---src-templates-page-js":["styles.98786ab3d4a644119fc4.css","framework-b7d1c5fc76659121e0f6.js","commons-c33d2ed027c33870d4b8.js","42d6de3633a40a0addbc868d38b28ba97121cccb-9f33bff04e3491d963f4.js","component---src-templates-page-js-c3d746eb09ed5a1fb67d.js"]},"childAssetsByChunkName":{}} \ No newline at end of file +{"name":"build-javascript","namedChunkGroups":{"app":{"name":"app","assets":[{"name":"webpack-runtime-093556135aeb0d27e4f4.js","size":4235},{"name":"styles.98786ab3d4a644119fc4.css","size":247284},{"name":"framework-b7d1c5fc76659121e0f6.js","size":141008},{"name":"app-f6366dd67339bd975dc4.js","size":208299}],"filteredAssets":0,"assetsSize":600826,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":1108438},"component---src-pages-404-js":{"name":"component---src-pages-404-js","assets":[{"name":"styles.98786ab3d4a644119fc4.css","size":247284},{"name":"framework-b7d1c5fc76659121e0f6.js","size":141008},{"name":"commons-7416e8653b7647b140e4.js","size":52826},{"name":"component---src-pages-404-js-39d97ca7680a51587536.js","size":864}],"filteredAssets":0,"assetsSize":441982,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":528696},"component---src-pages-index-js":{"name":"component---src-pages-index-js","assets":[{"name":"styles.98786ab3d4a644119fc4.css","size":247284},{"name":"framework-b7d1c5fc76659121e0f6.js","size":141008},{"name":"commons-7416e8653b7647b140e4.js","size":52826},{"name":"component---src-pages-index-js-337330418dbc96a7a2bf.js","size":4075}],"filteredAssets":0,"assetsSize":445193,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":541642},"component---src-templates-blog-page-js":{"name":"component---src-templates-blog-page-js","assets":[{"name":"styles.98786ab3d4a644119fc4.css","size":247284},{"name":"framework-b7d1c5fc76659121e0f6.js","size":141008},{"name":"commons-7416e8653b7647b140e4.js","size":52826},{"name":"42d6de3633a40a0addbc868d38b28ba97121cccb-9f33bff04e3491d963f4.js","size":60263},{"name":"component---src-templates-blog-page-js-37cc6877596c0b4e3217.js","size":1525}],"filteredAssets":0,"assetsSize":502906,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":856725},"component---src-templates-news-js":{"name":"component---src-templates-news-js","assets":[{"name":"styles.98786ab3d4a644119fc4.css","size":247284},{"name":"framework-b7d1c5fc76659121e0f6.js","size":141008},{"name":"commons-7416e8653b7647b140e4.js","size":52826},{"name":"component---src-templates-news-js-903039fb64c09a7c273b.js","size":6728}],"filteredAssets":0,"assetsSize":447846,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":546644},"component---src-templates-page-js":{"name":"component---src-templates-page-js","assets":[{"name":"styles.98786ab3d4a644119fc4.css","size":247284},{"name":"framework-b7d1c5fc76659121e0f6.js","size":141008},{"name":"commons-7416e8653b7647b140e4.js","size":52826},{"name":"42d6de3633a40a0addbc868d38b28ba97121cccb-9f33bff04e3491d963f4.js","size":60263},{"name":"component---src-templates-page-js-c3d746eb09ed5a1fb67d.js","size":1506}],"filteredAssets":0,"assetsSize":502887,"filteredAuxiliaryAssets":4,"auxiliaryAssetsSize":856620}},"assetsByChunkName":{"app":["webpack-runtime-093556135aeb0d27e4f4.js","styles.98786ab3d4a644119fc4.css","framework-b7d1c5fc76659121e0f6.js","app-f6366dd67339bd975dc4.js"],"component---src-pages-404-js":["styles.98786ab3d4a644119fc4.css","framework-b7d1c5fc76659121e0f6.js","commons-7416e8653b7647b140e4.js","component---src-pages-404-js-39d97ca7680a51587536.js"],"component---src-pages-index-js":["styles.98786ab3d4a644119fc4.css","framework-b7d1c5fc76659121e0f6.js","commons-7416e8653b7647b140e4.js","component---src-pages-index-js-337330418dbc96a7a2bf.js"],"component---src-templates-blog-page-js":["styles.98786ab3d4a644119fc4.css","framework-b7d1c5fc76659121e0f6.js","commons-7416e8653b7647b140e4.js","42d6de3633a40a0addbc868d38b28ba97121cccb-9f33bff04e3491d963f4.js","component---src-templates-blog-page-js-37cc6877596c0b4e3217.js"],"component---src-templates-news-js":["styles.98786ab3d4a644119fc4.css","framework-b7d1c5fc76659121e0f6.js","commons-7416e8653b7647b140e4.js","component---src-templates-news-js-903039fb64c09a7c273b.js"],"component---src-templates-page-js":["styles.98786ab3d4a644119fc4.css","framework-b7d1c5fc76659121e0f6.js","commons-7416e8653b7647b140e4.js","42d6de3633a40a0addbc868d38b28ba97121cccb-9f33bff04e3491d963f4.js","component---src-templates-page-js-c3d746eb09ed5a1fb67d.js"]},"childAssetsByChunkName":{}} \ No newline at end of file diff --git a/working-groups/index.html b/working-groups/index.html index 1e20e4b..80140c7 100644 --- a/working-groups/index.html +++ b/working-groups/index.html @@ -37,10 +37,10 @@

    Specialist meetings

    In addition to the general terminology meetings, members also meet to discuss amendments to specific subject areas, such as terminology for landforms, sediments and lithics. This will involve revision of the FISH Monument Type Thesaurus, where for example a new class will be developed called 'natural features', and the FISH Archaeological Objects Thesaurus. This may be followed by a review of the FISH Evidence Thesaurus with regard to recording palaeoenvironmental evidence.

    FISH members – please participate!

    The FISH discussion list is available on FISH JISCmail. This is free but you need to sign up to JISCmail to be able to participate. Click here to find out how to subscribe.

    -

    Please contact FISH if you are interested in contributing to any of the existing working groups. We also welcome suggestions for any other related topics you would like to see discussed, developed or promoted by the FISH community.

    Current partners

    UP
    +

    Please contact FISH if you are interested in contributing to any of the existing working groups. We also welcome suggestions for any other related topics you would like to see discussed, developed or promoted by the FISH community.

    UP
    - \ No newline at end of file + \ No newline at end of file