{"version":3,"sources":["webpack:///./node_modules/gatsby-link/index.js","webpack:///./node_modules/gatsby-react-router-scroll/session-storage.js","webpack:///./node_modules/@babel/runtime/helpers/interopRequireWildcard.js","webpack:///./node_modules/gatsby-react-router-scroll/use-scroll-restoration.js","webpack:///./node_modules/mitt/dist/mitt.es.js","webpack:///./.cache/emitter.js","webpack:///./.cache/polyfills/object-assign.js","webpack:///./node_modules/gatsby-react-router-scroll/index.js","webpack:///./node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js","webpack:///./.cache/react-lifecycles-compat.js","webpack:///./node_modules/@reach/router/es/lib/history.js","webpack:///./node_modules/gatsby-react-router-scroll/scroll-handler.js","webpack:///./.cache/page-renderer.js","webpack:///./node_modules/@reach/router/es/lib/utils.js","webpack:///./.cache/api-runner-browser-plugins.js","webpack:///./node_modules/@mikaelkristiansson/domready/ready.js","webpack:///./.cache/register-service-worker.js","webpack:///./node_modules/@babel/runtime/helpers/assertThisInitialized.js","webpack:///./node_modules/invariant/browser.js","webpack:///./node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack:///./.cache/route-announcer-props.js","webpack:///./.cache/navigation.js","webpack:///./node_modules/shallow-compare/es/index.js","webpack:///./.cache/ensure-resources.js","webpack:///./.cache/production-app.js","webpack:///./node_modules/@babel/runtime/helpers/inheritsLoose.js","webpack:///./_this_is_virtual_fs_path_/$virtual/async-requires.js","webpack:///./.cache/gatsby-browser-entry.js","webpack:///./node_modules/@reach/router/es/index.js","webpack:///./node_modules/@babel/runtime/helpers/typeof.js","webpack:///./.cache/strip-prefix.js","webpack:///./node_modules/gatsby-link/parse-path.js","webpack:///./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack:///./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack:///./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack:///./.cache/prefetch.js","webpack:///./.cache/normalize-page-path.js","webpack:///./.cache/find-path.js","webpack:///./.cache/loader.js","webpack:///./node_modules/gatsby-remark-autolink-headers/gatsby-browser.js","webpack:///./node_modules/gatsby-react-router-scroll/scroll-container.js","webpack:///./.cache/public-page-renderer.js","webpack:///./.cache/create-react-context.js","webpack:///./node_modules/@babel/runtime/helpers/extends.js","webpack:///./.cache/public-page-renderer-prod.js","webpack:///./.cache/api-runner-browser.js"],"names":["_interopRequireDefault","exports","__esModule","withPrefix","withAssetPrefix","path","getGlobalPathPrefix","navigateTo","replace","push","navigate","default","_objectWithoutPropertiesLoose2","_extends2","_assertThisInitialized2","_inheritsLoose2","_propTypes","_react","_router","_utils","_parsePath","parsePath","isAbsolutePath","startsWith","prefix","_ref","_prefix","getGlobalBasePrefix","isLocalLink","base","endsWith","slice","rewriteLinkPath","relativeTo","current","resolve","absolutify","NavLinkPropTypes","activeClassName","string","activeStyle","object","partiallyActive","bool","GatsbyLink","_React$Component","props","_this","call","this","defaultGetProps","_ref2","isPartiallyCurrent","isCurrent","className","filter","Boolean","join","style","IOSupported","window","IntersectionObserver","state","handleRef","bind","_proto","prototype","componentDidUpdate","prevProps","prevState","to","___loader","enqueue","location","pathname","componentDidMount","componentWillUnmount","io","_this$io","instance","el","unobserve","disconnect","ref","cb","_this2","innerRef","hasOwnProperty","entries","forEach","entry","target","isIntersecting","intersectionRatio","observe","render","_this3","_this$props","_this$props$getProps","getProps","_onClick","onClick","_onMouseEnter","onMouseEnter","rest","createElement","Location","_ref3","prefixedTo","Link","e","hovering","button","defaultPrevented","metaKey","altKey","ctrlKey","shiftKey","preventDefault","shouldReplace","encodeURI","___navigate","href","Component","propTypes","func","isRequired","showDeprecationWarning","functionName","altFunctionName","version","console","warn","_default","forwardRef","options","___push","___replace","SessionStorage","read","key","stateKey","getStateKey","value","sessionStorage","getItem","JSON","parse","save","storedValue","stringify","setItem","stateKeyBase","_typeof","_getRequireWildcardCache","WeakMap","cache","module","obj","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","desc","set","useScrollRestoration","identifier","useLocation","useContext","_scrollHandler","ScrollContext","useRef","useLayoutEffect","position","scrollTo","onScroll","scrollTop","emitter","all","create","on","type","handler","off","splice","indexOf","emit","evt","map","mitt","assign","ScrollContainer","ScrollHandler","_scrollContainer","_useScrollRestoration","source","excluded","i","sourceKeys","keys","length","polyfill","_extends","arguments","getLocation","_source$location","search","hash","origin","protocol","host","hostname","port","canUseDOM","URL","decodeURI","history","createHistory","listeners","transitioning","resolveTransition","_onTransitionComplete","listen","listener","popstateListener","action","addEventListener","removeEventListener","fn","undefined","_ref$replace","go","Date","now","replaceState","pushState","transition","Promise","res","createMemorySource","initialPath","searchIndex","initialLocation","substr","index","stack","states","name","_","uri","_uri$split","split","_uri$split$","_uri$split2","_uri$split2$","newIndex","document","globalHistory","_interopRequireWildcard","React","_sessionStorage","createContext","displayName","_len","args","Array","_key","apply","concat","_stateStorage","scrollListener","scrollY","windowScroll","shouldUpdateScroll","scrollToHash","node","getElementById","substring","scrollIntoView","prevRouterProps","routerProps","scrollPosition","_this$props$location","_this$props$location2","Provider","children","element","PageRenderer","pathContext","pageContext","pageElement","apiRunner","loader","publicLoader","pageResources","component","page","result","pop","pick","routes","match","default_","uriPathname","uriSegments","segmentize","isRootUri","ranked","rankRoutes","l","missed","route","params","routeSegments","max","Math","routeSegment","uriSegment","isSplat","decodeURIComponent","dynamicMatch","paramRe","exec","reservedNames","_to$split","toPathname","toQuery","basePathname","toSegments","baseSegments","addQuery","allSegments","segments","segment","insertParams","_path$split","pathBase","_path$split$","query","constructedPath","_params$location","_params$location$sear","searchSplit","validateRedirect","from","isDynamic","sort","test","rankRoute","score","reduce","isRootSegment","SEGMENT_POINTS","a","b","q","shallowCompare","obj1","obj2","obj1Keys","every","plugin","require","ie10","navigator","appVersion","fns","doc","hack","documentElement","doScroll","loaded","readyState","shift","setTimeout","definition","error","serviceWorker","register","__BASE_PATH__","then","reg","installingWorker","installing","log","controller","___swUpdated","___failedResources","reload","catch","self","ReferenceError","condition","format","c","d","f","Error","argIndex","framesToPop","RouteAnnouncerProps","id","top","width","height","padding","overflow","clip","whiteSpace","border","redirectMap","redirects","redirect","fromPath","maybeRedirect","toPath","onPreRouteUpdate","prevLocation","onRouteUpdate","timeoutId","loadPage","status","PageResourceStatus","clearTimeout","webpackCompilationHash","___webpackCompilationHash","postMessage","gatsbyApi","reachNavigate","results","getSavedScrollPosition","RouteAnnouncer","announcementRef","createRef","nextProps","requestAnimationFrame","pageName","title","pageHeadings","querySelectorAll","textContent","newAnnouncement","innerText","RouteUpdates","shouldFireRouteUpdate","getSnapshotBeforeUpdate","Fragment","shallowDiffers","_i","EnsureResources","loadPageSync","getDerivedStateFromProps","loadResources","rawPath","setState","shouldComponentUpdate","nextState","json","matchPath","ProdLoader","asyncRequires","matchPaths","setLoader","setApiRunner","___emitter","apiRunnerAsync","RouteHandler","baseuri","basepath","DataContext","GatsbyRoot","staticQueryResults","LocationHandler","Consumer","stripPrefix","pagePath","browserLoc","findMatchPath","SiteRoot","App","renderer","ReactDOM","hydrate","domReady","subClass","superClass","constructor","__proto__","components","StaticQueryContext","_objectWithoutProperties","_classCallCheck","Constructor","TypeError","_possibleConstructorReturn","_inherits","enumerable","writable","configurable","setPrototypeOf","createNamedContext","defaultValue","Ctx","LocationContext","context","LocationProvider","_temp","getContext","refs","unlisten","_props$history","componentDidCatch","info","isRedirect","_navigate","unmounted","defaultProps","ServerLocation","url","BaseContext","Router","baseContext","locationContext","RouterImpl","_React$PureComponent","_props","_navigate2","primary","_props$component","domProps","Children","toArray","array","child","createRoute","clone","cloneElement","FocusWrapper","FocusHandler","wrapperProps","PureComponent","FocusContext","requestFocus","FocusHandlerImpl","initialRender","focusHandlerCount","_React$Component2","_temp2","_this4","_len2","_key2","shouldFocus","focus","myURIChanged","navigatedUpToMe","contains","activeElement","_this5","_props2","_props2$component","Comp","outline","tabIndex","n","k","C","_ref4","_ref5","_ref6","_props$getProps","anchorProps","encodedHref","event","shouldNavigate","_location$state","restState","RedirectRequest","o","redirectTo","RedirectImpl","_React$Component3","_props3","_props3$replace","noThrow","resolvedTo","_props4","Redirect","_ref7","Match","_ref8","_ref9","_ref10","resolvedPath","useNavigate","useParams","useMatch","stripSlashes","str","elementPath","Symbol","iterator","hashIndex","_inheritsLoose","_arrayLikeToArray","arr","len","arr2","_toConsumableArray","isArray","iter","minLen","toString","supportedPrefetchStrategy","feature","fakeLink","relList","supports","err","support","reject","link","setAttribute","onload","onerror","getElementsByTagName","getElementsByName","parentNode","appendChild","req","XMLHttpRequest","open","send","preFetched","prefetch","charAt","pathCache","Map","trimPathname","rawPathname","trimmedPathname","cleanPath","normalizePagePath","findPath","foundPath","Success","preferDefault","m","createPageDataUrl","s","__PATH_PREFIX__","doFetch","method","onreadystatechange","toPageResources","pageData","componentChunkName","staticQueryHashes","BaseLoader","loadComponent","inFlightNetworkRequests","pageDb","inFlightDb","staticQueryDb","pageDataDb","prefetchTriggered","Set","prefetchCompleted","memoizedGet","inFlightPromise","response","delete","prefetchDisabled","some","fetchPageDataJson","loadObj","retries","responseText","jsonPayload","payload","notFound","loadPageDataJson","loadAppData","allData","finalResult","componentChunkPromise","createdAt","staticQueryBatchPromise","staticQueryHash","staticQueryResultsMap","shouldPrefetch","connection","effectiveType","includes","saveData","doesConnectionSupportPrefetch","add","realPath","doPrefetch","getResourceURLsForPathname","createComponentUrls","isPageNotFound","appData","___chunkMapping","chunk","chunkName","pageDataUrl","prefetchHelper","crossOrigin","as","componentUrls","data","_loader","getResourcesForPathname","getResourcesForPathnameSync","offsetY","getTargetOffset","pageYOffset","body","clientTop","computedStyles","getComputedStyle","scrollMarginTop","getPropertyValue","getBoundingClientRect","parseInt","onInitialClientRender","pluginOptions","offset","_reactDom","scrollKey","ScrollContainerImplementation","findDOMNode","ProdPageRenderer","InternalPageRenderer","plugins","api","defaultReturn","argTransform","previous","next"],"mappings":"6FAEA,IAAIA,EAAyB,EAAQ,QAErCC,EAAQC,YAAa,EACrBD,EAAQE,WAAaA,EACrBF,EAAQG,gBA4DR,SAAyBC,GACvB,OAAOF,EAAWE,EAAMC,MA5D1BL,EAAQM,WAAaN,EAAQO,QAAUP,EAAQQ,KAAOR,EAAQS,SAAWT,EAAQU,aAAU,EAE3F,IAAIC,EAAiCZ,EAAuB,EAAQ,SAEhEa,EAAYb,EAAuB,EAAQ,SAE3Cc,EAA0Bd,EAAuB,EAAQ,SAEzDe,EAAkBf,EAAuB,EAAQ,SAEjDgB,EAAahB,EAAuB,EAAQ,SAE5CiB,EAASjB,EAAuB,EAAQ,SAExCkB,EAAU,EAAQ,QAElBC,EAAS,EAAQ,QAEjBC,EAAa,EAAQ,QAEzBnB,EAAQoB,UAAYD,EAAWC,UAE/B,IAAIC,EAAiB,SAAwBjB,GAC3C,OAAOA,aAAmC,EAASA,EAAKkB,WAAW,MAGrE,SAASpB,EAAWE,EAAMmB,GACxB,IAAIC,EAAMC,EAMV,QAJe,IAAXF,IACFA,EAASG,MAGNC,EAAYvB,GACf,OAAOA,EAGT,GAAIA,EAAKkB,WAAW,OAASlB,EAAKkB,WAAW,OAC3C,OAAOlB,EAGT,IAAIwB,EAAwG,QAAhGJ,EAA8B,QAAtBC,EAAUF,SAAgC,IAAZE,EAAqBA,EAAUpB,WAA4C,IAATmB,EAAkBA,EAAO,IAC7I,MAAO,KAAOI,aAAmC,EAASA,EAAKC,SAAS,MAAQD,EAAKE,MAAM,GAAI,GAAKF,IAASxB,EAAKkB,WAAW,KAAOlB,EAAO,IAAMA,GAKnJ,IAAIC,EAAsB,WACxB,MAAsH,UAGpHqB,EAAsB,WACxB,MAAkH,UAGhHC,EAAc,SAAqBvB,GACrC,OAAOA,IAASA,EAAKkB,WAAW,aAAelB,EAAKkB,WAAW,cAAgBlB,EAAKkB,WAAW,OAgBjG,IAAIS,EAAkB,SAAyB3B,EAAM4B,GACnD,MAAoB,iBAAT5B,EACFA,EAGJuB,EAAYvB,GAIViB,EAAejB,GAAQF,EAAWE,GAlB3C,SAAoBA,EAAM6B,GAExB,OAAIZ,EAAejB,GACVA,GAGF,EAAIc,EAAOgB,SAAS9B,EAAM6B,GAYgBE,CAAW/B,EAAM4B,GAHzD5B,GAMPgC,EAAmB,CACrBC,gBAAiBtB,EAAWL,QAAQ4B,OACpCC,YAAaxB,EAAWL,QAAQ8B,OAChCC,gBAAiB1B,EAAWL,QAAQgC,MAyBlCC,EAA0B,SAAUC,GAGtC,SAASD,EAAWE,GAClB,IAAIC,GAEJA,EAAQF,EAAiBG,KAAKC,KAAMH,IAAUG,MAExCC,gBAAkB,SAAUC,GAChC,IAAIC,EAAqBD,EAAMC,mBAC3BC,EAAYF,EAAME,UAEtB,OAAIN,EAAMD,MAAMJ,gBAAkBU,EAAqBC,GAC9C,CACLC,UAAW,CAACP,EAAMD,MAAMQ,UAAWP,EAAMD,MAAMR,iBAAiBiB,OAAOC,SAASC,KAAK,KACrFC,OAAO,EAAI7C,EAAUF,SAAS,GAAIoC,EAAMD,MAAMY,MAAOX,EAAMD,MAAMN,cAI9D,MAGT,IAAImB,GAAc,EAUlB,MARsB,oBAAXC,QAA0BA,OAAOC,uBAC1CF,GAAc,GAGhBZ,EAAMe,MAAQ,CACZH,YAAaA,GAEfZ,EAAMgB,UAAYhB,EAAMgB,UAAUC,MAAK,EAAIlD,EAAwBH,SAASoC,IACrEA,GA/BT,EAAIhC,EAAgBJ,SAASiC,EAAYC,GAkCzC,IAAIoB,EAASrB,EAAWsB,UAmHxB,OAjHAD,EAAOE,mBAAqB,SAA4BC,EAAWC,GAE7DpB,KAAKH,MAAMwB,KAAOF,EAAUE,IAAOrB,KAAKa,MAAMH,aAChDY,UAAUC,SAAQ,EAAIpD,EAAWC,WAAWW,EAAgBiB,KAAKH,MAAMwB,GAAIV,OAAOa,SAASC,WAAWA,WAI1GT,EAAOU,kBAAoB,WAEpB1B,KAAKa,MAAMH,aACdY,UAAUC,SAAQ,EAAIpD,EAAWC,WAAWW,EAAgBiB,KAAKH,MAAMwB,GAAIV,OAAOa,SAASC,WAAWA,WAI1GT,EAAOW,qBAAuB,WAC5B,GAAK3B,KAAK4B,GAAV,CAIA,IAAIC,EAAW7B,KAAK4B,GAChBE,EAAWD,EAASC,SACpBC,EAAKF,EAASE,GAClBD,EAASE,UAAUD,GACnBD,EAASG,eAGXjB,EAAOF,UAAY,SAAmBoB,GACpC,IAtFiEH,EAAII,EACnEP,EAqFEQ,EAASpC,KAETA,KAAKH,MAAMwC,UAAYrC,KAAKH,MAAMwC,SAASC,eAAe,WAC5DtC,KAAKH,MAAMwC,SAASpD,QAAUiD,EACrBlC,KAAKH,MAAMwC,UACpBrC,KAAKH,MAAMwC,SAASH,GAGlBlC,KAAKa,MAAMH,aAAewB,IAE5BlC,KAAK4B,IAhG0DG,EAgG1BG,EAhG8BC,EAgGzB,WACxCb,UAAUC,SAAQ,EAAIpD,EAAWC,WAAWW,EAAgBqD,EAAOvC,MAAMwB,GAAIV,OAAOa,SAASC,WAAWA,YAhG1GG,EAAK,IAAIjB,OAAOC,sBAAqB,SAAU2B,GACjDA,EAAQC,SAAQ,SAAUC,GACpBV,IAAOU,EAAMC,SAGXD,EAAME,gBAAkBF,EAAMG,kBAAoB,KACpDhB,EAAGI,UAAUD,GACbH,EAAGK,aACHE,YAMLU,QAAQd,GACJ,CACLD,SAAUF,EACVG,GAAIA,MAoFNf,EAAO8B,OAAS,WACd,IAAIC,EAAS/C,KAETgD,EAAchD,KAAKH,MACnBwB,EAAK2B,EAAY3B,GACjB4B,EAAuBD,EAAYE,SACnCA,OAAoC,IAAzBD,EAAkCjD,KAAKC,gBAAkBgD,EACpEE,EAAWH,EAAYI,QACvBC,EAAgBL,EAAYM,aAK5BzC,GAJmBmC,EAAY3D,gBAChB2D,EAAYzD,YACfyD,EAAYX,SACNW,EAAYvD,gBACtBuD,EAAYnC,OACpBtD,EAAUyF,EAAYzF,QACtBgG,GAAO,EAAI5F,EAA+BD,SAASsF,EAAa,CAAC,KAAM,WAAY,UAAW,eAAgB,kBAAmB,cAAe,WAAY,kBAAmB,QAAS,YAM5L,OAAoBhF,EAAON,QAAQ8F,cAAcvF,EAAQwF,SAAU,MAAM,SAAUC,GACjF,IAAIlC,EAAWkC,EAAMlC,SACjBmC,EAAa5E,EAAgBsC,EAAIG,EAASC,UAC9C,OAAO9C,EAAYgF,GAA2B3F,EAAON,QAAQ8F,cAAcvF,EAAQ2F,MAAM,EAAIhG,EAAUF,SAAS,CAC9G2D,GAAIsC,EACJ9C,MAAOA,EACPqC,SAAUA,EACVb,SAAUU,EAAOjC,UACjBwC,aAAc,SAAsBO,GAC9BR,GACFA,EAAcQ,GAGhBvC,UAAUwC,UAAS,EAAI3F,EAAWC,WAAWuF,GAAYlC,WAE3D2B,QAAS,SAAiBS,GAKxB,GAJIV,GACFA,EAASU,KAGM,IAAbA,EAAEE,QACLhB,EAAOlD,MAAM6C,QACbmB,EAAEG,kBACFH,EAAEI,SACFJ,EAAEK,QAAWL,EAAEM,SAAYN,EAAEO,UAAU,CACtCP,EAAEQ,iBACF,IAAIC,EAAgB/G,EAChB6C,EAAYmE,UAAUZ,KAAgBhD,OAAOa,SAASC,SAEnC,kBAAZlE,GAAyB6C,IAClCkE,GAAgB,GAKlB3D,OAAO6D,YAAYb,EAAY,CAC7B9C,MAAOA,EACPtD,QAAS+G,IAIb,OAAO,IAERf,IAAsBvF,EAAON,QAAQ8F,cAAc,KAAK,EAAI5F,EAAUF,SAAS,CAChF+G,KAAMd,GACLJ,QAIA5D,EAtJqB,CAuJ5B3B,EAAON,QAAQgH,WAEjB/E,EAAWgF,WAAY,EAAI/G,EAAUF,SAAS,GAAI0B,EAAkB,CAClEgE,QAASrF,EAAWL,QAAQkH,KAC5BvD,GAAItD,EAAWL,QAAQ4B,OAAOuF,WAC9BtH,QAASQ,EAAWL,QAAQgC,KAC5BmB,MAAO9C,EAAWL,QAAQ8B,SAG5B,IAAIsF,EAAyB,SAAgCC,EAAcC,EAAiBC,GAC1F,OAAOC,QAAQC,KAAK,QAAWJ,EAAe,6DAAgEE,EAAU,iBAAoBD,EAAkB,eAG5JI,EAAwBpH,EAAON,QAAQ2H,YAAW,SAAUxF,EAAOqC,GACrE,OAAoBlE,EAAON,QAAQ8F,cAAc7D,GAAY,EAAI/B,EAAUF,SAAS,CAClF2E,SAAUH,GACTrC,OAGL7C,EAAQU,QAAU0H,EAMlBpI,EAAQS,SAJO,SAAkB4D,EAAIiE,GACnC3E,OAAO6D,YAAYzF,EAAgBsC,EAAIV,OAAOa,SAASC,UAAW6D,IAKpE,IAAI9H,EAAO,SAAc6D,GACvByD,EAAuB,OAAQ,WAAY,GAE3CnE,OAAO4E,QAAQxG,EAAgBsC,EAAIV,OAAOa,SAASC,YAGrDzE,EAAQQ,KAAOA,EASfR,EAAQO,QAPM,SAAiB8D,GAC7ByD,EAAuB,UAAW,WAAY,GAE9CnE,OAAO6E,WAAWzG,EAAgBsC,EAAIV,OAAOa,SAASC,YAWxDzE,EAAQM,WALS,SAAoB+D,GAEnC,OADAyD,EAAuB,aAAc,WAAY,GAC1CtH,EAAK6D,K,oCC1TdrE,EAAQC,YAAa,EACrBD,EAAQyI,oBAAiB,EACzB,IAGIA,EAA8B,WAChC,SAASA,KAET,IAAIzE,EAASyE,EAAexE,UA8C5B,OA5CAD,EAAO0E,KAAO,SAAclE,EAAUmE,GACpC,IAAIC,EAAW5F,KAAK6F,YAAYrE,EAAUmE,GAE1C,IACE,IAAIG,EAAQnF,OAAOoF,eAAeC,QAAQJ,GAC1C,OAAOE,EAAQG,KAAKC,MAAMJ,GAAS,EACnC,MAAOjC,GAKP,OAAIlD,QAAUA,OAAiC,+BAAKA,OAAiC,8BAAEiF,GAC9EjF,OAAiC,8BAAEiF,GAGrC,IAIX5E,EAAOmF,KAAO,SAAc3E,EAAUmE,EAAKG,GACzC,IAAIF,EAAW5F,KAAK6F,YAAYrE,EAAUmE,GACtCS,EAAcH,KAAKI,UAAUP,GAEjC,IACEnF,OAAOoF,eAAeO,QAAQV,EAAUQ,GACxC,MAAOvC,GACHlD,QAAUA,OAAiC,gCAG7CA,OAAiC,8BAAI,IAFrCA,OAAiC,8BAAEiF,GAAYK,KAAKC,MAAME,KAYhEpF,EAAO6E,YAAc,SAAqBrE,EAAUmE,GAClD,IAAIY,EAhDe,YAgDwB/E,EAASC,SACpD,OAAOkE,QAA6CY,EAAeA,EAAe,IAAMZ,GAGnFF,EAjDyB,GAoDlCzI,EAAQyI,eAAiBA,G,uBC3DzB,IAAIe,EAAU,EAAQ,QAEtB,SAASC,IACP,GAAuB,mBAAZC,QAAwB,OAAO,KAC1C,IAAIC,EAAQ,IAAID,QAMhB,OAJAD,EAA2B,WACzB,OAAOE,GAGFA,EA4CTC,EAAO5J,QAzCP,SAAiC6J,GAC/B,GAAIA,GAAOA,EAAI5J,WACb,OAAO4J,EAGT,GAAY,OAARA,GAAiC,WAAjBL,EAAQK,IAAoC,mBAARA,EACtD,MAAO,CACL,QAAWA,GAIf,IAAIF,EAAQF,IAEZ,GAAIE,GAASA,EAAMG,IAAID,GACrB,OAAOF,EAAMI,IAAIF,GAGnB,IAAIG,EAAS,GACTC,EAAwBC,OAAOC,gBAAkBD,OAAOE,yBAE5D,IAAK,IAAIzB,KAAOkB,EACd,GAAIK,OAAOjG,UAAUqB,eAAevC,KAAK8G,EAAKlB,GAAM,CAClD,IAAI0B,EAAOJ,EAAwBC,OAAOE,yBAAyBP,EAAKlB,GAAO,KAE3E0B,IAASA,EAAKN,KAAOM,EAAKC,KAC5BJ,OAAOC,eAAeH,EAAQrB,EAAK0B,GAEnCL,EAAOrB,GAAOkB,EAAIlB,GAWxB,OANAqB,EAAgB,QAAIH,EAEhBF,GACFA,EAAMW,IAAIT,EAAKG,GAGVA,I,oCCjDThK,EAAQC,YAAa,EACrBD,EAAQuK,qBAQR,SAA8BC,GAC5B,IAAIhG,GAAW,EAAIvD,EAAQwJ,eACvB5G,GAAQ,EAAI7C,EAAO0J,YAAYC,EAAeC,eAC9C1F,GAAM,EAAIlE,EAAO6J,UAOrB,OANA,EAAI7J,EAAO8J,kBAAiB,WAC1B,GAAI5F,EAAIjD,QAAS,CACf,IAAI8I,EAAWlH,EAAM6E,KAAKlE,EAAUgG,GACpCtF,EAAIjD,QAAQ+I,SAAS,EAAGD,GAAY,MAErC,IACI,CACL7F,IAAKA,EACL+F,SAAU,WACJ/F,EAAIjD,SACN4B,EAAMsF,KAAK3E,EAAUgG,EAAYtF,EAAIjD,QAAQiJ,cApBrD,IAAIP,EAAiB,EAAQ,QAEzB3J,EAAS,EAAQ,QAEjBC,EAAU,EAAQ,S,oCCqDP,IC5DTkK,EDiBN,SAAcC,GAGb,OAFAA,EAAMA,GAAOlB,OAAOmB,OAAO,MAEpB,CAQNC,GAAI,SAAYC,EAAcC,IAC5BJ,EAAIG,KAAUH,EAAIG,GAAQ,KAAK/K,KAAKgL,IAUtCC,IAAK,SAAaF,EAAcC,GAC3BJ,EAAIG,IACPH,EAAIG,GAAMG,OAAON,EAAIG,GAAMI,QAAQH,KAAa,EAAG,IAYrDI,KAAM,SAAcL,EAAcM,IAChCT,EAAIG,IAAS,IAAIzJ,QAAQgK,KAAI,SAAUN,GAAWA,EAAQK,OAC1DT,EAAI,MAAQ,IAAItJ,QAAQgK,KAAI,SAAUN,GAAWA,EAAQD,EAAMM,QCvDnDE,GACDZ,O,qBCHfvB,EAAO5J,QAAUkK,OAAO8B,Q,oCCExBhM,EAAQC,YAAa,EACrBD,EAAQuK,qBAAuBvK,EAAQiM,gBAAkBjM,EAAQ4K,mBAAgB,EAEjF,IAAID,EAAiB,EAAQ,QAE7B3K,EAAQ4K,cAAgBD,EAAeuB,cAEvC,IAAIC,EAAmB,EAAQ,QAE/BnM,EAAQiM,gBAAkBE,EAAiBF,gBAE3C,IAAIG,EAAwB,EAAQ,QAEpCpM,EAAQuK,qBAAuB6B,EAAsB7B,sB,qBCArDX,EAAO5J,QAfP,SAAuCqM,EAAQC,GAC7C,GAAc,MAAVD,EAAgB,MAAO,GAC3B,IAEI1D,EAAK4D,EAFL7G,EAAS,GACT8G,EAAatC,OAAOuC,KAAKJ,GAG7B,IAAKE,EAAI,EAAGA,EAAIC,EAAWE,OAAQH,IACjC5D,EAAM6D,EAAWD,GACbD,EAASX,QAAQhD,IAAQ,IAC7BjD,EAAOiD,GAAO0D,EAAO1D,IAGvB,OAAOjD,I,qBCZT1F,EAAQ2M,SAAW,SAAAjF,GAAS,OAAIA,I,oCCAhC,4IAAIkF,EAAW1C,OAAO8B,QAAU,SAAUtG,GAAU,IAAK,IAAI6G,EAAI,EAAGA,EAAIM,UAAUH,OAAQH,IAAK,CAAE,IAAIF,EAASQ,UAAUN,GAAI,IAAK,IAAI5D,KAAO0D,EAAcnC,OAAOjG,UAAUqB,eAAevC,KAAKsJ,EAAQ1D,KAAQjD,EAAOiD,GAAO0D,EAAO1D,IAAY,OAAOjD,GAEnPoH,EAAc,SAAqBT,GACrC,IAAIU,EAAmBV,EAAO7H,SAC1BwI,EAASD,EAAiBC,OAC1BC,EAAOF,EAAiBE,KACxBxF,EAAOsF,EAAiBtF,KACxByF,EAASH,EAAiBG,OAC1BC,EAAWJ,EAAiBI,SAC5BC,EAAOL,EAAiBK,KACxBC,EAAWN,EAAiBM,SAC5BC,EAAOP,EAAiBO,KACxB7I,EAAW4H,EAAO7H,SAASC,UAG1BA,GAAYgD,GAAQ8F,IAEvB9I,EADU,IAAI+I,IAAI/F,GACHhD,UAGjB,MAAO,CACLA,SAAU8C,UAAUkG,UAAUhJ,IAC9BuI,OAAQA,EACRC,KAAMA,EACNxF,KAAMA,EACNyF,OAAQA,EACRC,SAAUA,EACVC,KAAMA,EACNC,SAAUA,EACVC,KAAMA,EACNzJ,MAAOwI,EAAOqB,QAAQ7J,MACtB8E,IAAK0D,EAAOqB,QAAQ7J,OAASwI,EAAOqB,QAAQ7J,MAAM8E,KAAO,YAIzDgF,EAAgB,SAAuBtB,EAAQ/D,GACjD,IAAIsF,EAAY,GACZpJ,EAAWsI,EAAYT,GACvBwB,GAAgB,EAChBC,EAAoB,aAExB,MAAO,CACL,eACE,OAAOtJ,GAGT,oBACE,OAAOqJ,GAGTE,sBAAuB,WACrBF,GAAgB,EAChBC,KAEFE,OAAQ,SAAgBC,GACtBL,EAAUpN,KAAKyN,GAEf,IAAIC,EAAmB,WACrB1J,EAAWsI,EAAYT,GACvB4B,EAAS,CAAEzJ,SAAUA,EAAU2J,OAAQ,SAKzC,OAFA9B,EAAO+B,iBAAiB,WAAYF,GAE7B,WACL7B,EAAOgC,oBAAoB,WAAYH,GACvCN,EAAYA,EAAUtK,QAAO,SAAUgL,GACrC,OAAOA,IAAOL,OAIpBxN,SAAU,SAAkB4D,GAC1B,IAAI7C,EAAOqL,UAAUH,OAAS,QAAsB6B,IAAjB1B,UAAU,GAAmBA,UAAU,GAAK,GAC3EhJ,EAAQrC,EAAKqC,MACb2K,EAAehN,EAAKjB,QACpBA,OAA2BgO,IAAjBC,GAAqCA,EAEnD,GAAkB,iBAAPnK,EACTgI,EAAOqB,QAAQe,GAAGpK,OACb,CACLR,EAAQ+I,EAAS,GAAI/I,EAAO,CAAE8E,IAAK+F,KAAKC,MAAQ,KAEhD,IACMd,GAAiBtN,EACnB8L,EAAOqB,QAAQkB,aAAa/K,EAAO,KAAMQ,GAEzCgI,EAAOqB,QAAQmB,UAAUhL,EAAO,KAAMQ,GAExC,MAAOwC,GACPwF,EAAO7H,SAASjE,EAAU,UAAY,UAAU8D,IAIpDG,EAAWsI,EAAYT,GACvBwB,GAAgB,EAChB,IAAIiB,EAAa,IAAIC,SAAQ,SAAUC,GACrC,OAAOlB,EAAoBkB,KAK7B,OAHApB,EAAUpI,SAAQ,SAAUyI,GAC1B,OAAOA,EAAS,CAAEzJ,SAAUA,EAAU2J,OAAQ,YAEzCW,KAOTG,EAAqB,WACvB,IAAIC,EAAcrC,UAAUH,OAAS,QAAsB6B,IAAjB1B,UAAU,GAAmBA,UAAU,GAAK,IAElFsC,EAAcD,EAAYvD,QAAQ,KAClCyD,EAAkB,CACpB3K,SAAU0K,GAAe,EAAID,EAAYG,OAAO,EAAGF,GAAeD,EAClElC,OAAQmC,GAAe,EAAID,EAAYG,OAAOF,GAAe,IAE3DG,EAAQ,EACRC,EAAQ,CAACH,GACTI,EAAS,CAAC,MAEd,MAAO,CACL,eACE,OAAOD,EAAMD,IAEflB,iBAAkB,SAA0BqB,EAAMnB,KAClDD,oBAAqB,SAA6BoB,EAAMnB,KAExDZ,QAAS,CACP,cACE,OAAO6B,GAET,YACE,OAAOD,GAET,YACE,OAAOE,EAAOF,IAEhBT,UAAW,SAAmBhL,EAAO6L,EAAGC,GACtC,IAAIC,EAAaD,EAAIE,MAAM,KACvBpL,EAAWmL,EAAW,GACtBE,EAAcF,EAAW,GACzB5C,OAAyBuB,IAAhBuB,EAA4B,GAAKA,EAE9CR,IACAC,EAAM/O,KAAK,CAAEiE,SAAUA,EAAUuI,OAAQA,EAAON,OAAS,IAAMM,EAASA,IACxEwC,EAAOhP,KAAKqD,IAEd+K,aAAc,SAAsB/K,EAAO6L,EAAGC,GAC5C,IAAII,EAAcJ,EAAIE,MAAM,KACxBpL,EAAWsL,EAAY,GACvBC,EAAeD,EAAY,GAC3B/C,OAA0BuB,IAAjByB,EAA6B,GAAKA,EAE/CT,EAAMD,GAAS,CAAE7K,SAAUA,EAAUuI,OAAQA,GAC7CwC,EAAOF,GAASzL,GAElB4K,GAAI,SAAYpK,GACd,IAAI4L,EAAWX,EAAQjL,EAEnB4L,EAAW,GAAKA,EAAWT,EAAO9C,OAAS,IAI/C4C,EAAQW,OASZ1C,IAAiC,oBAAX5J,SAA0BA,OAAOuM,WAAYvM,OAAOuM,SAAS1J,eAKnF2J,EAAgBxC,EAHXJ,EAAY5J,OAASsL,KAI1BxO,EAAW0P,EAAc1P,U,kCChL7B,IAAI2P,EAA0B,EAAQ,QAElCrQ,EAAyB,EAAQ,QAErCC,EAAQC,YAAa,EACrBD,EAAQkM,cAAgBlM,EAAQ4K,mBAAgB,EAEhD,IAAI/J,EAA0Bd,EAAuB,EAAQ,SAEzDe,EAAkBf,EAAuB,EAAQ,SAEjDsQ,EAAQD,EAAwB,EAAQ,SAExCrP,EAAahB,EAAuB,EAAQ,SAE5CuQ,EAAkB,EAAQ,QAE1B1F,EAAgByF,EAAME,cAAc,IAAID,EAAgB7H,gBAC5DzI,EAAQ4K,cAAgBA,EACxBA,EAAc4F,YAAc,sBAE5B,IAAItE,EAA6B,SAAUtJ,GAGzC,SAASsJ,IAGP,IAFA,IAAIpJ,EAEK2N,EAAO5D,UAAUH,OAAQgE,EAAO,IAAIC,MAAMF,GAAOG,EAAO,EAAGA,EAAOH,EAAMG,IAC/EF,EAAKE,GAAQ/D,UAAU+D,GAuCzB,OApCA9N,EAAQF,EAAiBG,KAAK8N,MAAMjO,EAAkB,CAACI,MAAM8N,OAAOJ,KAAU1N,MACxE+N,cAAgB,IAAIT,EAAgB7H,eAE1C3F,EAAMkO,eAAiB,WACrB,IAAIrI,EAAM7F,EAAMD,MAAM2B,SAASmE,IAE3BA,GACF7F,EAAMiO,cAAc5H,KAAKrG,EAAMD,MAAM2B,SAAUmE,EAAKhF,OAAOsN,UAI/DnO,EAAMoO,aAAe,SAAUnG,EAAU5G,GACnCrB,EAAMqO,mBAAmBhN,EAAWrB,EAAMD,QAC5Cc,OAAOqH,SAAS,EAAGD,IAIvBjI,EAAMsO,aAAe,SAAUnE,EAAM9I,GACnC,IAAIkN,EAAOnB,SAASoB,eAAerE,EAAKsE,UAAU,IAE9CF,GAAQvO,EAAMqO,mBAAmBhN,EAAWrB,EAAMD,QACpDwO,EAAKG,kBAIT1O,EAAMqO,mBAAqB,SAAUM,EAAiBC,GACpD,IAAIP,EAAqBrO,EAAMD,MAAMsO,mBAErC,OAAKA,GAKEA,EAAmBpO,MAAK,EAAIlC,EAAwBH,SAASoC,GAAQ2O,EAAiBC,IAGxF5O,GA7CT,EAAIhC,EAAgBJ,SAASwL,EAAetJ,GAgD5C,IAAIoB,EAASkI,EAAcjI,UA+C3B,OA7CAD,EAAOU,kBAAoB,WAEzB,IAAIiN,EADJhO,OAAOyK,iBAAiB,SAAUpL,KAAKgO,gBAEvC,IAAIY,EAAuB5O,KAAKH,MAAM2B,SAClCmE,EAAMiJ,EAAqBjJ,IAC3BsE,EAAO2E,EAAqB3E,KAE5BtE,IACFgJ,EAAiB3O,KAAK+N,cAAcrI,KAAK1F,KAAKH,MAAM2B,SAAUmE,IAG5DgJ,EACF3O,KAAKkO,aAAaS,OAAgBpD,GACzBtB,GACTjK,KAAKoO,aAAa3D,UAAUR,QAAOsB,IAIvCvK,EAAOW,qBAAuB,WAC5BhB,OAAO0K,oBAAoB,SAAUrL,KAAKgO,iBAG5ChN,EAAOE,mBAAqB,SAA4BC,GACtD,IAGIwN,EAHAE,EAAwB7O,KAAKH,MAAM2B,SACnCyI,EAAO4E,EAAsB5E,KAC7BtE,EAAMkJ,EAAsBlJ,IAG5BA,IACFgJ,EAAiB3O,KAAK+N,cAAcrI,KAAK1F,KAAKH,MAAM2B,SAAUmE,IAG5DsE,GAA2B,IAAnB0E,EACV3O,KAAKoO,aAAa3D,UAAUR,GAAO9I,GAEnCnB,KAAKkO,aAAaS,EAAgBxN,IAItCH,EAAO8B,OAAS,WACd,OAAoBuK,EAAM7J,cAAcoE,EAAckH,SAAU,CAC9DhJ,MAAO9F,KAAK+N,eACX/N,KAAKH,MAAMkP,WAGT7F,EAhGwB,CAiG/BmE,EAAM3I,WAER1H,EAAQkM,cAAgBA,EACxBA,EAAcvE,UAAY,CACxBwJ,mBAAoBpQ,EAAWL,QAAQkH,KACvCmK,SAAUhR,EAAWL,QAAQsR,QAAQnK,WACrCrD,SAAUzD,EAAWL,QAAQ8B,OAAOqF,a,+FCxHhCoK,E,kGACJnM,OAAA,WACE,IAAMjD,EAAK,iBACNG,KAAKH,MADC,CAETqP,YAAalP,KAAKH,MAAMsP,cAQpBC,EALuBC,oBAAU,2BAA4B,CACjExP,MAAOG,KAAKH,MACZyP,OAAQC,iBARH,IAaL/L,wBAAcxD,KAAKH,MAAM2P,cAAcC,UAA1B,iBACR5P,EADQ,CAEX8F,IAAK3F,KAAKH,MAAMzC,MAAQ4C,KAAKH,MAAM2P,cAAcE,KAAKtS,QAY1D,OAToBiS,oBAAU,kBAE5B,CAAEL,QAASI,EAAavP,SACxBuP,GACA,YACE,MAAO,CAAEJ,QADK,EAAbW,OACyB9P,YAE5B+P,O,GA1BqBvC,IAAM3I,WAuClBuK,O,kCC7Cf,2UAII3Q,EAAa,SAAoBgB,EAAQ0K,GAC3C,OAAO1K,EAAO+M,OAAO,EAAGrC,EAAON,UAAYM,GAwBzC6F,EAAO,SAAcC,EAAQnD,GAW/B,IAVA,IAAIoD,OAAQ,EACRC,OAAW,EAGXC,EADatD,EAAIE,MAAM,KACE,GAEzBqD,EAAcC,EAAWF,GACzBG,EAA+B,KAAnBF,EAAY,GACxBG,EAASC,EAAWR,GAEfvG,EAAI,EAAGgH,EAAIF,EAAO3G,OAAQH,EAAIgH,EAAGhH,IAAK,CAC7C,IAAIiH,GAAS,EACTC,EAAQJ,EAAO9G,GAAGkH,MAEtB,GAAIA,EAAM/S,QACRsS,EAAW,CACTS,MAAOA,EACPC,OAAQ,GACR/D,IAAKA,OAJT,CAcA,IALA,IAAIgE,EAAgBR,EAAWM,EAAMrT,MACjCsT,EAAS,GACTE,EAAMC,KAAKD,IAAIV,EAAYxG,OAAQiH,EAAcjH,QACjD4C,EAAQ,EAELA,EAAQsE,EAAKtE,IAAS,CAC3B,IAAIwE,EAAeH,EAAcrE,GAC7ByE,EAAab,EAAY5D,GAE7B,GAAI0E,EAAQF,GAAe,CAKzBJ,EADYI,EAAahS,MAAM,IAAM,KACrBoR,EAAYpR,MAAMwN,GAAOxD,IAAImI,oBAAoBzQ,KAAK,KACtE,MAGF,QAAmB+K,IAAfwF,EAA0B,CAI5BP,GAAS,EACT,MAGF,IAAIU,EAAeC,EAAQC,KAAKN,GAEhC,GAAII,IAAiBd,EAAW,EACuC,IAA5CiB,EAAc1I,QAAQuI,EAAa,KAC6J,KAAU,GACnO,IAAIpL,EAAQmL,mBAAmBF,GAC/BL,EAAOQ,EAAa,IAAMpL,OACrB,GAAIgL,IAAiBC,EAAY,CAItCP,GAAS,EACT,OAIJ,IAAKA,EAAQ,CACXT,EAAQ,CACNU,MAAOA,EACPC,OAAQA,EACR/D,IAAK,IAAMuD,EAAYpR,MAAM,EAAGwN,GAAO9L,KAAK,MAE9C,QAIJ,OAAOuP,GAASC,GAAY,MAK1BD,EAAQ,SAAe3S,EAAMuP,GAC/B,OAAOkD,EAAK,CAAC,CAAEzS,KAAMA,IAASuP,IA6B5BzN,EAAU,SAAiBmC,EAAIzC,GAEjC,GAAIN,EAAW+C,EAAI,KACjB,OAAOA,EAGT,IAAIiQ,EAAYjQ,EAAGwL,MAAM,KACrB0E,EAAaD,EAAU,GACvBE,EAAUF,EAAU,GAGpBG,EADc7S,EAAKiO,MAAM,KACE,GAE3B6E,EAAavB,EAAWoB,GACxBI,EAAexB,EAAWsB,GAG9B,GAAsB,KAAlBC,EAAW,GACb,OAAOE,EAASH,EAAcD,GAIhC,IAAKlT,EAAWoT,EAAW,GAAI,KAAM,CACnC,IAAIjQ,EAAWkQ,EAAa7D,OAAO4D,GAAYlR,KAAK,KACpD,OAAOoR,GAA2B,MAAjBH,EAAuB,GAAK,KAAOhQ,EAAU+P,GAUhE,IAFA,IAAIK,EAAcF,EAAa7D,OAAO4D,GAClCI,EAAW,GACNvI,EAAI,EAAGgH,EAAIsB,EAAYnI,OAAQH,EAAIgH,EAAGhH,IAAK,CAClD,IAAIwI,EAAUF,EAAYtI,GACV,OAAZwI,EAAkBD,EAASlC,MAA2B,MAAZmC,GAAiBD,EAAStU,KAAKuU,GAG/E,OAAOH,EAAS,IAAME,EAAStR,KAAK,KAAMgR,IAMxCQ,EAAe,SAAsB5U,EAAMsT,GAC7C,IAAIuB,EAAc7U,EAAKyP,MAAM,KACzBqF,EAAWD,EAAY,GACvBE,EAAeF,EAAY,GAC3BG,OAAyB7G,IAAjB4G,EAA6B,GAAKA,EAG1CE,EAAkB,IADPlC,EAAW+B,GACWpJ,KAAI,SAAUiJ,GACjD,IAAIhC,EAAQoB,EAAQC,KAAKW,GACzB,OAAOhC,EAAQW,EAAOX,EAAM,IAAMgC,KACjCvR,KAAK,KACJ8R,EAAmB5B,EAAOlP,SAE1B+Q,GADJD,OAAwC/G,IAArB+G,EAAiC,GAAKA,GACZtI,OAGzCwI,QAFmCjH,IAA1BgH,EAAsC,GAAKA,GAE/B1F,MAAM,KAAK,IAAM,GAE1C,OADAwF,EAAkBT,EAASS,EAAiBD,EAAOI,IAIjDC,EAAmB,SAA0BC,EAAMrR,GACrD,IAAIf,EAAS,SAAgByR,GAC3B,OAAOY,EAAUZ,IAInB,OAFiB5B,EAAWuC,GAAMpS,OAAOA,GAAQsS,OAAOpS,KAAK,OAC9C2P,EAAW9O,GAAIf,OAAOA,GAAQsS,OAAOpS,KAAK,MAMvD2Q,EAAU,SAWVwB,EAAY,SAAmBZ,GACjC,OAAOZ,EAAQ0B,KAAKd,IAElBf,EAAU,SAAiBe,GAC7B,OAAOA,GAA0B,MAAfA,EAAQ,IAGxBe,EAAY,SAAmBrC,EAAOnE,GAMxC,MAAO,CAAEmE,MAAOA,EAAOsC,MALXtC,EAAM/S,QAAU,EAAIyS,EAAWM,EAAMrT,MAAM4V,QAAO,SAAUD,EAAOhB,GAG7E,OAFAgB,GAlBiB,GAMD,SAAuBhB,GACzC,MAAmB,KAAZA,EAYDkB,CAAclB,GAAwCY,EAAUZ,GAAUgB,GAjB7D,EAiB8F/B,EAAQe,GAAUgB,GAASG,EAAoCH,GAlB9J,EAkBYA,GAfd,EAgBPA,IACN,GACkCzG,MAAOA,IAG1CgE,EAAa,SAAoBR,GACnC,OAAOA,EAAOhH,IAAIgK,GAAWF,MAAK,SAAUO,EAAGC,GAC7C,OAAOD,EAAEJ,MAAQK,EAAEL,MAAQ,EAAII,EAAEJ,MAAQK,EAAEL,OAAS,EAAII,EAAE7G,MAAQ8G,EAAE9G,UAIpE6D,EAAa,SAAoBxD,GACnC,OAAOA,EAENpP,QAAQ,eAAgB,IAAIsP,MAAM,MAGjC+E,EAAW,SAAkBnQ,GAC/B,IAAK,IAAIgM,EAAO5D,UAAUH,OAAQ0I,EAAQzE,MAAMF,EAAO,EAAIA,EAAO,EAAI,GAAIG,EAAO,EAAGA,EAAOH,EAAMG,IAC/FwE,EAAMxE,EAAO,GAAK/D,UAAU+D,GAM9B,OAAOnM,IAHP2Q,EAAQA,EAAM9R,QAAO,SAAU+S,GAC7B,OAAOA,GAAKA,EAAE3J,OAAS,OAEG0I,EAAM1I,OAAS,EAAI,IAAM0I,EAAM5R,KAAK,KAAO,KAGrE6Q,EAAgB,CAAC,MAAO,QAOxBiC,EAAiB,SAAwBC,EAAMC,GACjD,IAAIC,EAAWvM,OAAOuC,KAAK8J,GAC3B,OAAOE,EAAS/J,SAAWxC,OAAOuC,KAAK+J,GAAM9J,QAAU+J,EAASC,OAAM,SAAU/N,GAC9E,OAAO6N,EAAKlR,eAAeqD,IAAQ4N,EAAK5N,KAAS6N,EAAK7N,Q,qBCrR1DiB,EAAO5J,QAAU,CAAC,CACZ2W,OAAQC,EAAQ,QAChBtO,QAAS,CAAC,QAAU,O,qBCGUsB,EAAO5J,QAI5B,WACb,IAAI6W,GAAO,GACsC,IAA7CC,UAAUC,WAAWpL,QAAQ,aAC/BkL,GAAO,GAGT,IACE5I,EADE+I,EAAM,GAERC,EAA0B,iBAAb/G,UAAyBA,SACtCgH,EAAOL,EACHI,EAAIE,gBAAgBC,SAAS,QAC7BH,EAAIE,gBAAgBC,SAExBC,EACEJ,IAAQC,EAAO,aAAe,iBAAiBrB,KAAKoB,EAAIK,YAY5D,OAVKD,GAAUJ,GACbA,EAAI7I,iBALe,mBAOhBH,EAAW,WAGV,IAFAgJ,EAAI5I,oBARW,mBAQ2BJ,GAC1CoJ,EAAS,EACDpJ,EAAW+I,EAAIO,SAAUtJ,MAIhC,SAASK,GACd+I,EAASG,WAAWlJ,EAAI,GAAK0I,EAAIxW,KAAK8N,IA/BWmJ,I,kCCLrD,uBAGE,WAAA9T,OAAOa,SAAS2I,UAChB,cAAAxJ,OAAOa,SAAS6I,SAEhBnF,QAAQwP,MAAR,gFAGS,kBAAmBZ,WAC5BA,UAAUa,cACPC,SAAYC,gBACZC,MAAK,SAAUC,GACdA,EAAI3J,iBAAJ,eAAoC,WAClCiE,oBAAU,6BAA8B,CAAEsF,cAAeI,IAGzD,IAAMC,EAAmBD,EAAIE,WAC7B/P,QAAQgQ,IAAR,mBAAgCF,GAChCA,EAAiB5J,iBAAjB,eAAiD,WAC/C,OAAQ4J,EAAiBnU,OACvB,IAAI,YACEiT,UAAUa,cAAcQ,YAK1BxU,OAAOyU,cAAe,EAEtB/F,oBAAU,6BAA8B,CAAEsF,cAAeI,IAGrDpU,OAAO0U,qBACTnQ,QAAQgQ,IAAR,4CACAvU,OAAOa,SAAS8T,YAKlBpQ,QAAQgQ,IAAR,qCAKA7F,oBAAU,2BAA4B,CAAEsF,cAAeI,KAEzD,MAEF,IAAI,YACF7P,QAAQwP,MAAR,mDACArF,oBAAU,2BAA4B,CAAEsF,cAAeI,IACvD,MAEF,IAAI,YACF1F,oBAAU,wBAAyB,CAAEsF,cAAeI,cAM7DQ,OAAM,SAAU1R,GACfqB,QAAQwP,MAAR,4CAA2D7Q,O,mBCrDjE+C,EAAO5J,QARP,SAAgCwY,GAC9B,QAAa,IAATA,EACF,MAAM,IAAIC,eAAe,6DAG3B,OAAOD,I,kCC2CT5O,EAAO5J,QA5BS,SAAS0Y,EAAWC,EAAQxC,EAAGC,EAAGwC,EAAGC,EAAGhS,EAAGiS,GAOzD,IAAKJ,EAAW,CACd,IAAIhB,EACJ,QAAenJ,IAAXoK,EACFjB,EAAQ,IAAIqB,MACV,qIAGG,CACL,IAAIrI,EAAO,CAACyF,EAAGC,EAAGwC,EAAGC,EAAGhS,EAAGiS,GACvBE,EAAW,GACftB,EAAQ,IAAIqB,MACVJ,EAAOpY,QAAQ,OAAO,WAAa,OAAOmQ,EAAKsI,UAE3CvJ,KAAO,sBAIf,MADAiI,EAAMuB,YAAc,EACdvB,K,mBCtCV9N,EAAO5J,QANP,SAAgC6J,GAC9B,OAAOA,GAAOA,EAAI5J,WAAa4J,EAAM,CACnC,QAAWA,K,4MCAFqP,EAAsB,CACjCC,GAAG,mBACH1V,MAAO,CACLsH,SAAS,WACTqO,IAAK,EACLC,MAAO,EACPC,OAAQ,EACRC,QAAS,EACTC,SAAS,SACTC,KAAK,mBACLC,WAAW,SACXC,OAAQ,GAEV,YAAY,YACZ,cAAc,Q,wBCJVC,EAAcC,EAAU7D,QAAO,SAAClK,EAAKgO,GAEzC,OADAhO,EAAIgO,EAASC,UAAYD,EAClBhO,IACN,IAEH,SAASkO,EAAcvV,GACrB,IAAMqV,EAAWF,EAAYnV,GAE7B,OAAgB,MAAZqV,IASFnW,OAAO6E,WAAWsR,EAASG,SACpB,GAMX,IAAMC,EAAmB,SAAC1V,EAAU2V,GAC7BH,EAAcxV,EAASC,WAC1B4N,oBAAU,mBAAoB,CAAE7N,WAAU2V,kBAIxCC,EAAgB,SAAC5V,EAAU2V,GAC1BH,EAAcxV,EAASC,WAC1B4N,oBAAU,gBAAiB,CAAE7N,WAAU2V,kBAIrC1Z,EAAW,SAAC4D,EAAIiE,GAIpB,QAJqC,IAAjBA,MAAU,IAI1B,iBAAOjE,EAAX,CAJqC,IAS/BI,EAAarD,oBAAUiD,GAAvBI,SACAqV,EAAWF,EAAYnV,GAW7B,GAPIqV,IACFzV,EAAKyV,EAASG,OACdxV,EAAWrD,oBAAUiD,GAAII,UAKvBd,OAAOyU,aACTzU,OAAOa,SAAWC,MADpB,CAOA,IAAM4V,EAAY7C,YAAW,WAC3BrM,IAAQS,KAAR,6BAA2C,CAAEnH,aAC7C4N,oBAAU,uBAAwB,CAChC7N,SAAUb,OAAOa,aAElB,KAEH8N,UAAOgI,SAAS7V,GAAUqT,MAAK,SAAAtF,GAO7B,IAAKA,GAAiBA,EAAc+H,SAAWC,qBAAmBzB,MAIhE,OAHApV,OAAO+J,QAAQkB,aAAa,GAA5B,GAAoCpK,SAASiD,MAC7C9D,OAAOa,SAAWC,OAClBgW,aAAaJ,GAM8B7H,GAEzCA,EAAcE,KAAKgI,yBACnB/W,OAAOgX,4BAIL,kBAAmB7D,WACoB,OAAvCA,UAAUa,cAAcQ,YACxB,cAAArB,UAAUa,cAAcQ,WAAWtU,OAEnCiT,UAAUa,cAAcQ,WAAWyC,YAAY,CAC7CC,UAAU,uBAId3S,QAAQgQ,IAAR,iDACAvU,OAAOa,SAAWC,GAGtBqW,mBAAczW,EAAIiE,GAClBmS,aAAaJ,YAnEblK,IAAc1P,SAAS4D,IAuE3B,SAAS8M,EAAmBM,EAA5B,GAA4D,IAAD,OAAZjN,EAAY,EAAZA,SACrCC,EAAmBD,EAAnBC,SAAUwI,EAASzI,EAATyI,KACZ8N,EAAU1I,oBAAU,qBAAsB,CAC9CZ,kBAEAhN,WACAiN,YAAa,CAAElN,YACfwW,uBAAwB,SAAAtK,GAAI,OAAI,EAAKK,cAAcrI,KAAKgI,MAE1D,GAAIqK,EAAQrO,OAAS,EAGnB,OAAOqO,EAAQA,EAAQrO,OAAS,GAGlC,GAAI+E,GAGEA,EADFjN,SAAYC,WAEMA,EAGlB,OAAOwI,EAAOQ,UAAUR,EAAKnL,MAAM,IAAM,CAAC,EAAG,GAGjD,OAAO,E,IAkBHmZ,E,YACJ,WAAYpY,GAAQ,IAAD,SACjB,cAAMA,IAAN,MACKqY,gBAAkB7K,IAAM8K,YAFZ,E,4CAKnBjX,mBAAA,SAAmBC,EAAWiX,GAAY,IAAD,OACvCC,uBAAsB,WACpB,IAAIC,EAAQ,eAAkB,EAAKzY,MAAM2B,SAASC,SAC9CyL,SAASqL,QACXD,EAAWpL,SAASqL,OAEtB,IAAMC,EAAetL,SAASuL,iBAAT,4BACjBD,GAAgBA,EAAa9O,SAC/B4O,EAAWE,EAAa,GAAGE,aAE7B,IAAMC,EAAe,gBAAmBL,EACpC,EAAKJ,gBAAgBjZ,UACC,EAAKiZ,gBAAgBjZ,QAAQ2Z,YAC7BD,IACtB,EAAKT,gBAAgBjZ,QAAQ2Z,UAAYD,Q,EAMjD7V,OAAA,WACE,OAAO,yCAASoT,EAAT,CAA8BhU,IAAKlC,KAAKkY,oB,GA3BtB7K,IAAM3I,WAgC7BmU,E,YACJ,WAAYhZ,GAAQ,IAAD,SACjB,cAAMA,IAAN,KACAqX,EAAiBrX,EAAM2B,SAAU,MAFhB,E,4CAKnBE,kBAAA,WACE0V,EAAcpX,KAAKH,MAAM2B,SAAU,O,EAGrCN,mBAAA,SAAmBC,EAAWC,EAAW0X,GACnCA,GACF1B,EAAcpX,KAAKH,MAAM2B,SAAUL,EAAUK,W,EAIjDuX,wBAAA,SAAwB5X,GACtB,OAAInB,KAAKH,MAAM2B,SAASC,WAAaN,EAAUK,SAASC,WACtDyV,EAAiBlX,KAAKH,MAAM2B,SAAUL,EAAUK,WACzC,I,EAMXsB,OAAA,WACE,OACE,kBAAC,IAAMkW,SAAP,KACGhZ,KAAKH,MAAMkP,SACZ,kBAAC,EAAD,CAAgBvN,SAAUA,a,GA7BP6L,IAAM3I,W,iCCrMjC,SAASuU,EAAe9F,EAAGC,GACzB,IAAK,IAAI7J,KAAK4J,EACZ,KAAM5J,KAAK6J,GAAI,OAAO,EACvB,IAAK,IAAI8F,KAAM9F,EACd,GAAID,EAAE+F,KAAQ9F,EAAE8F,GAAK,OAAO,EAC7B,OAAO,EAGM,IC8EDC,E,YAnFb,WAAYtZ,GAAQ,IAAD,EACjB,qBADiB,IAET2B,EAA4B3B,EAA5B2B,SAAUgO,EAAkB3P,EAAlB2P,cAFD,OAGjB,EAAK3O,MAAQ,CACXW,SAAS,OAAD,UAAOA,GACfgO,cAAeA,GAAiBF,UAAO8J,aAAa5X,EAASC,WAL9C,E,mBASZ4X,yBAAP,WAA8CjY,GAAY,IAAxBI,EAAuB,EAAvBA,SAChC,OAAIJ,EAAUI,SAASiD,OAASjD,EAASiD,KAEhC,CACL+K,cAFoBF,UAAO8J,aAAa5X,EAASC,UAGjDD,SAAS,OAAD,UAAOA,IAIZ,CACLA,SAAS,OAAD,UAAOA,K,2BAInB8X,cAAA,SAAcC,GAAU,IAAD,OACrBjK,UAAOgI,SAASiC,GAASzE,MAAK,SAAAtF,GACxBA,GAAiBA,EAAc+H,SAAWC,qBAAmBzB,MAC/D,EAAKyD,SAAS,CACZhY,SAAS,OAAD,UAAOb,OAAOa,UACtBgO,mBAGF7O,OAAO+J,QAAQkB,aAAa,GAA5B,GAAoCpK,SAASiD,MAC7C9D,OAAOa,SAAW+X,O,EAKxBE,sBAAA,SAAsBrB,EAAWsB,GAE/B,OAAKA,EAAUlK,cAMXxP,KAAKa,MAAM2O,gBAAkBkK,EAAUlK,gBAIzCxP,KAAKa,MAAM2O,cAAcC,YAAciK,EAAUlK,cAAcC,YAK7DzP,KAAKa,MAAM2O,cAAcmK,OAASD,EAAUlK,cAAcmK,SAM5D3Z,KAAKa,MAAMW,SAASmE,MAAQ+T,EAAUlY,SAASmE,MAC/C+T,EAAUlK,cAAcE,OACvBgK,EAAUlK,cAAcE,KAAKkK,YAC5BF,EAAUlK,cAAcE,KAAKtS,OD1DrB,gBACd,OAAO6b,EAAenX,EAASjC,MAAOuY,IAAca,EAAenX,EAASjB,MAAO6Y,GC6D1EpG,CAAetT,KAAMoY,EAAWsB,OA3BrC1Z,KAAKsZ,cAAclB,EAAU5W,SAASC,WAC/B,I,EA6BXqB,OAAA,WASE,OAAO9C,KAAKH,MAAMkP,SAAS/O,KAAKa,Q,GAhFNwM,IAAM3I,W,wBCuB9B4K,EAAS,IAAIuK,aAAWC,IAAeC,GAC7CC,oBAAU1K,GACVA,EAAO2K,aAAa5K,aAEpB1O,OAAOmZ,cAAgBA,IACvBnZ,OAAOuZ,WAAa/R,IACpBxH,OAAOW,UAAYiO,eH0HjBpC,IAAcnC,QAAO,SAAA0C,GACnBA,EAAKlM,SAAS2J,OAASuC,EAAKvC,UAG9BxK,OAAO4E,QAAU,SAAAlE,GAAE,OAAI5D,EAAS4D,EAAI,CAAE9D,SAAS,KAC/CoD,OAAO6E,WAAa,SAAAnE,GAAE,OAAI5D,EAAS4D,EAAI,CAAE9D,SAAS,KAClDoD,OAAO6D,YAAc,SAACnD,EAAIiE,GAAL,OAAiB7H,EAAS4D,EAAIiE,IAGnD0R,EAAcrW,OAAOa,SAASC,UG/HhC0Y,yBAAe,iBAAiBrF,MAAK,WAG/BzF,oBAAU,yBAAyB3F,OAAS,GAC9CkK,EAAQ,QAWV,IAAMwG,EAAe,SAAAva,GAAK,OACxB,kBAAC,cAAYiP,SAAb,CACEhJ,MAAO,CACLuU,QAAQ,IACRC,SAAS,MAGX,kBAAC,IAAiBza,KAIhB0a,EAAclN,IAAME,cAAc,IAElCiN,EA5BmC,kGA6BvC1X,OAAA,WAAU,IACAiM,EAAa/O,KAAKH,MAAlBkP,SACR,OACE,kBAAC,WAAD,MACG,gBAAGvN,EAAH,EAAGA,SAAH,OACC,kBAAC,EAAD,CAAiBA,SAAUA,IACxB,gBAAGgO,EAAH,EAAGA,cAAehO,EAAlB,EAAkBA,SAAlB,OACC,kBAAC,IAAmBsN,SAApB,CACEhJ,MAAO0J,EAAciL,oBAErB,kBAACF,EAAYzL,SAAb,CAAsBhJ,MAAO,CAAE0J,gBAAehO,aAC3CuN,WAxCsB,GA4BhB1B,IAAM3I,WAuBzBgW,EAnDmC,kGAoDvC5X,OAAA,WAAU,IAAD,OACP,OACE,kBAACyX,EAAYI,SAAb,MACG,gBAAGnL,EAAH,EAAGA,cAAehO,EAAlB,EAAkBA,SAAlB,OACC,kBAAC,EAAD,CAAcA,SAAUA,GACtB,kBAAC,gBAAD,CACEA,SAAUA,EACV2M,mBAAoBA,GAEpB,kBAAC,SAAD,CACEmM,SAAUzF,SACVrT,SAAUA,EACV2U,GAAG,wBAEH,kBAACiE,EAAD,eACEhd,KACE,cAAAoS,EAAcE,KAAKtS,KACfwd,YAAYpZ,EAASC,SAAUoT,UAC/BtQ,UACEiL,EAAcE,KAAKkK,WACjBpK,EAAcE,KAAKtS,OAGzB,EAAKyC,MATX,CAUE2B,SAAUA,EACVgO,cAAeA,GACXA,EAAcmK,cA9EK,GAmDXtM,IAAM3I,WAnDK,EAyFE/D,OAAnCka,EAzFiC,EAyFjCA,SAAoBC,EAzFa,EAyFvBtZ,SAUhBqZ,GACAhG,SAAgBgG,IAAaC,EAAWrZ,YAEtC6N,EAAOyL,cAAcH,YAAYE,EAAWrZ,SAAUoT,YAC9C,cAARgG,GACAA,EAAS9K,MAAM,eACf8K,EAAS9K,MAAM,8CAGjBtS,mBAASoX,SAAgBgG,EAAWC,EAAW9Q,OAAS8Q,EAAW7Q,KAAM,CACvE1M,SAAS,IAIbgS,eAAa+H,SAASwD,EAAWrZ,UAAUqT,MAAK,SAAApF,GAC9C,IAAKA,GAAQA,EAAK6H,SAAWC,qBAAmBzB,MAC9C,MAAM,IAAIA,MAAJ,sBACkB+E,EAAWrZ,SAD7B,mCAKRd,OAAOgX,0BAA4BjI,EAAKA,KAAKgI,uBAE7C,IAAMsD,EAAW3L,oBAAU,kBAEzB,CAAEL,QAAS,kBAAC0L,EAAD,OACX,kBAACA,EAAD,OACA,YACE,MAAO,CAAE1L,QADK,EAAbW,WAGHC,MAEIqL,EAAM,kBAAM,kBAACT,EAAD,KAAaQ,IAEzBE,EAAW7L,oBAAU,8BAEzB9D,EACA4P,IAASC,SACT,GAEFC,KAAS,WACPH,EACE,kBAACD,EAAD,MACA,oBAAOta,OACHuM,SAASoB,eAAT,kBACA,GACJ,WACEe,oBAAU,sC,mBCjLpBzI,EAAO5J,QANP,SAAwBse,EAAUC,GAChCD,EAASra,UAAYiG,OAAOmB,OAAOkT,EAAWta,WAC9Cqa,EAASra,UAAUua,YAAcF,EACjCA,EAASG,UAAYF,I,kECAvBve,EAAQ0e,WAAa,CACnB,oCAAqC,kBAAM,+DAC3C,qCAAsC,kBAAM,iE,kCCL9C,kJAeyBpM,QAAO/N,QAfhC,IAiBMoa,EAAqBtO,IAAME,cAAc,K,iFCjB/C,m8BAAI3D,EAAW1C,OAAO8B,QAAU,SAAUtG,GAAU,IAAK,IAAI6G,EAAI,EAAGA,EAAIM,UAAUH,OAAQH,IAAK,CAAE,IAAIF,EAASQ,UAAUN,GAAI,IAAK,IAAI5D,KAAO0D,EAAcnC,OAAOjG,UAAUqB,eAAevC,KAAKsJ,EAAQ1D,KAAQjD,EAAOiD,GAAO0D,EAAO1D,IAAY,OAAOjD,GAEvP,SAASkZ,EAAyB/U,EAAK4C,GAAQ,IAAI/G,EAAS,GAAI,IAAK,IAAI6G,KAAK1C,EAAW4C,EAAKd,QAAQY,IAAM,GAAkBrC,OAAOjG,UAAUqB,eAAevC,KAAK8G,EAAK0C,KAAc7G,EAAO6G,GAAK1C,EAAI0C,IAAM,OAAO7G,EAEnN,SAASmZ,EAAgB/Z,EAAUga,GAAe,KAAMha,aAAoBga,GAAgB,MAAM,IAAIC,UAAU,qCAEhH,SAASC,EAA2BxG,EAAMzV,GAAQ,IAAKyV,EAAQ,MAAM,IAAIC,eAAe,6DAAgE,OAAO1V,GAAyB,iBAATA,GAAqC,mBAATA,EAA8ByV,EAAPzV,EAElO,SAASkc,EAAUX,EAAUC,GAAc,GAA0B,mBAAfA,GAA4C,OAAfA,EAAuB,MAAM,IAAIQ,UAAU,kEAAoER,GAAeD,EAASra,UAAYiG,OAAOmB,OAAOkT,GAAcA,EAAWta,UAAW,CAAEua,YAAa,CAAE1V,MAAOwV,EAAUY,YAAY,EAAOC,UAAU,EAAMC,cAAc,KAAeb,IAAYrU,OAAOmV,eAAiBnV,OAAOmV,eAAef,EAAUC,GAAcD,EAASG,UAAYF,GAaje,IAAIe,EAAqB,SAA4B7P,EAAM8P,GACzD,IAAIC,EAAM,IAAcD,GAExB,OADAC,EAAIhP,YAAcf,EACX+P,GAKLC,EAAkBH,EAAmB,YAIrC7Y,EAAW,SAAkBjF,GAC/B,IAAIuQ,EAAWvQ,EAAKuQ,SACpB,OAAO,IAAMvL,cACXiZ,EAAgB9B,SAChB,MACA,SAAU+B,GACR,OAAOA,EAAU3N,EAAS2N,GAAW,IAAMlZ,cACzCmZ,EACA,KACA5N,OAMJ4N,EAAmB,SAAU/c,GAG/B,SAAS+c,IACP,IAAIC,EAAO9c,EAEX+b,EAAgB7b,KAAM2c,GAEtB,IAAK,IAAIlP,EAAO5D,UAAUH,OAAQgE,EAAOC,MAAMF,GAAOG,EAAO,EAAGA,EAAOH,EAAMG,IAC3EF,EAAKE,GAAQ/D,UAAU+D,GAGzB,OAAegP,EAAS9c,EAAQkc,EAA2Bhc,KAAMJ,EAAiBG,KAAK8N,MAAMjO,EAAkB,CAACI,MAAM8N,OAAOJ,KAAiB5N,EAAMe,MAAQ,CAC1J6b,QAAS5c,EAAM+c,aACfC,KAAM,CAAEC,SAAU,OACTf,EAA2Blc,EAAnC8c,GAkEL,OAhFAX,EAAUU,EAAkB/c,GAiB5B+c,EAAiB1b,UAAU4b,WAAa,WACtC,IAAIG,EAAiBhd,KAAKH,MAAM6K,QAIhC,MAAO,CAAEjN,SAHMuf,EAAevf,SAGD+D,SAFdwb,EAAexb,WAKhCmb,EAAiB1b,UAAUgc,kBAAoB,SAA2BvI,EAAOwI,GAC/E,IAAIC,EAAWzI,GAKb,MAAMA,GAFN0I,EAFgBpd,KAAKH,MAAM6K,QAAQjN,UAEzBiX,EAAM/H,IAAK,CAAEpP,SAAS,KAMpCof,EAAiB1b,UAAUC,mBAAqB,SAA4BC,EAAWC,GACjFA,EAAUsb,QAAQlb,WAAaxB,KAAKa,MAAM6b,QAAQlb,UACpDxB,KAAKH,MAAM6K,QAAQK,yBAIvB4R,EAAiB1b,UAAUS,kBAAoB,WAC7C,IAAIU,EAASpC,KAET8c,EAAO9c,KAAKa,MAAMic,KAClBpS,EAAU1K,KAAKH,MAAM6K,QAEzBA,EAAQK,wBACR+R,EAAKC,SAAWrS,EAAQM,QAAO,WAC7Be,QAAQ7M,UAAU4V,MAAK,WAErBuD,uBAAsB,WACfjW,EAAOib,WACVjb,EAAOoX,UAAS,WACd,MAAO,CAAEkD,QAASta,EAAOya,2BAQrCF,EAAiB1b,UAAUU,qBAAuB,WAChD,IAAImb,EAAO9c,KAAKa,MAAMic,KAEtB9c,KAAKqd,WAAY,EACjBP,EAAKC,YAGPJ,EAAiB1b,UAAU6B,OAAS,WAClC,IAAI4Z,EAAU1c,KAAKa,MAAM6b,QACrB3N,EAAW/O,KAAKH,MAAMkP,SAE1B,OAAO,IAAMvL,cACXiZ,EAAgB3N,SAChB,CAAEhJ,MAAO4W,GACW,mBAAb3N,EAA0BA,EAAS2N,GAAW3N,GAAY,OAI9D4N,EAjFc,CAkFrB,IAAMjY,WAKRiY,EAAiBW,aAAe,CAC9B5S,QAAS,KAKX,IAAI6S,EAAiB,SAAwBrd,GAC3C,IAAIsd,EAAMtd,EAAMsd,IACZzO,EAAW7O,EAAM6O,SAEjB5C,EAAcqR,EAAI7U,QAAQ,KAE1BlH,OAAW,EACXuI,EAAS,GAUb,OAZmBmC,GAAe,GAMhC1K,EAAW+b,EAAIjP,UAAU,EAAGpC,GAC5BnC,EAASwT,EAAIjP,UAAUpC,IAEvB1K,EAAW+b,EAGN,IAAMha,cACXiZ,EAAgB3N,SAChB,CACEhJ,MAAO,CACLtE,SAAU,CACRC,SAAUA,EACVuI,OAAQA,EACRC,KAhBG,IAkBLxM,SAAU,WACR,MAAM,IAAIsY,MAAM,6CAItBhH,IAKA0O,EAAcnB,EAAmB,OAAQ,CAAEjC,QAAS,IAAKC,SAAU,MAInEoD,EAAS,SAAgB7d,GAC3B,OAAO,IAAM2D,cACXia,EAAY9C,SACZ,MACA,SAAUgD,GACR,OAAO,IAAMna,cACXC,EACA,MACA,SAAUma,GACR,OAAO,IAAMpa,cAAcqa,EAAYjU,EAAS,GAAI+T,EAAaC,EAAiB/d,WAOxFge,EAAa,SAAUC,GAGzB,SAASD,IAGP,OAFAhC,EAAgB7b,KAAM6d,GAEf7B,EAA2Bhc,KAAM8d,EAAqBjQ,MAAM7N,KAAM6J,YAgF3E,OArFAoS,EAAU4B,EAAYC,GAQtBD,EAAW5c,UAAU6B,OAAS,WAC5B,IAAIib,EAAS/d,KAAKH,MACd2B,EAAWuc,EAAOvc,SAClBwc,EAAaD,EAAOtgB,SACpB6c,EAAWyD,EAAOzD,SAClB2D,EAAUF,EAAOE,QACjBlP,EAAWgP,EAAOhP,SAElBmP,GADUH,EAAO1D,QACE0D,EAAOtO,WAC1BA,OAAiClE,IAArB2S,EAAiC,MAAQA,EACrDC,EAAWvC,EAAyBmC,EAAQ,CAAC,WAAY,WAAY,WAAY,UAAW,WAAY,UAAW,cAEnHjO,EAAS,IAAMsO,SAASC,QAAQtP,GAAUiE,QAAO,SAAUsL,EAAOC,GACpE,IAAIzO,EAAS0O,EAAYlE,EAAZkE,CAAsBD,GACnC,OAAOD,EAAMxQ,OAAOgC,KACnB,IACCrO,EAAWD,EAASC,SAGpBsO,EAAQ,eAAKD,EAAQrO,GAEzB,GAAIsO,EAAO,CACT,IAAIW,EAASX,EAAMW,OACf/D,EAAMoD,EAAMpD,IACZ8D,EAAQV,EAAMU,MACdzB,EAAUe,EAAMU,MAAM3K,MAI1BwU,EAAW7J,EAAM/S,QAAU4c,EAAW7J,EAAMrT,KAAKG,QAAQ,MAAO,IAEhE,IAAIsC,EAAQ+J,EAAS,GAAI8G,EAAQ,CAC/B/D,IAAKA,EACLnL,SAAUA,EACV/D,SAAU,SAAkB4D,EAAIiE,GAC9B,OAAO0Y,EAAW,kBAAQ3c,EAAIsL,GAAMrH,MAIpCmZ,EAAQ,IAAMC,aAAa1P,EAASnP,EAAOmP,EAAQnP,MAAMkP,SAAW,IAAMvL,cAC5Eka,EACA,CAAElc,SAAUA,EAAUyc,QAASA,GAC/BjP,EAAQnP,MAAMkP,eACZxD,GAGAoT,EAAeV,EAAUW,EAAenP,EAExCoP,EAAeZ,EAAUrU,EAAS,CAAE+C,IAAKA,EAAKnL,SAAUA,EAAUiO,UAAWA,GAAa0O,GAAYA,EAE1G,OAAO,IAAM3a,cACXia,EAAY3O,SACZ,CAAEhJ,MAAO,CAAEuU,QAAS1N,EAAK2N,SAAUA,IACnC,IAAM9W,cACJmb,EACAE,EACAJ,IAiBJ,OAAO,MAIJZ,EAtFQ,CAuFf,IAAMiB,eAERjB,EAAWP,aAAe,CACxBW,SAAS,GAIX,IAAIc,EAAezC,EAAmB,SAElCsC,EAAe,SAAsBlb,GACvC,IAAIiJ,EAAMjJ,EAAMiJ,IACZnL,EAAWkC,EAAMlC,SACjBiO,EAAY/L,EAAM+L,UAClB0O,EAAWvC,EAAyBlY,EAAO,CAAC,MAAO,WAAY,cAEnE,OAAO,IAAMF,cACXub,EAAapE,SACb,MACA,SAAUqE,GACR,OAAO,IAAMxb,cAAcyb,EAAkBrV,EAAS,GAAIuU,EAAU,CAClE1O,UAAWA,EACXuP,aAAcA,EACdrS,IAAKA,EACLnL,SAAUA,SAOd0d,GAAgB,EAChBC,EAAoB,EAEpBF,EAAmB,SAAUG,GAG/B,SAASH,IACP,IAAII,EAAQC,EAEZzD,EAAgB7b,KAAMif,GAEtB,IAAK,IAAIM,EAAQ1V,UAAUH,OAAQgE,EAAOC,MAAM4R,GAAQC,EAAQ,EAAGA,EAAQD,EAAOC,IAChF9R,EAAK8R,GAAS3V,UAAU2V,GAG1B,OAAgBH,EAAUC,EAAStD,EAA2Bhc,KAAMof,EAAkBrf,KAAK8N,MAAMuR,EAAmB,CAACpf,MAAM8N,OAAOJ,KAAkB4R,EAAOze,MAAQ,GAAIye,EAAON,aAAe,SAAU3Q,IAChMiR,EAAOze,MAAM4e,aAAepR,GAC/BA,EAAKqR,SAEG1D,EAA2BsD,EAApCD,GA4FL,OA3GApD,EAAUgD,EAAkBG,GAkB5BH,EAAiB5F,yBAA2B,SAAkCjB,EAAWhX,GAEvF,GAD+B,MAAjBA,EAAUuL,IAEtB,OAAO/C,EAAS,CACd6V,aAAa,GACZrH,GAEH,IAAIuH,EAAevH,EAAUzL,MAAQvL,EAAUuL,IAC3CiT,EAAkBxe,EAAUI,SAASC,WAAa2W,EAAU5W,SAASC,UAAY2W,EAAU5W,SAASC,WAAa2W,EAAUzL,IAC/H,OAAO/C,EAAS,CACd6V,YAAaE,GAAgBC,GAC5BxH,IAIP6G,EAAiBhe,UAAUS,kBAAoB,WAC7Cyd,IACAnf,KAAK0f,SAGPT,EAAiBhe,UAAUU,qBAAuB,WAEtB,MAD1Bwd,IAEED,GAAgB,IAIpBD,EAAiBhe,UAAUC,mBAAqB,SAA4BC,EAAWC,GACjFD,EAAUK,WAAaxB,KAAKH,MAAM2B,UAAYxB,KAAKa,MAAM4e,aAC3Dzf,KAAK0f,SAITT,EAAiBhe,UAAUye,MAAQ,WAQjC,IAAIV,EAAehf,KAAKH,MAAMmf,aAG1BA,EACFA,EAAahf,KAAKqO,MAEd6Q,EACFA,GAAgB,EACPlf,KAAKqO,OAGTrO,KAAKqO,KAAKwR,SAAS3S,SAAS4S,gBAC/B9f,KAAKqO,KAAKqR,UAMlBT,EAAiBhe,UAAU6B,OAAS,WAClC,IAAIid,EAAS/f,KAETggB,EAAUhgB,KAAKH,MAEfY,GADWuf,EAAQjR,SACXiR,EAAQvf,OAEhBwf,GADeD,EAAQhB,aACHgB,EAAQvQ,WAC5ByQ,OAA6B3U,IAAtB0U,EAAkC,MAAQA,EAGjD9B,GAFM6B,EAAQrT,IACHqT,EAAQxe,SACRoa,EAAyBoE,EAAS,CAAC,WAAY,QAAS,eAAgB,YAAa,MAAO,cAE3G,OAAO,IAAMxc,cACX0c,EACAtW,EAAS,CACPnJ,MAAOmJ,EAAS,CAAEuW,QAAS,QAAU1f,GACrC2f,SAAU,KACVle,IAAK,SAAame,GAChB,OAAON,EAAO1R,KAAOgS,IAEtBlC,GACH,IAAM3a,cACJub,EAAajQ,SACb,CAAEhJ,MAAO9F,KAAKgf,cACdhf,KAAKH,MAAMkP,YAKVkQ,EA5Gc,CA6GrB,IAAMva,WAER,mBAASua,GAET,IAAIqB,EAAI,aAGJjb,EAAa,IAAMA,gBAEG,IAAfA,IACTA,EAAa,SAAoBkb,GAC/B,OAAOA,IAIX,IAAI3c,EAAOyB,GAAW,SAAUmb,EAAOte,GACrC,IAAIG,EAAWme,EAAMne,SACjBxC,EAAQ+b,EAAyB4E,EAAO,CAAC,aAE7C,OAAO,IAAMhd,cACXia,EAAY9C,SACZ,MACA,SAAU8F,GACOA,EAAMnG,SAArB,IACID,EAAUoG,EAAMpG,QACpB,OAAO,IAAM7W,cACXC,EACA,MACA,SAAUid,GACR,IAAIlf,EAAWkf,EAAMlf,SACjB/D,EAAWijB,EAAMjjB,SAEjB4D,EAAKxB,EAAMwB,GACXR,EAAQhB,EAAMgB,MACdtD,EAAUsC,EAAMtC,QAChBojB,EAAkB9gB,EAAMqD,SACxBA,OAA+BqI,IAApBoV,EAAgCL,EAAIK,EAC/CC,EAAchF,EAAyB/b,EAAO,CAAC,KAAM,QAAS,UAAW,aAEzE4E,EAAO,kBAAQpD,EAAIgZ,GACnBwG,EAActc,UAAUE,GACxBrE,EAAYoB,EAASC,WAAaof,EAClC1gB,EAAqB,qBAAWqB,EAASC,SAAUof,GAEvD,OAAO,IAAMrd,cAAc,IAAKoG,EAAS,CACvC1H,IAAKA,GAAOG,EACZ,eAAgBjC,EAAY,YAASmL,GACpCqV,EAAa1d,EAAS,CAAE9C,UAAWA,EAAWD,mBAAoBA,EAAoBsE,KAAMA,EAAMjD,SAAUA,IAAa,CAC1HiD,KAAMA,EACNrB,QAAS,SAAiB0d,GAExB,GADIF,EAAYxd,SAASwd,EAAYxd,QAAQ0d,GACzCC,EAAeD,GAAQ,CACzBA,EAAMzc,iBACN,IAAIC,EAAgB/G,EACpB,GAAuB,kBAAZA,GAAyB6C,EAAW,CAC7C,IAAI4gB,EAAkBpX,EAAS,GAAIpI,EAASX,OAExCogB,GADMD,EAAgBrb,IACViW,EAAyBoF,EAAiB,CAAC,SAE3D1c,EAAgB,yBAAesF,EAAS,GAAI/I,GAAQogB,GAEtDxjB,EAASgH,EAAM,CACb5D,MAAOA,EACPtD,QAAS+G,kBAkB3B,SAAS4c,EAAgBvU,GACvB3M,KAAK2M,IAAMA,EARb/I,EAAK4J,YAAc,OAWnB,IAAI2P,EAAa,SAAoBgE,GACnC,OAAOA,aAAaD,GAGlBE,EAAa,SAAoB/f,GACnC,MAAM,IAAI6f,EAAgB7f,IAGxBggB,EAAe,SAAUC,GAG3B,SAASD,IAGP,OAFAxF,EAAgB7b,KAAMqhB,GAEfrF,EAA2Bhc,KAAMshB,EAAkBzT,MAAM7N,KAAM6J,YAsCxE,OA3CAoS,EAAUoF,EAAcC,GASxBD,EAAapgB,UAAUS,kBAAoB,WACzC,IAAI6f,EAAUvhB,KAAKH,MACfpC,EAAW8jB,EAAQ9jB,SACnB4D,EAAKkgB,EAAQlgB,GAEbmgB,GADOD,EAAQ7O,KACG6O,EAAQhkB,SAC1BA,OAA8BgO,IAApBiW,GAAuCA,EACjD3gB,EAAQ0gB,EAAQ1gB,MAEhBwZ,GADUkH,EAAQE,QACRF,EAAQlH,SAClBxa,EAAQ+b,EAAyB2F,EAAS,CAAC,WAAY,KAAM,OAAQ,UAAW,QAAS,UAAW,YAExGxV,QAAQ7M,UAAU4V,MAAK,WACrB,IAAI4M,EAAa,kBAAQrgB,EAAIgZ,GAC7B5c,EAAS,uBAAaikB,EAAY7hB,GAAQ,CAAEtC,QAASA,EAASsD,MAAOA,QAIzEwgB,EAAapgB,UAAU6B,OAAS,WAC9B,IAAI6e,EAAU3hB,KAAKH,MAEfwB,GADWsgB,EAAQlkB,SACdkkB,EAAQtgB,IAIbogB,GAHOE,EAAQjP,KACLiP,EAAQpkB,QACVokB,EAAQ9gB,MACN8gB,EAAQF,SAClBpH,EAAUsH,EAAQtH,QAClBxa,EAAQ+b,EAAyB+F,EAAS,CAAC,WAAY,KAAM,OAAQ,UAAW,QAAS,UAAW,YAEpGD,EAAa,kBAAQrgB,EAAIgZ,GAE7B,OADKoH,GAASL,EAAW,uBAAaM,EAAY7hB,IAC3C,MAGFwhB,EA5CU,CA6CjB,IAAM3c,WAEJkd,EAAW,SAAkB/hB,GAC/B,OAAO,IAAM2D,cACXia,EAAY9C,SACZ,MACA,SAAUkH,GACR,IAAIxH,EAAUwH,EAAMxH,QACpB,OAAO,IAAM7W,cACXC,EACA,MACA,SAAUma,GACR,OAAO,IAAMpa,cAAc6d,EAAczX,EAAS,GAAIgU,EAAiB,CAAEvD,QAASA,GAAWxa,WAanGiiB,EAAQ,SAAeC,GACzB,IAAI3kB,EAAO2kB,EAAM3kB,KACb2R,EAAWgT,EAAMhT,SACrB,OAAO,IAAMvL,cACXia,EAAY9C,SACZ,MACA,SAAUqH,GACR,IAAI3H,EAAU2H,EAAM3H,QACpB,OAAO,IAAM7W,cACXC,EACA,MACA,SAAUwe,GACR,IAAIxkB,EAAWwkB,EAAOxkB,SAClB+D,EAAWygB,EAAOzgB,SAElB0gB,EAAe,kBAAQ9kB,EAAMid,GAC7B1K,EAAS,gBAAMuS,EAAc1gB,EAASC,UAC1C,OAAOsN,EAAS,CACdtR,SAAUA,EACV+D,SAAUA,EACVuO,MAAOJ,EAAS/F,EAAS,GAAI+F,EAAOe,OAAQ,CAC1C/D,IAAKgD,EAAOhD,IACZvP,KAAMA,IACH,cAWbqK,EAAc,WAChB,IAAIiV,EAAU,qBAAWD,GAEzB,IAAKC,EACH,MAAM,IAAI3G,MAAM,8JAGlB,OAAO2G,EAAQlb,UAGb2gB,EAAc,WAChB,IAAIzF,EAAU,qBAAWD,GAEzB,IAAKC,EACH,MAAM,IAAI3G,MAAM,8JAGlB,OAAO2G,EAAQjf,UAGb2kB,EAAY,WACd,IAAI1F,EAAU,qBAAWe,GAEzB,IAAKf,EACH,MAAM,IAAI3G,MAAM,4JAGlB,IAAIvU,EAAWiG,IAEXsQ,EAAU,gBAAM2E,EAAQpC,SAAU9Y,EAASC,UAE/C,OAAOsW,EAAUA,EAAQrH,OAAS,MAGhC2R,EAAW,SAAkBjlB,GAC/B,IAAKA,EACH,MAAM,IAAI2Y,MAAM,4EAElB,IAAI2G,EAAU,qBAAWe,GAEzB,IAAKf,EACH,MAAM,IAAI3G,MAAM,2JAGlB,IAAIvU,EAAWiG,IAEXya,EAAe,kBAAQ9kB,EAAMsf,EAAQrC,SACrC1K,EAAS,gBAAMuS,EAAc1gB,EAASC,UAC1C,OAAOkO,EAAS/F,EAAS,GAAI+F,EAAOe,OAAQ,CAC1C/D,IAAKgD,EAAOhD,IACZvP,KAAMA,IACH,MAKHklB,EAAe,SAAsBC,GACvC,OAAOA,EAAIhlB,QAAQ,eAAgB,KAGjCihB,EAAc,SAASA,EAAYlE,GACrC,OAAO,SAAUtL,GACf,IAAKA,EACH,OAAO,KAGT,GAAIA,EAAQzG,OAAS,IAAMyQ,UAAYhK,EAAQnP,MAAMkP,SACnD,OAAO,IAAMqP,SAAStV,IAAIkG,EAAQnP,MAAMkP,SAAUyP,EAAYlE,IAQhE,GANEtL,EAAQnP,MAAMzC,MAAQ4R,EAAQnP,MAAMnC,SAAWsR,EAAQzG,OAASqZ,GAAuN,KAAU,GAEhS5S,EAAQzG,OAASqZ,GAAc5S,EAAQnP,MAAM6S,MAAS1D,EAAQnP,MAAMwB,IAAqN,KAAU,GAEnS2N,EAAQzG,OAASqZ,GAAa,2BAAiB5S,EAAQnP,MAAM6S,KAAM1D,EAAQnP,MAAMwB,KAA4O,KAAU,GAEtU2N,EAAQnP,MAAMnC,QAChB,MAAO,CAAEoI,MAAOkJ,EAAStR,SAAS,GAGpC,IAAI8kB,EAAcxT,EAAQzG,OAASqZ,EAAW5S,EAAQnP,MAAM6S,KAAO1D,EAAQnP,MAAMzC,KAE7EA,EAAuB,MAAhBolB,EAAsBlI,EAAWgI,EAAahI,GAAY,IAAMgI,EAAaE,GAExF,MAAO,CACL1c,MAAOkJ,EACPtR,QAASsR,EAAQnP,MAAMnC,QACvBN,KAAM4R,EAAQnP,MAAMkP,SAAWuT,EAAallB,GAAQ,KAAOA,KAK7D2jB,EAAiB,SAAwBD,GAC3C,OAAQA,EAAM9c,kBAAqC,IAAjB8c,EAAM/c,UAAkB+c,EAAM7c,SAAW6c,EAAM5c,QAAU4c,EAAM3c,SAAW2c,EAAM1c,Y,mBC3sBpH,SAASoC,EAAQK,GAaf,MAVsB,mBAAX4b,QAAoD,iBAApBA,OAAOC,SAChD9b,EAAO5J,QAAUwJ,EAAU,SAAiBK,GAC1C,cAAcA,GAGhBD,EAAO5J,QAAUwJ,EAAU,SAAiBK,GAC1C,OAAOA,GAAyB,mBAAX4b,QAAyB5b,EAAI2U,cAAgBiH,QAAU5b,IAAQ4b,OAAOxhB,UAAY,gBAAkB4F,GAItHL,EAAQK,GAGjBD,EAAO5J,QAAUwJ,G,kCCXF,SAASoU,EAAY2H,EAAKhkB,GACvC,YADoD,IAAbA,MAAa,IAC/CA,EAIDgkB,IAAQhkB,EACJ,IAGJgkB,EAAIjkB,WAAcC,EAAlB,KACKgkB,EAAIzjB,MAAMP,EAAOmL,QAGnB6Y,EAXEA,EAPX,mC,kCCEAvlB,EAAQC,YAAa,EACrBD,EAAQoB,UAER,SAAmBhB,GACjB,IAAIqE,EAAWrE,GAAQ,IACnB4M,EAAS,GACTC,EAAO,GACP0Y,EAAYlhB,EAASkH,QAAQ,MAEd,IAAfga,IACF1Y,EAAOxI,EAAS4K,OAAOsW,GACvBlhB,EAAWA,EAAS4K,OAAO,EAAGsW,IAGhC,IAAIxW,EAAc1K,EAASkH,QAAQ,MAEd,IAAjBwD,IACFnC,EAASvI,EAAS4K,OAAOF,GACzB1K,EAAWA,EAAS4K,OAAO,EAAGF,IAGhC,MAAO,CACL1K,SAAUA,EACVuI,OAAmB,MAAXA,EAAiB,GAAKA,EAC9BC,KAAe,MAATA,EAAe,GAAKA,K,kCC1Bf,SAAS2Y,EAAetH,EAAUC,GAC/CD,EAASra,UAAYiG,OAAOmB,OAAOkT,EAAWta,WAC9Cqa,EAASra,UAAUua,YAAcF,EACjCA,EAASG,UAAYF,EAHvB,mC,yRCAe,SAASsH,EAAkBC,EAAKC,IAClC,MAAPA,GAAeA,EAAMD,EAAIpZ,UAAQqZ,EAAMD,EAAIpZ,QAE/C,IAAK,IAAIH,EAAI,EAAGyZ,EAAO,IAAIrV,MAAMoV,GAAMxZ,EAAIwZ,EAAKxZ,IAC9CyZ,EAAKzZ,GAAKuZ,EAAIvZ,GAGhB,OAAOyZ,ECHM,SAASC,EAAmBH,GACzC,OCJa,SAA4BA,GACzC,GAAInV,MAAMuV,QAAQJ,GAAM,OAAO,EAAiBA,GDGzC,CAAkBA,IELZ,SAA0BK,GACvC,GAAsB,oBAAXV,QAA0BA,OAAOC,YAAYxb,OAAOic,GAAO,OAAOxV,MAAM+E,KAAKyQ,GFIvD,CAAgBL,IGJpC,SAAqC3B,EAAGiC,GACrD,GAAKjC,EAAL,CACA,GAAiB,iBAANA,EAAgB,OAAO,EAAiBA,EAAGiC,GACtD,IAAI/C,EAAInZ,OAAOjG,UAAUoiB,SAAStjB,KAAKohB,GAAGriB,MAAM,GAAI,GAEpD,MADU,WAANuhB,GAAkBc,EAAE3F,cAAa6E,EAAIc,EAAE3F,YAAY/O,MAC7C,QAAN4T,GAAqB,QAANA,EAAoB1S,MAAM+E,KAAKyO,GACxC,cAANd,GAAqB,2CAA2CxN,KAAKwN,GAAW,EAAiBc,EAAGiC,QAAxG,GHFyD,CAA2BN,IILvE,WACb,MAAM,IAAI/G,UAAU,wIJIwE,GKL9F,IAyDMuH,EAzDU,SAAUC,GACxB,GAAI,oBAAOrW,SACT,OAAO,EAET,IAAMsW,EAAWtW,SAAS1J,cAAT,QACjB,IACE,GAAIggB,EAASC,SAAW,mBAAOD,EAASC,QAAQC,SAC9C,OAAOF,EAASC,QAAQC,SAASH,GAEnC,MAAOI,GACP,OAAO,EAET,OAAO,EA6CyBC,CAAQ,YA1Cb,SAAUpG,EAAKlY,GAC1C,OAAO,IAAIyG,SAAQ,SAAC7M,EAAS2kB,GAC3B,GAAI,oBAAO3W,SAAX,CAKA,IAAM4W,EAAO5W,SAAS1J,cAAT,QACbsgB,EAAKC,aAAL,kBACAD,EAAKC,aAAL,OAA0BvG,GAE1BtW,OAAOuC,KAAKnE,GAAS9C,SAAQ,SAAAmD,GAC3Bme,EAAKC,aAAape,EAAKL,EAAQK,OAGjCme,EAAKE,OAAS9kB,EACd4kB,EAAKG,QAAUJ,GAGb3W,SAASgX,qBAAT,QAAsC,IACtChX,SAASiX,kBAAT,UAAqC,GAAGC,YAC5BC,YAAYP,QAlBxBD,QAsBsB,SAAUrG,GACpC,OAAO,IAAIzR,SAAQ,SAAC7M,EAAS2kB,GAC3B,IAAMS,EAAM,IAAIC,eAChBD,EAAIE,KAAJ,MAAgBhH,GAAK,GAErB8G,EAAIN,OAAS,WACQ,MAAfM,EAAI/M,OACNrY,IAEA2kB,KAIJS,EAAIG,KAAK,UAQPC,EAAa,GAkBJC,EAhBE,SAAUnH,EAAKlY,GAC9B,OAAO,IAAIyG,SAAQ,SAAA7M,GACbwlB,EAAWlH,GACbte,IAIFokB,EAA0B9F,EAAKlY,GAC5BwP,MAAK,WACJ5V,IACAwlB,EAAWlH,IAAO,KAEnBjI,OAAM,mB,oCC3EE,WAAAnY,GACb,YAAamO,IAATnO,EACKA,EAED,MAAJA,EACI,IAEJ,MAAAA,EAAKwnB,OAAOxnB,EAAKsM,OAAS,GACrBtM,EAAK0B,MAAM,GAAI,GAEjB1B,G,k0BCNT,IAAMynB,EAAY,IAAIC,IAClB/K,EAAa,GAEXgL,EAAe,SAAAC,GACnB,IAAMvjB,EAAWwP,mBAAmB+T,GAQpC,OANwBpK,YAAYnZ,EAAUoT,UAE3ChI,MAFqB,KAEV,GAEXA,MAJqB,KAIV,IAKhB,SAAS1N,EAAW/B,GAElB,OACEA,EAAKkB,WAAL,MACAlB,EAAKkB,WAAL,aACAlB,EAAKkB,WAAL,WAEOlB,EAIF,IAAIoN,IACTpN,EACAuD,OAAOa,SAASiD,MAAQ9D,OAAOa,SAASiD,KAAK5F,SAArB,cACxB4C,SAQG,IAYMsZ,EAAgB,SAAAiK,GAG3B,IAFA,IAEA,EAFMC,EAAkBC,EAAUF,GAElC,IAAkCjL,KAAlC,aAA8C,CAAC,IAAD,UAAjCH,EAAiC,EAAjCA,UAAWxc,EAAsB,EAAtBA,KACtB,GAAI2S,gBAAM6J,EAAWqL,GACnB,OAAOE,EAAkB/nB,GAI7B,OAAO,MAWIgoB,EAAW,SAAAJ,GACtB,IAAMC,EAAkBF,EAAa5lB,EAAW6lB,IAChD,GAAIH,EAAU/d,IAAIme,GAChB,OAAOJ,EAAU9d,IAAIke,GAGvB,IAAII,EAAYtK,EAAckK,GAQ9B,OANKI,IACHA,EAAYH,EAAUF,IAGxBH,EAAUvd,IAAI2d,EAAiBI,GAExBA,GAUIH,EAAY,SAAAF,GACvB,IAEIK,EAFoBN,EAAa5lB,EAAW6lB,IAShD,MANa,gBAATK,IACFA,EAAS,KAGXA,EAAYF,EAAkBE,IClGnB7N,EAAqB,CAIhCzB,MAAM,QAINuP,QAAQ,WAGJC,EAAgB,SAAAC,GAAC,OAAKA,GAAKA,EAAE9nB,SAAY8nB,GAQzCC,EAAoB,SAAAroB,GACxB,IAP8BsoB,EAQ9B,MAAUC,qBADY,MAAJvoB,EAAA,QALlBsoB,GADAA,EAAI,OAD0BA,EAOqCtoB,GAN7D,GAAasoB,EAAE5mB,MAAM,GAAK4mB,GAC1B7mB,SAAF,KAAkB6mB,EAAE5mB,MAAM,GAAI,GAAK4mB,GAMvC,mBAGF,SAASE,EAAQpI,EAAKqI,GACpB,YADoC,IAAhBA,MAAgB,OAC7B,IAAI9Z,SAAQ,SAAC7M,EAAS2kB,GAC3B,IAAMS,EAAM,IAAIC,eAChBD,EAAIE,KAAKqB,EAAQrI,GAAK,GACtB8G,EAAIwB,mBAAqB,WACD,GAAlBxB,EAAIhQ,YACNpV,EAAQolB,IAGZA,EAAIG,KAAK,SAIb,IAscI3iB,EAvbEikB,EAAkB,SAACC,EAAUvW,QAAqB,IAArBA,MAAY,MAC7C,IAAMC,EAAO,CACXuW,mBAAoBD,EAASC,mBAC7B7oB,KAAM4oB,EAAS5oB,KACfsa,uBAAwBsO,EAAStO,uBACjCkC,UAAWoM,EAASpM,UACpBsM,kBAAmBF,EAASE,mBAG9B,MAAO,CACLzW,YACAkK,KAAMqM,EAASrW,OACfD,SAISyW,EAAb,WACE,WAAYC,EAAerM,GAAa,KA0BxCsM,wBAA0B,IAAIvB,IAV5B9kB,KAAKsmB,OAAS,IAAIxB,IAClB9kB,KAAKumB,WAAa,IAAIzB,IACtB9kB,KAAKwmB,cAAgB,IAAI1B,IACzB9kB,KAAKymB,WAAa,IAAI3B,IACtB9kB,KAAK0mB,kBAAoB,IAAIC,IAC7B3mB,KAAK4mB,kBAAoB,IAAID,IAC7B3mB,KAAKomB,cAAgBA,EDxDvBrM,ECyDgBA,EAxBlB,2BA6BE8M,YAAA,SAAYrJ,GAAM,IAAD,OACXsJ,EAAkB9mB,KAAKqmB,wBAAwBtf,IAAIyW,GAQvD,OANKsJ,IACHA,EAAkBlB,EAAQpI,EAAD,OACzBxd,KAAKqmB,wBAAwB/e,IAAIkW,EAAKsJ,IAIjCA,EACJhS,MAAK,SAAAiS,GAEJ,OADA,EAAKV,wBAAwBW,OAAOxJ,GAC7BuJ,KAERxR,OAAM,SAAAoO,GAEL,MADA,EAAK0C,wBAAwBW,OAAOxJ,GAC9BmG,MA7Cd,EAiDE1J,aAAA,SAAa5K,GACXrP,KAAKqP,UAAYA,EACjBrP,KAAKinB,iBAAmB5X,EAAU,0BAA0B6X,MAAK,SAAA/T,GAAC,OAAIA,MAnD1E,EAsDEgU,kBAAA,SAAkBC,GAAU,IAAD,OACjBvM,EAA0BuM,EAA1BvM,SADiB,EACSuM,EAAhBC,eADO,MACG,EADH,EAEnB7J,EAAMiI,EAAkB5K,GAC9B,OAAO7a,KAAK6mB,YAAYrJ,GAAK1I,MAAK,SAAAwP,GAAQ,IAChC/M,EAAyB+M,EAAzB/M,OAAQ+P,EAAiBhD,EAAjBgD,aAGhB,GAAe,MAAX/P,EACF,IACE,IAAMgQ,EAActhB,KAAKC,MAAMohB,GAC/B,QAAyB/b,IAArBgc,EAAYnqB,KACd,MAAM,IAAI2Y,MAAJ,iCAGR,OAAO7O,OAAO8B,OAAOoe,EAAS,CAC5B7P,OAAQC,EAAmB8N,QAC3BkC,QAASD,IAEX,MAAO5D,IAMX,OAAe,MAAXpM,GAA6B,MAAXA,EAER,cAARsD,EACK3T,OAAO8B,OAAOoe,EAAS,CAC5B7P,OAAQC,EAAmBzB,QAMxB,EAAKoR,kBACVjgB,OAAO8B,OAAOoe,EAAS,CAAEvM,SAAS,YAAc4M,UAAU,KAK/C,MAAXlQ,EACKrQ,OAAO8B,OAAOoe,EAAS,CAC5B7P,OAAQC,EAAmBzB,QAK3BsR,EAAU,EACL,EAAKF,kBACVjgB,OAAO8B,OAAOoe,EAAS,CAAEC,QAASA,EAAU,KAKzCngB,OAAO8B,OAAOoe,EAAS,CAC5B7P,OAAQC,EAAmBzB,YA7GnC,EAkHE2R,iBAAA,SAAiBnO,GAAU,IAAD,OAClBsB,EAAWuK,EAAS7L,GAC1B,OAAIvZ,KAAKymB,WAAW3f,IAAI+T,GACf9O,QAAQ7M,QAAQc,KAAKymB,WAAW1f,IAAI8T,IAGtC7a,KAAKmnB,kBAAkB,CAAEtM,aAAY/F,MAAK,SAAAkR,GAG/C,OAFA,EAAKS,WAAWnf,IAAIuT,EAAUmL,GAEvBA,MA3Hb,EA+HEjL,cAAA,SAAcxB,GACZ,OAAOwB,EAAcxB,IAhIzB,EAoIEjC,SAAA,SAASiC,GAAU,IAAD,OACVsB,EAAWuK,EAAS7L,GAC1B,GAAIvZ,KAAKsmB,OAAOxf,IAAI+T,GAAW,CAC7B,IAAMnL,EAAO1P,KAAKsmB,OAAOvf,IAAI8T,GAC7B,OAAO9O,QAAQ7M,QAAQwQ,EAAK8X,SAG9B,GAAIxnB,KAAKumB,WAAWzf,IAAI+T,GACtB,OAAO7a,KAAKumB,WAAWxf,IAAI8T,GAG7B,IAAMiM,EAAkB/a,QAAQ3D,IAAI,CAClCpI,KAAK2nB,cACL3nB,KAAK0nB,iBAAiB7M,KACrB/F,MAAK,SAAA8S,GACN,IAAMjY,EAASiY,EAAQ,GACvB,GAAIjY,EAAO4H,SAAWC,EAAmBzB,MACvC,MAAO,CACLwB,OAAQC,EAAmBzB,OAI/B,IAAIiQ,EAAWrW,EAAO6X,QARL,EASsCxB,EAA/CC,EATS,EASTA,mBATS,IASWC,yBATX,MAS+B,GAT/B,EAWX2B,EAAc,GAEdC,EAAwB,EAAK1B,cAAcH,GAAoBnR,MACnE,SAAArF,GAEE,IAAID,EAgBJ,OAjBAqY,EAAYE,UAAY,IAAIrc,KAEvB+D,GAGHoY,EAAYtQ,OAASC,EAAmB8N,SAChB,IAApB3V,EAAO8X,WACTI,EAAYJ,UAAW,GAEzBzB,EAAW9e,OAAO8B,OAAOgd,EAAU,CACjCtO,uBAAwBkQ,EAAQ,GAC5BA,EAAQ,GAAGlQ,uBADS,KAI1BlI,EAAgBuW,EAAgBC,EAAUvW,IAX1CoY,EAAYtQ,OAASC,EAAmBzB,MAcnCvG,KAILwY,EAA0Bjc,QAAQ3D,IACtC8d,EAAkBpd,KAAI,SAAAmf,GAEpB,GAAI,EAAKzB,cAAc1f,IAAImhB,GAAkB,CAC3C,IAAMV,EAAc,EAAKf,cAAczf,IAAIkhB,GAC3C,MAAO,CAAEA,kBAAiBV,eAG5B,OAAO,EAAKV,YACPlB,mBAA4BsC,EAD1B,SAELnT,MAAK,SAAAwP,GACL,IAAMiD,EAActhB,KAAKC,MAAMoe,EAAIgD,cACnC,MAAO,CAAEW,kBAAiBV,sBAG9BzS,MAAK,SAAA2F,GACL,IAAMyN,EAAwB,GAO9B,OALAzN,EAAmBjY,SAAQ,YAAuC,IAApCylB,EAAmC,EAAnCA,gBAAiBV,EAAkB,EAAlBA,YAC7CW,EAAsBD,GAAmBV,EACzC,EAAKf,cAAclf,IAAI2gB,EAAiBV,MAGnCW,KAGT,OAAOnc,QAAQ3D,IAAI,CAAC0f,EAAuBE,IAA0BlT,MACnE,YAA0C,IACpC0S,EADJhY,EAAuC,KAAxBiL,EAAwB,KAavC,OAXIjL,IACFgY,EAAO,iBAAQhY,EAAR,CAAuBiL,uBAC9BoN,EAAYL,QAAUA,EACtBrf,IAAQS,KAAR,0BAAwC,CACtC8G,KAAM8X,EACNhY,cAAegY,KAInB,EAAKlB,OAAOhf,IAAIuT,EAAUgN,GAEnBL,QAgBb,OAXAV,EACGhS,MAAK,SAAAiS,GACJ,EAAKR,WAAWS,OAAOnM,MAExBtF,OAAM,SAAAb,GAEL,MADA,EAAK6R,WAAWS,OAAOnM,GACjBnG,KAGV1U,KAAKumB,WAAWjf,IAAIuT,EAAUiM,GAEvBA,GA9OX,EAkPE1N,aAAA,SAAaG,GACX,IAAMsB,EAAWuK,EAAS7L,GAC1B,GAAIvZ,KAAKsmB,OAAOxf,IAAI+T,GAElB,OADiB7a,KAAKsmB,OAAOvf,IAAI8T,GAAU2M,SArPjD,EA2PEW,eAAA,SAAetN,GAEb,QA5RkC,WACpC,GACE,eAAgB/G,gBAChB,IAAOA,UAAUsU,WACjB,CACA,IAAKtU,UAAUsU,WAAWC,eAArB,IAA0CC,SAA1C,MACH,OAAO,EAET,GAAIxU,UAAUsU,WAAWG,SACvB,OAAO,EAGX,OAAO,EAgRAC,KAKDxoB,KAAKsmB,OAAOxf,IAAI+T,IAlQxB,EAyQE8J,SAAA,SAAS9J,GAAW,IAAD,OACjB,IAAK7a,KAAKmoB,eAAetN,GACvB,OAAO,EAWT,GANK7a,KAAK0mB,kBAAkB5f,IAAI+T,KAC9B7a,KAAKqP,UAAL,qBAAqC,CAAE5N,SAAUoZ,IACjD7a,KAAK0mB,kBAAkB+B,IAAI5N,IAIzB7a,KAAKinB,iBACP,OAAO,EAGT,IAAMyB,EAAWtD,EAASvK,GAU1B,OAPA7a,KAAK2oB,WAAWD,GAAU5T,MAAK,WACxB,EAAK8R,kBAAkB9f,IAAI+T,KAC9B,EAAKxL,UAAL,yBAAyC,CAAE5N,SAAUoZ,IACrD,EAAK+L,kBAAkB6B,IAAI5N,QAIxB,GApSX,EAuSE8N,WAAA,SAAW9N,GACT,MAAM,IAAI9E,MAAJ,+BAxSV,EA2SEjS,SAAA,SAASyV,GACPvZ,KAAKsX,SAASiC,IA5SlB,EA+SEqP,2BAAA,SAA2BrP,GACzB,IAAMsB,EAAWuK,EAAS7L,GACpB7J,EAAO1P,KAAKymB,WAAW1f,IAAI8T,GACjC,GAAInL,EAAM,CACR,IAAMF,EAAgBuW,EAAgBrW,EAAK8X,SAE3C,MAAM,GAAN,SACKqB,EAAoBrZ,EAAcE,KAAKuW,qBAD5C,CAEER,EAAkB5K,KAGpB,OAAO,MA1Tb,EA8TEiO,eAAA,SAAevP,GACb,IAAMsB,EAAWuK,EAAS7L,GACpB7J,EAAO1P,KAAKsmB,OAAOvf,IAAI8T,GAC7B,OAAOnL,IAA0B,IAAlBA,EAAK+X,UAjUxB,EAoUEE,YAAA,SAAYN,GAAc,IAAD,OACvB,YADuB,IAAbA,MAAU,GACbrnB,KAAK6mB,YAAelB,kCAA2C7Q,MACpE,SAAAwP,GAAQ,IAGFyE,EAFIxR,EAAyB+M,EAAzB/M,OAAQ+P,EAAiBhD,EAAjBgD,aAIhB,GAAe,MAAX/P,GAAkB8P,EAAU,EAE9B,OAAO,EAAKM,YAAYN,EAAU,GAIpC,GAAe,MAAX9P,EACF,IACE,IAAMgQ,EAActhB,KAAKC,MAAMohB,GAC/B,QAA2C/b,IAAvCgc,EAAY7P,uBACd,MAAM,IAAI3B,MAAJ,iCAGRgT,EAAUxB,EACV,MAAO5D,IAKX,OAAOoF,MA9Vf,KAoWMF,EAAsB,SAAA5C,GAAkB,OAC3CtlB,OAAOqoB,gBAAgB/C,IAAuB,IAAInd,KACjD,SAAAmgB,GAAK,MAAItD,SAAkBsD,MAGlBpP,EAAb,YACE,WAAYC,EAAeC,GAAY,OASrC,aARsB,SAAAmP,GAAS,OAC7BpP,EAAc4B,WAAWwN,GACrBpP,EAAc4B,WAAWwN,KACtBpU,KAAKyQ,GAELhQ,OAAM,kBAAM,QACfxJ,QAAQ7M,YAEO6a,IATgB,KADzC,4CAaE4O,WAAA,SAAW9N,GAAW,IAAD,OACbsO,EAAc1D,EAAkB5K,GACtC,OAAOuO,EAAeD,EAAa,CACjCE,YAAY,YACZC,GAAG,UAEFxU,MAAK,kBAGJ,EAAK4S,iBAAiB7M,MAEvB/F,MAAK,SAAAnF,GACJ,GAAIA,EAAO4H,SAAWC,EAAmB8N,QACvC,OAAOvZ,QAAQ7M,UAEjB,IAAM8mB,EAAWrW,EAAO6X,QAClB0B,EAAYlD,EAASC,mBACrBsD,EAAgBV,EAAoBK,GAC1C,OAAOnd,QAAQ3D,IAAImhB,EAAczgB,IAAIsgB,IAAiBtU,MACpD,kBAAMkR,SAhChB,EAqCE0B,iBAAA,SAAiBnO,GACf,OAAO,YAAMmO,iBAAN,UAAuBnO,GAASzE,MAAK,SAAA0U,GAC1C,OAAIA,EAAK/B,SAGA7B,EAAQrM,EAAD,QAAkBzE,MAAK,SAAAwP,GACnC,OAAmB,MAAfA,EAAI/M,OAIC,CACLA,OAAQC,EAAmBzB,OAMxByT,KAGJA,MAzDb,GAAgCrD,GAgEnBnM,EAAY,SAAAyP,GACvB3nB,EAAW2nB,GAGAla,EAAe,CAI1Bma,wBAAyB,SAAAnQ,GAIvB,OAHArU,QAAQC,KAAR,wEAGOrD,EAASyH,EAAE+N,SAASiC,IAE7BoQ,4BAA6B,SAAApQ,GAI3B,OAHArU,QAAQC,KAAR,gFAGOrD,EAASyH,EAAE6P,aAAaG,IAEjChY,QAAS,SAAAgY,GAAO,OAAIzX,EAAS6iB,SAASpL,IAGtCqP,2BAA4B,SAAArP,GAAO,OACjCzX,EAAS8mB,2BAA2BrP,IACtCjC,SAAU,SAAAiC,GAAO,OAAIzX,EAASwV,SAASiC,IACvCH,aAAc,SAAAG,GAAO,OAAIzX,EAASsX,aAAaG,IAC/CoL,SAAU,SAAApL,GAAO,OAAIzX,EAAS6iB,SAASpL,IACvCuP,eAAgB,SAAAvP,GAAO,OAAIzX,EAASgnB,eAAevP,IACnDzV,SAAU,SAAAyV,GAAO,OAAIzX,EAASgC,SAASyV,IACvCoO,YAAa,kBAAM7lB,EAAS6lB,gBAGfpY,a,kCCnhBf,IAAIqa,EAAU,EAEVC,EAAkB,SAAyB5f,GAC7C,IAAIkM,EAAKxV,OAAO8J,UAAUR,EAAK1M,QAAQ,IAAK,KAE5C,GAAW,KAAP4Y,EAAW,CACb,IAAInH,EAAU9B,SAASoB,eAAe6H,GAEtC,GAAInH,EAAS,CACX,IAAI9G,EAAYvH,OAAOmpB,aAAe5c,SAASiH,gBAAgBjM,WAAagF,SAAS6c,KAAK7hB,UACtF8hB,EAAY9c,SAASiH,gBAAgB6V,WAAa9c,SAAS6c,KAAKC,WAAa,EAC7EC,EAAiBtpB,OAAOupB,iBAAiBlb,GACzCmb,EAAkBF,EAAeG,iBAAiB,sBAAwBH,EAAeG,iBAAiB,2BAA6B,MAC3I,OAAOpb,EAAQqb,wBAAwBjU,IAAMlO,EAAYoiB,SAASH,EAAiB,IAAMH,EAAYJ,GAIzG,OAAO,MAGT5sB,EAAQutB,sBAAwB,SAAU7d,EAAG8d,GACvCA,EAAcZ,UAChBA,EAAUY,EAAcZ,SAG1BvR,uBAAsB,WACpB,IAAIoS,EAASZ,EAAgBlpB,OAAOa,SAASyI,MAE9B,OAAXwgB,GACF9pB,OAAOqH,SAAS,EAAGyiB,OAKzBztB,EAAQmR,mBAAqB,SAAU3P,GACrC,IAAIgD,EAAWhD,EAAKkQ,YAAYlN,SAC5BipB,EAASZ,EAAgBroB,EAASyI,MACtC,OAAkB,OAAXwgB,GAAkB,CAAC,EAAGA,K,kCCrC/B,IAAIrd,EAA0B,EAAQ,QAElCrQ,EAAyB,EAAQ,QAErCC,EAAQC,YAAa,EACrBD,EAAQiM,qBAAkB,EAE1B,IAAIrL,EAAYb,EAAuB,EAAQ,SAE3Ce,EAAkBf,EAAuB,EAAQ,SAEjDsQ,EAAQD,EAAwB,EAAQ,SAExCsd,EAAY3tB,EAAuB,EAAQ,SAE3CgB,EAAahB,EAAuB,EAAQ,SAE5C4K,EAAiB,EAAQ,QAEzB1J,EAAU,EAAQ,QAIlB0G,EAAY,CACdgmB,UAAW5sB,EAAWL,QAAQ4B,OAAOuF,WACrCsJ,mBAAoBpQ,EAAWL,QAAQkH,KACvCmK,SAAUhR,EAAWL,QAAQsR,QAAQnK,YAInC+lB,EAA6C,SAAUhrB,GAGzD,SAASgrB,EAA8B/qB,GAUrC,OAPQD,EAAiBG,KAAKC,KAAMH,IAAUG,MALhD,EAAIlC,EAAgBJ,SAASktB,EAA+BhrB,GAe5D,IAAIoB,EAAS4pB,EAA8B3pB,UAuB3C,OArBAD,EAAOU,kBAAoB,WACzB,IAAIU,EAASpC,KAGTqO,EAAOqc,EAAUhtB,QAAQmtB,YAAY7qB,MAErCgD,EAAchD,KAAKH,MACnB2B,EAAWwB,EAAYxB,SACvBmpB,EAAY3nB,EAAY2nB,UAC5B,GAAKtc,EAAL,CACAA,EAAKjD,iBAAiB,UAAU,WAC9BhJ,EAAOvC,MAAM6c,QAAQvW,KAAK3E,EAAUmpB,EAAWtc,EAAKnG,cAEtD,IAAIH,EAAW/H,KAAKH,MAAM6c,QAAQhX,KAAKlE,EAAUmpB,GACjDtc,EAAKrG,SAAS,EAAGD,GAAY,KAG/B/G,EAAO8B,OAAS,WACd,OAAO9C,KAAKH,MAAMkP,UAGb6b,EAvCwC,CAwC/Cvd,EAAM3I,WAEJuE,EAAkB,SAAyBpJ,GAC7C,OAAoBwN,EAAM7J,cAAcvF,EAAQwF,SAAU,MAAM,SAAUjF,GACxE,IAAIgD,EAAWhD,EAAKgD,SACpB,OAAoB6L,EAAM7J,cAAcmE,EAAeC,cAAc+S,SAAU,MAAM,SAAU+B,GAC7F,OAAoBrP,EAAM7J,cAAconB,GAA+B,EAAIhtB,EAAUF,SAAS,GAAImC,EAAO,CACvG6c,QAASA,EACTlb,SAAUA,YAMlBxE,EAAQiM,gBAAkBA,EAC1BA,EAAgBtE,UAAYA,G,qBCvF5B,IAAsB6gB,EAKpB5e,EAAO5J,SALawoB,EAKW5R,EAAQ,UALR4R,EAAE9nB,SAAY8nB,G,yBCsBvCjY,EAAkBqG,EAAQ,QAA1BrG,cAER3G,EAAO5J,QAAUuQ,EACjB3G,EAAO5J,QAAQU,QAAU6P,G,mBCzBzB,SAAS3D,IAeP,OAdAhD,EAAO5J,QAAU4M,EAAW1C,OAAO8B,QAAU,SAAUtG,GACrD,IAAK,IAAI6G,EAAI,EAAGA,EAAIM,UAAUH,OAAQH,IAAK,CACzC,IAAIF,EAASQ,UAAUN,GAEvB,IAAK,IAAI5D,KAAO0D,EACVnC,OAAOjG,UAAUqB,eAAevC,KAAKsJ,EAAQ1D,KAC/CjD,EAAOiD,GAAO0D,EAAO1D,IAK3B,OAAOjD,GAGFkH,EAASiE,MAAM7N,KAAM6J,WAG9BjD,EAAO5J,QAAU4M,G,kCClBjB,4CAsBekhB,UAjBU,SAAC,GAAiC,IAA/BtpB,EAA8B,EAA9BA,SAAUgO,EAAoB,EAApBA,cACpC,OAAKA,EAGEnC,IAAM7J,cAAcunB,IAApB,eACLvpB,WACAgO,iBACGA,EAAcmK,OALV,O,qBCPX,IAAMqR,EAAUpX,EAAQ,Q,EAOpBA,EAAQ,QAAYrE,aALtBma,E,EAAAA,wBACAC,E,EAAAA,4BACAf,E,EAAAA,2BACAtR,E,EAAAA,SACA8B,E,EAAAA,aAGFpc,EAAQqS,UAAY,SAAC4b,EAAKvd,EAAWwd,EAAeC,QAAiB,IAA3Czd,MAAO,IAY/B,IAAIqK,EAAUiT,EAAQliB,KAAI,SAAA6K,GACxB,GAAKA,EAAOA,OAAOsX,GAAnB,CAKAvd,EAAKic,4BAA8BA,EAEnCjc,EAAKgc,wBAA0BA,EAC/Bhc,EAAKkb,2BAA6BA,EAClClb,EAAK4J,SAAWA,EAChB5J,EAAK0L,aAAeA,EAEpB,IAAMzJ,EAASgE,EAAOA,OAAOsX,GAAKvd,EAAMiG,EAAOrO,SAI/C,OAHIqK,GAAUwb,IACZzd,EAAOyd,EAAa,CAAEzd,OAAMiC,SAAQgE,YAE/BhE,MAMT,OAFAoI,EAAUA,EAAQzX,QAAO,SAAAqP,GAAM,YAAI,IAAOA,MAE9BjG,OAAS,EACZqO,EACEmT,EACF,CAACA,GAED,IAIXluB,EAAQmd,eAAiB,SAAC8Q,EAAKvd,EAAMwd,GAAZ,OACvBF,EAAQhY,QACN,SAACoY,EAAUC,GAAX,OACEA,EAAK1X,OAAOsX,GACRG,EAAStW,MAAK,kBAAMuW,EAAK1X,OAAOsX,GAAKvd,EAAM2d,EAAK/lB,YAChD8lB,IACNrf,QAAQ7M,c","file":"app-ea12b9b536627f4c1462.js","sourcesContent":["\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.withPrefix = withPrefix;\nexports.withAssetPrefix = withAssetPrefix;\nexports.navigateTo = exports.replace = exports.push = exports.navigate = exports.default = void 0;\n\nvar _objectWithoutPropertiesLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutPropertiesLoose\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _router = require(\"@reach/router\");\n\nvar _utils = require(\"@reach/router/lib/utils\");\n\nvar _parsePath = require(\"./parse-path\");\n\nexports.parsePath = _parsePath.parsePath;\n\nvar isAbsolutePath = function isAbsolutePath(path) {\n  return path === null || path === void 0 ? void 0 : path.startsWith(\"/\");\n};\n\nfunction withPrefix(path, prefix) {\n  var _ref, _prefix;\n\n  if (prefix === void 0) {\n    prefix = getGlobalBasePrefix();\n  }\n\n  if (!isLocalLink(path)) {\n    return path;\n  }\n\n  if (path.startsWith(\"./\") || path.startsWith(\"../\")) {\n    return path;\n  }\n\n  var base = (_ref = (_prefix = prefix) !== null && _prefix !== void 0 ? _prefix : getGlobalPathPrefix()) !== null && _ref !== void 0 ? _ref : \"/\";\n  return \"\" + ((base === null || base === void 0 ? void 0 : base.endsWith(\"/\")) ? base.slice(0, -1) : base) + (path.startsWith(\"/\") ? path : \"/\" + path);\n} // These global values are wrapped in typeof clauses to ensure the values exist.\n// This is especially problematic in unit testing of this component.\n\n\nvar getGlobalPathPrefix = function getGlobalPathPrefix() {\n  return process.env.NODE_ENV !== \"production\" ? typeof __PATH_PREFIX__ !== \"undefined\" ? __PATH_PREFIX__ : undefined : __PATH_PREFIX__;\n};\n\nvar getGlobalBasePrefix = function getGlobalBasePrefix() {\n  return process.env.NODE_ENV !== \"production\" ? typeof __BASE_PATH__ !== \"undefined\" ? __BASE_PATH__ : undefined : __BASE_PATH__;\n};\n\nvar isLocalLink = function isLocalLink(path) {\n  return path && !path.startsWith(\"http://\") && !path.startsWith(\"https://\") && !path.startsWith(\"//\");\n};\n\nfunction withAssetPrefix(path) {\n  return withPrefix(path, getGlobalPathPrefix());\n}\n\nfunction absolutify(path, current) {\n  // If it's already absolute, return as-is\n  if (isAbsolutePath(path)) {\n    return path;\n  }\n\n  return (0, _utils.resolve)(path, current);\n}\n\nvar rewriteLinkPath = function rewriteLinkPath(path, relativeTo) {\n  if (typeof path === \"number\") {\n    return path;\n  }\n\n  if (!isLocalLink(path)) {\n    return path;\n  }\n\n  return isAbsolutePath(path) ? withPrefix(path) : absolutify(path, relativeTo);\n};\n\nvar NavLinkPropTypes = {\n  activeClassName: _propTypes.default.string,\n  activeStyle: _propTypes.default.object,\n  partiallyActive: _propTypes.default.bool\n}; // Set up IntersectionObserver\n\nvar createIntersectionObserver = function createIntersectionObserver(el, cb) {\n  var io = new window.IntersectionObserver(function (entries) {\n    entries.forEach(function (entry) {\n      if (el === entry.target) {\n        // Check if element is within viewport, remove listener, destroy observer, and run link callback.\n        // MSEdge doesn't currently support isIntersecting, so also test for  an intersectionRatio > 0\n        if (entry.isIntersecting || entry.intersectionRatio > 0) {\n          io.unobserve(el);\n          io.disconnect();\n          cb();\n        }\n      }\n    });\n  }); // Add element to the observer\n\n  io.observe(el);\n  return {\n    instance: io,\n    el: el\n  };\n};\n\nvar GatsbyLink = /*#__PURE__*/function (_React$Component) {\n  (0, _inheritsLoose2.default)(GatsbyLink, _React$Component);\n\n  function GatsbyLink(props) {\n    var _this;\n\n    _this = _React$Component.call(this, props) || this; // Default to no support for IntersectionObserver\n\n    _this.defaultGetProps = function (_ref2) {\n      var isPartiallyCurrent = _ref2.isPartiallyCurrent,\n          isCurrent = _ref2.isCurrent;\n\n      if (_this.props.partiallyActive ? isPartiallyCurrent : isCurrent) {\n        return {\n          className: [_this.props.className, _this.props.activeClassName].filter(Boolean).join(\" \"),\n          style: (0, _extends2.default)({}, _this.props.style, _this.props.activeStyle)\n        };\n      }\n\n      return null;\n    };\n\n    var IOSupported = false;\n\n    if (typeof window !== \"undefined\" && window.IntersectionObserver) {\n      IOSupported = true;\n    }\n\n    _this.state = {\n      IOSupported: IOSupported\n    };\n    _this.handleRef = _this.handleRef.bind((0, _assertThisInitialized2.default)(_this));\n    return _this;\n  }\n\n  var _proto = GatsbyLink.prototype;\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n    // Preserve non IO functionality if no support\n    if (this.props.to !== prevProps.to && !this.state.IOSupported) {\n      ___loader.enqueue((0, _parsePath.parsePath)(rewriteLinkPath(this.props.to, window.location.pathname)).pathname);\n    }\n  };\n\n  _proto.componentDidMount = function componentDidMount() {\n    // Preserve non IO functionality if no support\n    if (!this.state.IOSupported) {\n      ___loader.enqueue((0, _parsePath.parsePath)(rewriteLinkPath(this.props.to, window.location.pathname)).pathname);\n    }\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    if (!this.io) {\n      return;\n    }\n\n    var _this$io = this.io,\n        instance = _this$io.instance,\n        el = _this$io.el;\n    instance.unobserve(el);\n    instance.disconnect();\n  };\n\n  _proto.handleRef = function handleRef(ref) {\n    var _this2 = this;\n\n    if (this.props.innerRef && this.props.innerRef.hasOwnProperty(\"current\")) {\n      this.props.innerRef.current = ref;\n    } else if (this.props.innerRef) {\n      this.props.innerRef(ref);\n    }\n\n    if (this.state.IOSupported && ref) {\n      // If IO supported and element reference found, setup Observer functionality\n      this.io = createIntersectionObserver(ref, function () {\n        ___loader.enqueue((0, _parsePath.parsePath)(rewriteLinkPath(_this2.props.to, window.location.pathname)).pathname);\n      });\n    }\n  };\n\n  _proto.render = function render() {\n    var _this3 = this;\n\n    var _this$props = this.props,\n        to = _this$props.to,\n        _this$props$getProps = _this$props.getProps,\n        getProps = _this$props$getProps === void 0 ? this.defaultGetProps : _this$props$getProps,\n        _onClick = _this$props.onClick,\n        _onMouseEnter = _this$props.onMouseEnter,\n        $activeClassName = _this$props.activeClassName,\n        $activeStyle = _this$props.activeStyle,\n        $innerRef = _this$props.innerRef,\n        partiallyActive = _this$props.partiallyActive,\n        state = _this$props.state,\n        replace = _this$props.replace,\n        rest = (0, _objectWithoutPropertiesLoose2.default)(_this$props, [\"to\", \"getProps\", \"onClick\", \"onMouseEnter\", \"activeClassName\", \"activeStyle\", \"innerRef\", \"partiallyActive\", \"state\", \"replace\"]);\n\n    if (process.env.NODE_ENV !== \"production\" && !isLocalLink(to)) {\n      console.warn(\"External link \" + to + \" was detected in a Link component. Use the Link component only for internal links. See: https://gatsby.dev/internal-links\");\n    }\n\n    return /*#__PURE__*/_react.default.createElement(_router.Location, null, function (_ref3) {\n      var location = _ref3.location;\n      var prefixedTo = rewriteLinkPath(to, location.pathname);\n      return isLocalLink(prefixedTo) ? /*#__PURE__*/_react.default.createElement(_router.Link, (0, _extends2.default)({\n        to: prefixedTo,\n        state: state,\n        getProps: getProps,\n        innerRef: _this3.handleRef,\n        onMouseEnter: function onMouseEnter(e) {\n          if (_onMouseEnter) {\n            _onMouseEnter(e);\n          }\n\n          ___loader.hovering((0, _parsePath.parsePath)(prefixedTo).pathname);\n        },\n        onClick: function onClick(e) {\n          if (_onClick) {\n            _onClick(e);\n          }\n\n          if (e.button === 0 && // ignore right clicks\n          !_this3.props.target && // let browser handle \"target=_blank\"\n          !e.defaultPrevented && // onClick prevented default\n          !e.metaKey && // ignore clicks with modifier keys...\n          !e.altKey && !e.ctrlKey && !e.shiftKey) {\n            e.preventDefault();\n            var shouldReplace = replace;\n            var isCurrent = encodeURI(prefixedTo) === window.location.pathname;\n\n            if (typeof replace !== \"boolean\" && isCurrent) {\n              shouldReplace = true;\n            } // Make sure the necessary scripts and data are\n            // loaded before continuing.\n\n\n            window.___navigate(prefixedTo, {\n              state: state,\n              replace: shouldReplace\n            });\n          }\n\n          return true;\n        }\n      }, rest)) : /*#__PURE__*/_react.default.createElement(\"a\", (0, _extends2.default)({\n        href: prefixedTo\n      }, rest));\n    });\n  };\n\n  return GatsbyLink;\n}(_react.default.Component);\n\nGatsbyLink.propTypes = (0, _extends2.default)({}, NavLinkPropTypes, {\n  onClick: _propTypes.default.func,\n  to: _propTypes.default.string.isRequired,\n  replace: _propTypes.default.bool,\n  state: _propTypes.default.object\n});\n\nvar showDeprecationWarning = function showDeprecationWarning(functionName, altFunctionName, version) {\n  return console.warn(\"The \\\"\" + functionName + \"\\\" method is now deprecated and will be removed in Gatsby v\" + version + \". Please use \\\"\" + altFunctionName + \"\\\" instead.\");\n};\n\nvar _default = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {\n  return /*#__PURE__*/_react.default.createElement(GatsbyLink, (0, _extends2.default)({\n    innerRef: ref\n  }, props));\n});\n\nexports.default = _default;\n\nvar navigate = function navigate(to, options) {\n  window.___navigate(rewriteLinkPath(to, window.location.pathname), options);\n};\n\nexports.navigate = navigate;\n\nvar push = function push(to) {\n  showDeprecationWarning(\"push\", \"navigate\", 3);\n\n  window.___push(rewriteLinkPath(to, window.location.pathname));\n};\n\nexports.push = push;\n\nvar replace = function replace(to) {\n  showDeprecationWarning(\"replace\", \"navigate\", 3);\n\n  window.___replace(rewriteLinkPath(to, window.location.pathname));\n}; // TODO: Remove navigateTo for Gatsby v3\n\n\nexports.replace = replace;\n\nvar navigateTo = function navigateTo(to) {\n  showDeprecationWarning(\"navigateTo\", \"navigate\", 3);\n  return push(to);\n};\n\nexports.navigateTo = navigateTo;","\"use strict\";\n\nexports.__esModule = true;\nexports.SessionStorage = void 0;\nvar STATE_KEY_PREFIX = \"@@scroll|\";\nvar GATSBY_ROUTER_SCROLL_STATE = \"___GATSBY_REACT_ROUTER_SCROLL\";\n\nvar SessionStorage = /*#__PURE__*/function () {\n  function SessionStorage() {}\n\n  var _proto = SessionStorage.prototype;\n\n  _proto.read = function read(location, key) {\n    var stateKey = this.getStateKey(location, key);\n\n    try {\n      var value = window.sessionStorage.getItem(stateKey);\n      return value ? JSON.parse(value) : 0;\n    } catch (e) {\n      if (process.env.NODE_ENV !== \"production\") {\n        console.warn(\"[gatsby-react-router-scroll] Unable to access sessionStorage; sessionStorage is not available.\");\n      }\n\n      if (window && window[GATSBY_ROUTER_SCROLL_STATE] && window[GATSBY_ROUTER_SCROLL_STATE][stateKey]) {\n        return window[GATSBY_ROUTER_SCROLL_STATE][stateKey];\n      }\n\n      return 0;\n    }\n  };\n\n  _proto.save = function save(location, key, value) {\n    var stateKey = this.getStateKey(location, key);\n    var storedValue = JSON.stringify(value);\n\n    try {\n      window.sessionStorage.setItem(stateKey, storedValue);\n    } catch (e) {\n      if (window && window[GATSBY_ROUTER_SCROLL_STATE]) {\n        window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n      } else {\n        window[GATSBY_ROUTER_SCROLL_STATE] = {};\n        window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n      }\n\n      if (process.env.NODE_ENV !== \"production\") {\n        console.warn(\"[gatsby-react-router-scroll] Unable to save state in sessionStorage; sessionStorage is not available.\");\n      }\n    }\n  };\n\n  _proto.getStateKey = function getStateKey(location, key) {\n    var stateKeyBase = \"\" + STATE_KEY_PREFIX + location.pathname;\n    return key === null || typeof key === \"undefined\" ? stateKeyBase : stateKeyBase + \"|\" + key;\n  };\n\n  return SessionStorage;\n}();\n\nexports.SessionStorage = SessionStorage;","var _typeof = require(\"../helpers/typeof\");\n\nfunction _getRequireWildcardCache() {\n  if (typeof WeakMap !== \"function\") return null;\n  var cache = new WeakMap();\n\n  _getRequireWildcardCache = function _getRequireWildcardCache() {\n    return cache;\n  };\n\n  return cache;\n}\n\nfunction _interopRequireWildcard(obj) {\n  if (obj && obj.__esModule) {\n    return obj;\n  }\n\n  if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") {\n    return {\n      \"default\": obj\n    };\n  }\n\n  var cache = _getRequireWildcardCache();\n\n  if (cache && cache.has(obj)) {\n    return cache.get(obj);\n  }\n\n  var newObj = {};\n  var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n\n  for (var key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n\n      if (desc && (desc.get || desc.set)) {\n        Object.defineProperty(newObj, key, desc);\n      } else {\n        newObj[key] = obj[key];\n      }\n    }\n  }\n\n  newObj[\"default\"] = obj;\n\n  if (cache) {\n    cache.set(obj, newObj);\n  }\n\n  return newObj;\n}\n\nmodule.exports = _interopRequireWildcard;","\"use strict\";\n\nexports.__esModule = true;\nexports.useScrollRestoration = useScrollRestoration;\n\nvar _scrollHandler = require(\"./scroll-handler\");\n\nvar _react = require(\"react\");\n\nvar _router = require(\"@reach/router\");\n\nfunction useScrollRestoration(identifier) {\n  var location = (0, _router.useLocation)();\n  var state = (0, _react.useContext)(_scrollHandler.ScrollContext);\n  var ref = (0, _react.useRef)();\n  (0, _react.useLayoutEffect)(function () {\n    if (ref.current) {\n      var position = state.read(location, identifier);\n      ref.current.scrollTo(0, position || 0);\n    }\n  }, []);\n  return {\n    ref: ref,\n    onScroll: function onScroll() {\n      if (ref.current) {\n        state.save(location, identifier, ref.current.scrollTop);\n      }\n    }\n  };\n}","//      \n// An event handler can take an optional event argument\n// and should not return a value\n                                          \n                                                               \n\n// An array of all currently registered event handlers for a type\n                                            \n                                                            \n// A map of event types and their corresponding event handlers.\n                        \n                                 \n                                   \n  \n\n/** Mitt: Tiny (~200b) functional event emitter / pubsub.\n *  @name mitt\n *  @returns {Mitt}\n */\nfunction mitt(all                 ) {\n\tall = all || Object.create(null);\n\n\treturn {\n\t\t/**\n\t\t * Register an event handler for the given type.\n\t\t *\n\t\t * @param  {String} type\tType of event to listen for, or `\"*\"` for all events\n\t\t * @param  {Function} handler Function to call in response to given event\n\t\t * @memberOf mitt\n\t\t */\n\t\ton: function on(type        , handler              ) {\n\t\t\t(all[type] || (all[type] = [])).push(handler);\n\t\t},\n\n\t\t/**\n\t\t * Remove an event handler for the given type.\n\t\t *\n\t\t * @param  {String} type\tType of event to unregister `handler` from, or `\"*\"`\n\t\t * @param  {Function} handler Handler function to remove\n\t\t * @memberOf mitt\n\t\t */\n\t\toff: function off(type        , handler              ) {\n\t\t\tif (all[type]) {\n\t\t\t\tall[type].splice(all[type].indexOf(handler) >>> 0, 1);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Invoke all handlers for the given type.\n\t\t * If present, `\"*\"` handlers are invoked after type-matched handlers.\n\t\t *\n\t\t * @param {String} type  The event type to invoke\n\t\t * @param {Any} [evt]  Any value (object is recommended and powerful), passed to each handler\n\t\t * @memberOf mitt\n\t\t */\n\t\temit: function emit(type        , evt     ) {\n\t\t\t(all[type] || []).slice().map(function (handler) { handler(evt); });\n\t\t\t(all['*'] || []).slice().map(function (handler) { handler(type, evt); });\n\t\t}\n\t};\n}\n\nexport default mitt;\n//# sourceMappingURL=mitt.es.js.map\n","import mitt from \"mitt\"\n\nconst emitter = mitt()\nexport default emitter\n","module.exports = Object.assign\n","\"use strict\";\n\nexports.__esModule = true;\nexports.useScrollRestoration = exports.ScrollContainer = exports.ScrollContext = void 0;\n\nvar _scrollHandler = require(\"./scroll-handler\");\n\nexports.ScrollContext = _scrollHandler.ScrollHandler;\n\nvar _scrollContainer = require(\"./scroll-container\");\n\nexports.ScrollContainer = _scrollContainer.ScrollContainer;\n\nvar _useScrollRestoration = require(\"./use-scroll-restoration\");\n\nexports.useScrollRestoration = _useScrollRestoration.useScrollRestoration;","function _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n\n  return target;\n}\n\nmodule.exports = _objectWithoutPropertiesLoose;","exports.polyfill = Component => Component\n","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar getLocation = function getLocation(source) {\n  var _source$location = source.location,\n      search = _source$location.search,\n      hash = _source$location.hash,\n      href = _source$location.href,\n      origin = _source$location.origin,\n      protocol = _source$location.protocol,\n      host = _source$location.host,\n      hostname = _source$location.hostname,\n      port = _source$location.port;\n  var pathname = source.location.pathname;\n\n\n  if (!pathname && href && canUseDOM) {\n    var url = new URL(href);\n    pathname = url.pathname;\n  }\n\n  return {\n    pathname: encodeURI(decodeURI(pathname)),\n    search: search,\n    hash: hash,\n    href: href,\n    origin: origin,\n    protocol: protocol,\n    host: host,\n    hostname: hostname,\n    port: port,\n    state: source.history.state,\n    key: source.history.state && source.history.state.key || \"initial\"\n  };\n};\n\nvar createHistory = function createHistory(source, options) {\n  var listeners = [];\n  var location = getLocation(source);\n  var transitioning = false;\n  var resolveTransition = function resolveTransition() {};\n\n  return {\n    get location() {\n      return location;\n    },\n\n    get transitioning() {\n      return transitioning;\n    },\n\n    _onTransitionComplete: function _onTransitionComplete() {\n      transitioning = false;\n      resolveTransition();\n    },\n    listen: function listen(listener) {\n      listeners.push(listener);\n\n      var popstateListener = function popstateListener() {\n        location = getLocation(source);\n        listener({ location: location, action: \"POP\" });\n      };\n\n      source.addEventListener(\"popstate\", popstateListener);\n\n      return function () {\n        source.removeEventListener(\"popstate\", popstateListener);\n        listeners = listeners.filter(function (fn) {\n          return fn !== listener;\n        });\n      };\n    },\n    navigate: function navigate(to) {\n      var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n          state = _ref.state,\n          _ref$replace = _ref.replace,\n          replace = _ref$replace === undefined ? false : _ref$replace;\n\n      if (typeof to === \"number\") {\n        source.history.go(to);\n      } else {\n        state = _extends({}, state, { key: Date.now() + \"\" });\n        // try...catch iOS Safari limits to 100 pushState calls\n        try {\n          if (transitioning || replace) {\n            source.history.replaceState(state, null, to);\n          } else {\n            source.history.pushState(state, null, to);\n          }\n        } catch (e) {\n          source.location[replace ? \"replace\" : \"assign\"](to);\n        }\n      }\n\n      location = getLocation(source);\n      transitioning = true;\n      var transition = new Promise(function (res) {\n        return resolveTransition = res;\n      });\n      listeners.forEach(function (listener) {\n        return listener({ location: location, action: \"PUSH\" });\n      });\n      return transition;\n    }\n  };\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Stores history entries in memory for testing or other platforms like Native\nvar createMemorySource = function createMemorySource() {\n  var initialPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"/\";\n\n  var searchIndex = initialPath.indexOf(\"?\");\n  var initialLocation = {\n    pathname: searchIndex > -1 ? initialPath.substr(0, searchIndex) : initialPath,\n    search: searchIndex > -1 ? initialPath.substr(searchIndex) : \"\"\n  };\n  var index = 0;\n  var stack = [initialLocation];\n  var states = [null];\n\n  return {\n    get location() {\n      return stack[index];\n    },\n    addEventListener: function addEventListener(name, fn) {},\n    removeEventListener: function removeEventListener(name, fn) {},\n\n    history: {\n      get entries() {\n        return stack;\n      },\n      get index() {\n        return index;\n      },\n      get state() {\n        return states[index];\n      },\n      pushState: function pushState(state, _, uri) {\n        var _uri$split = uri.split(\"?\"),\n            pathname = _uri$split[0],\n            _uri$split$ = _uri$split[1],\n            search = _uri$split$ === undefined ? \"\" : _uri$split$;\n\n        index++;\n        stack.push({ pathname: pathname, search: search.length ? \"?\" + search : search });\n        states.push(state);\n      },\n      replaceState: function replaceState(state, _, uri) {\n        var _uri$split2 = uri.split(\"?\"),\n            pathname = _uri$split2[0],\n            _uri$split2$ = _uri$split2[1],\n            search = _uri$split2$ === undefined ? \"\" : _uri$split2$;\n\n        stack[index] = { pathname: pathname, search: search };\n        states[index] = state;\n      },\n      go: function go(to) {\n        var newIndex = index + to;\n\n        if (newIndex < 0 || newIndex > states.length - 1) {\n          return;\n        }\n\n        index = newIndex;\n      }\n    }\n  };\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// global history - uses window.history as the source if available, otherwise a\n// memory history\nvar canUseDOM = !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\nvar getSource = function getSource() {\n  return canUseDOM ? window : createMemorySource();\n};\n\nvar globalHistory = createHistory(getSource());\nvar navigate = globalHistory.navigate;\n\n////////////////////////////////////////////////////////////////////////////////\n\nexport { globalHistory, navigate, createHistory, createMemorySource };","\"use strict\";\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.ScrollHandler = exports.ScrollContext = void 0;\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _sessionStorage = require(\"./session-storage\");\n\nvar ScrollContext = React.createContext(new _sessionStorage.SessionStorage());\nexports.ScrollContext = ScrollContext;\nScrollContext.displayName = \"GatsbyScrollContext\";\n\nvar ScrollHandler = /*#__PURE__*/function (_React$Component) {\n  (0, _inheritsLoose2.default)(ScrollHandler, _React$Component);\n\n  function ScrollHandler() {\n    var _this;\n\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n    _this._stateStorage = new _sessionStorage.SessionStorage();\n\n    _this.scrollListener = function () {\n      var key = _this.props.location.key;\n\n      if (key) {\n        _this._stateStorage.save(_this.props.location, key, window.scrollY);\n      }\n    };\n\n    _this.windowScroll = function (position, prevProps) {\n      if (_this.shouldUpdateScroll(prevProps, _this.props)) {\n        window.scrollTo(0, position);\n      }\n    };\n\n    _this.scrollToHash = function (hash, prevProps) {\n      var node = document.getElementById(hash.substring(1));\n\n      if (node && _this.shouldUpdateScroll(prevProps, _this.props)) {\n        node.scrollIntoView();\n      }\n    };\n\n    _this.shouldUpdateScroll = function (prevRouterProps, routerProps) {\n      var shouldUpdateScroll = _this.props.shouldUpdateScroll;\n\n      if (!shouldUpdateScroll) {\n        return true;\n      } // Hack to allow accessing this._stateStorage.\n\n\n      return shouldUpdateScroll.call((0, _assertThisInitialized2.default)(_this), prevRouterProps, routerProps);\n    };\n\n    return _this;\n  }\n\n  var _proto = ScrollHandler.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    window.addEventListener(\"scroll\", this.scrollListener);\n    var scrollPosition;\n    var _this$props$location = this.props.location,\n        key = _this$props$location.key,\n        hash = _this$props$location.hash;\n\n    if (key) {\n      scrollPosition = this._stateStorage.read(this.props.location, key);\n    }\n\n    if (scrollPosition) {\n      this.windowScroll(scrollPosition, undefined);\n    } else if (hash) {\n      this.scrollToHash(decodeURI(hash), undefined);\n    }\n  };\n\n  _proto.componentWillUnmount = function componentWillUnmount() {\n    window.removeEventListener(\"scroll\", this.scrollListener);\n  };\n\n  _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n    var _this$props$location2 = this.props.location,\n        hash = _this$props$location2.hash,\n        key = _this$props$location2.key;\n    var scrollPosition;\n\n    if (key) {\n      scrollPosition = this._stateStorage.read(this.props.location, key);\n    }\n\n    if (hash && scrollPosition === 0) {\n      this.scrollToHash(decodeURI(hash), prevProps);\n    } else {\n      this.windowScroll(scrollPosition, prevProps);\n    }\n  };\n\n  _proto.render = function render() {\n    return /*#__PURE__*/React.createElement(ScrollContext.Provider, {\n      value: this._stateStorage\n    }, this.props.children);\n  };\n\n  return ScrollHandler;\n}(React.Component);\n\nexports.ScrollHandler = ScrollHandler;\nScrollHandler.propTypes = {\n  shouldUpdateScroll: _propTypes.default.func,\n  children: _propTypes.default.element.isRequired,\n  location: _propTypes.default.object.isRequired\n};","import React, { createElement } from \"react\"\nimport PropTypes from \"prop-types\"\nimport { publicLoader } from \"./loader\"\nimport { apiRunner } from \"./api-runner-browser\"\n\n// Renders page\nclass PageRenderer extends React.Component {\n  render() {\n    const props = {\n      ...this.props,\n      pathContext: this.props.pageContext,\n    }\n\n    const [replacementElement] = apiRunner(`replaceComponentRenderer`, {\n      props: this.props,\n      loader: publicLoader,\n    })\n\n    const pageElement =\n      replacementElement ||\n      createElement(this.props.pageResources.component, {\n        ...props,\n        key: this.props.path || this.props.pageResources.page.path,\n      })\n\n    const wrappedPage = apiRunner(\n      `wrapPageElement`,\n      { element: pageElement, props },\n      pageElement,\n      ({ result }) => {\n        return { element: result, props }\n      }\n    ).pop()\n\n    return wrappedPage\n  }\n}\n\nPageRenderer.propTypes = {\n  location: PropTypes.object.isRequired,\n  pageResources: PropTypes.object.isRequired,\n  data: PropTypes.object,\n  pageContext: PropTypes.object.isRequired,\n}\n\nexport default PageRenderer\n","import invariant from \"invariant\";\n\n////////////////////////////////////////////////////////////////////////////////\n// startsWith(string, search) - Check if `string` starts with `search`\nvar startsWith = function startsWith(string, search) {\n  return string.substr(0, search.length) === search;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// pick(routes, uri)\n//\n// Ranks and picks the best route to match. Each segment gets the highest\n// amount of points, then the type of segment gets an additional amount of\n// points where\n//\n//     static > dynamic > splat > root\n//\n// This way we don't have to worry about the order of our routes, let the\n// computers do it.\n//\n// A route looks like this\n//\n//     { path, default, value }\n//\n// And a returned match looks like:\n//\n//     { route, params, uri }\n//\n// I know, I should use TypeScript not comments for these types.\nvar pick = function pick(routes, uri) {\n  var match = void 0;\n  var default_ = void 0;\n\n  var _uri$split = uri.split(\"?\"),\n      uriPathname = _uri$split[0];\n\n  var uriSegments = segmentize(uriPathname);\n  var isRootUri = uriSegments[0] === \"\";\n  var ranked = rankRoutes(routes);\n\n  for (var i = 0, l = ranked.length; i < l; i++) {\n    var missed = false;\n    var route = ranked[i].route;\n\n    if (route.default) {\n      default_ = {\n        route: route,\n        params: {},\n        uri: uri\n      };\n      continue;\n    }\n\n    var routeSegments = segmentize(route.path);\n    var params = {};\n    var max = Math.max(uriSegments.length, routeSegments.length);\n    var index = 0;\n\n    for (; index < max; index++) {\n      var routeSegment = routeSegments[index];\n      var uriSegment = uriSegments[index];\n\n      if (isSplat(routeSegment)) {\n        // Hit a splat, just grab the rest, and return a match\n        // uri:   /files/documents/work\n        // route: /files/*\n        var param = routeSegment.slice(1) || \"*\";\n        params[param] = uriSegments.slice(index).map(decodeURIComponent).join(\"/\");\n        break;\n      }\n\n      if (uriSegment === undefined) {\n        // URI is shorter than the route, no match\n        // uri:   /users\n        // route: /users/:userId\n        missed = true;\n        break;\n      }\n\n      var dynamicMatch = paramRe.exec(routeSegment);\n\n      if (dynamicMatch && !isRootUri) {\n        var matchIsNotReserved = reservedNames.indexOf(dynamicMatch[1]) === -1;\n        !matchIsNotReserved ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"<Router> dynamic segment \\\"\" + dynamicMatch[1] + \"\\\" is a reserved name. Please use a different name in path \\\"\" + route.path + \"\\\".\") : invariant(false) : void 0;\n        var value = decodeURIComponent(uriSegment);\n        params[dynamicMatch[1]] = value;\n      } else if (routeSegment !== uriSegment) {\n        // Current segments don't match, not dynamic, not splat, so no match\n        // uri:   /users/123/settings\n        // route: /users/:id/profile\n        missed = true;\n        break;\n      }\n    }\n\n    if (!missed) {\n      match = {\n        route: route,\n        params: params,\n        uri: \"/\" + uriSegments.slice(0, index).join(\"/\")\n      };\n      break;\n    }\n  }\n\n  return match || default_ || null;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// match(path, uri) - Matches just one path to a uri, also lol\nvar match = function match(path, uri) {\n  return pick([{ path: path }], uri);\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// resolve(to, basepath)\n//\n// Resolves URIs as though every path is a directory, no files.  Relative URIs\n// in the browser can feel awkward because not only can you be \"in a directory\"\n// you can be \"at a file\", too. For example\n//\n//     browserSpecResolve('foo', '/bar/') => /bar/foo\n//     browserSpecResolve('foo', '/bar') => /foo\n//\n// But on the command line of a file system, it's not as complicated, you can't\n// `cd` from a file, only directories.  This way, links have to know less about\n// their current path. To go deeper you can do this:\n//\n//     <Link to=\"deeper\"/>\n//     // instead of\n//     <Link to=`{${props.uri}/deeper}`/>\n//\n// Just like `cd`, if you want to go deeper from the command line, you do this:\n//\n//     cd deeper\n//     # not\n//     cd $(pwd)/deeper\n//\n// By treating every path as a directory, linking to relative paths should\n// require less contextual information and (fingers crossed) be more intuitive.\nvar resolve = function resolve(to, base) {\n  // /foo/bar, /baz/qux => /foo/bar\n  if (startsWith(to, \"/\")) {\n    return to;\n  }\n\n  var _to$split = to.split(\"?\"),\n      toPathname = _to$split[0],\n      toQuery = _to$split[1];\n\n  var _base$split = base.split(\"?\"),\n      basePathname = _base$split[0];\n\n  var toSegments = segmentize(toPathname);\n  var baseSegments = segmentize(basePathname);\n\n  // ?a=b, /users?b=c => /users?a=b\n  if (toSegments[0] === \"\") {\n    return addQuery(basePathname, toQuery);\n  }\n\n  // profile, /users/789 => /users/789/profile\n  if (!startsWith(toSegments[0], \".\")) {\n    var pathname = baseSegments.concat(toSegments).join(\"/\");\n    return addQuery((basePathname === \"/\" ? \"\" : \"/\") + pathname, toQuery);\n  }\n\n  // ./         /users/123  =>  /users/123\n  // ../        /users/123  =>  /users\n  // ../..      /users/123  =>  /\n  // ../../one  /a/b/c/d    =>  /a/b/one\n  // .././one   /a/b/c/d    =>  /a/b/c/one\n  var allSegments = baseSegments.concat(toSegments);\n  var segments = [];\n  for (var i = 0, l = allSegments.length; i < l; i++) {\n    var segment = allSegments[i];\n    if (segment === \"..\") segments.pop();else if (segment !== \".\") segments.push(segment);\n  }\n\n  return addQuery(\"/\" + segments.join(\"/\"), toQuery);\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// insertParams(path, params)\n\nvar insertParams = function insertParams(path, params) {\n  var _path$split = path.split(\"?\"),\n      pathBase = _path$split[0],\n      _path$split$ = _path$split[1],\n      query = _path$split$ === undefined ? \"\" : _path$split$;\n\n  var segments = segmentize(pathBase);\n  var constructedPath = \"/\" + segments.map(function (segment) {\n    var match = paramRe.exec(segment);\n    return match ? params[match[1]] : segment;\n  }).join(\"/\");\n  var _params$location = params.location;\n  _params$location = _params$location === undefined ? {} : _params$location;\n  var _params$location$sear = _params$location.search,\n      search = _params$location$sear === undefined ? \"\" : _params$location$sear;\n\n  var searchSplit = search.split(\"?\")[1] || \"\";\n  constructedPath = addQuery(constructedPath, query, searchSplit);\n  return constructedPath;\n};\n\nvar validateRedirect = function validateRedirect(from, to) {\n  var filter = function filter(segment) {\n    return isDynamic(segment);\n  };\n  var fromString = segmentize(from).filter(filter).sort().join(\"/\");\n  var toString = segmentize(to).filter(filter).sort().join(\"/\");\n  return fromString === toString;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Junk\nvar paramRe = /^:(.+)/;\n\nvar SEGMENT_POINTS = 4;\nvar STATIC_POINTS = 3;\nvar DYNAMIC_POINTS = 2;\nvar SPLAT_PENALTY = 1;\nvar ROOT_POINTS = 1;\n\nvar isRootSegment = function isRootSegment(segment) {\n  return segment === \"\";\n};\nvar isDynamic = function isDynamic(segment) {\n  return paramRe.test(segment);\n};\nvar isSplat = function isSplat(segment) {\n  return segment && segment[0] === \"*\";\n};\n\nvar rankRoute = function rankRoute(route, index) {\n  var score = route.default ? 0 : segmentize(route.path).reduce(function (score, segment) {\n    score += SEGMENT_POINTS;\n    if (isRootSegment(segment)) score += ROOT_POINTS;else if (isDynamic(segment)) score += DYNAMIC_POINTS;else if (isSplat(segment)) score -= SEGMENT_POINTS + SPLAT_PENALTY;else score += STATIC_POINTS;\n    return score;\n  }, 0);\n  return { route: route, score: score, index: index };\n};\n\nvar rankRoutes = function rankRoutes(routes) {\n  return routes.map(rankRoute).sort(function (a, b) {\n    return a.score < b.score ? 1 : a.score > b.score ? -1 : a.index - b.index;\n  });\n};\n\nvar segmentize = function segmentize(uri) {\n  return uri\n  // strip starting/ending slashes\n  .replace(/(^\\/+|\\/+$)/g, \"\").split(\"/\");\n};\n\nvar addQuery = function addQuery(pathname) {\n  for (var _len = arguments.length, query = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    query[_key - 1] = arguments[_key];\n  }\n\n  query = query.filter(function (q) {\n    return q && q.length > 0;\n  });\n  return pathname + (query && query.length > 0 ? \"?\" + query.join(\"&\") : \"\");\n};\n\nvar reservedNames = [\"uri\", \"path\"];\n\n/**\n * Shallow compares two objects.\n * @param {Object} obj1 The first object to compare.\n * @param {Object} obj2 The second object to compare.\n */\nvar shallowCompare = function shallowCompare(obj1, obj2) {\n  var obj1Keys = Object.keys(obj1);\n  return obj1Keys.length === Object.keys(obj2).length && obj1Keys.every(function (key) {\n    return obj2.hasOwnProperty(key) && obj1[key] === obj2[key];\n  });\n};\n\n////////////////////////////////////////////////////////////////////////////////\nexport { startsWith, pick, match, resolve, insertParams, validateRedirect, shallowCompare };","module.exports = [{\n      plugin: require('../node_modules/gatsby-remark-autolink-headers/gatsby-browser.js'),\n      options: {\"plugins\":[]},\n    }]\n","/*!\n * domready (c) Dustin Diaz 2014 - License MIT\n * ie10 fix - Mikael Kristiansson 2019\n */\n!(function(name, definition) {\n  if (typeof module != \"undefined\") module.exports = definition();\n  else if (typeof define == \"function\" && typeof define.amd == \"object\")\n    define(definition);\n  else this[name] = definition();\n})(\"domready\", function() {\n  var ie10 = false;\n  if (navigator.appVersion.indexOf(\"MSIE 10\") !== -1) {\n    ie10 = true;\n  }\n\n  var fns = [],\n    listener,\n    doc = typeof document === \"object\" && document,\n    hack = ie10\n      ? doc.documentElement.doScroll(\"left\")\n      : doc.documentElement.doScroll,\n    domContentLoaded = \"DOMContentLoaded\",\n    loaded =\n      doc && (hack ? /^loaded|^c/ : /^loaded|^i|^c/).test(doc.readyState);\n\n  if (!loaded && doc)\n    doc.addEventListener(\n      domContentLoaded,\n      (listener = function() {\n        doc.removeEventListener(domContentLoaded, listener);\n        loaded = 1;\n        while ((listener = fns.shift())) listener();\n      })\n    );\n\n  return function(fn) {\n    loaded ? setTimeout(fn, 0) : fns.push(fn);\n  };\n});\n","import { apiRunner } from \"./api-runner-browser\"\n\nif (\n  window.location.protocol !== `https:` &&\n  window.location.hostname !== `localhost`\n) {\n  console.error(\n    `Service workers can only be used over HTTPS, or on localhost for development`\n  )\n} else if (`serviceWorker` in navigator) {\n  navigator.serviceWorker\n    .register(`${__BASE_PATH__}/sw.js`)\n    .then(function (reg) {\n      reg.addEventListener(`updatefound`, () => {\n        apiRunner(`onServiceWorkerUpdateFound`, { serviceWorker: reg })\n        // The updatefound event implies that reg.installing is set; see\n        // https://w3c.github.io/ServiceWorker/#service-worker-registration-updatefound-event\n        const installingWorker = reg.installing\n        console.log(`installingWorker`, installingWorker)\n        installingWorker.addEventListener(`statechange`, () => {\n          switch (installingWorker.state) {\n            case `installed`:\n              if (navigator.serviceWorker.controller) {\n                // At this point, the old content will have been purged and the fresh content will\n                // have been added to the cache.\n\n                // We set a flag so Gatsby Link knows to refresh the page on next navigation attempt\n                window.___swUpdated = true\n                // We call the onServiceWorkerUpdateReady API so users can show update prompts.\n                apiRunner(`onServiceWorkerUpdateReady`, { serviceWorker: reg })\n\n                // If resources failed for the current page, reload.\n                if (window.___failedResources) {\n                  console.log(`resources failed, SW updated - reloading`)\n                  window.location.reload()\n                }\n              } else {\n                // At this point, everything has been precached.\n                // It's the perfect time to display a \"Content is cached for offline use.\" message.\n                console.log(`Content is now available offline!`)\n\n                // Post to service worker that install is complete.\n                // Delay to allow time for the event listener to be added --\n                // otherwise fetch is called too soon and resources aren't cached.\n                apiRunner(`onServiceWorkerInstalled`, { serviceWorker: reg })\n              }\n              break\n\n            case `redundant`:\n              console.error(`The installing service worker became redundant.`)\n              apiRunner(`onServiceWorkerRedundant`, { serviceWorker: reg })\n              break\n\n            case `activated`:\n              apiRunner(`onServiceWorkerActive`, { serviceWorker: reg })\n              break\n          }\n        })\n      })\n    })\n    .catch(function (e) {\n      console.error(`Error during service worker registration:`, e)\n    })\n}\n","function _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nmodule.exports = _assertThisInitialized;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n  if (process.env.NODE_ENV !== 'production') {\n    if (format === undefined) {\n      throw new Error('invariant requires an error message argument');\n    }\n  }\n\n  if (!condition) {\n    var error;\n    if (format === undefined) {\n      error = new Error(\n        'Minified exception occurred; use the non-minified dev environment ' +\n        'for the full error message and additional helpful warnings.'\n      );\n    } else {\n      var args = [a, b, c, d, e, f];\n      var argIndex = 0;\n      error = new Error(\n        format.replace(/%s/g, function() { return args[argIndex++]; })\n      );\n      error.name = 'Invariant Violation';\n    }\n\n    error.framesToPop = 1; // we don't care about invariant's own frame\n    throw error;\n  }\n};\n\nmodule.exports = invariant;\n","function _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    \"default\": obj\n  };\n}\n\nmodule.exports = _interopRequireDefault;","// This is extracted to separate module because it's shared\n// between browser and SSR code\nexport const RouteAnnouncerProps = {\n  id: `gatsby-announcer`,\n  style: {\n    position: `absolute`,\n    top: 0,\n    width: 1,\n    height: 1,\n    padding: 0,\n    overflow: `hidden`,\n    clip: `rect(0, 0, 0, 0)`,\n    whiteSpace: `nowrap`,\n    border: 0,\n  },\n  \"aria-live\": `assertive`,\n  \"aria-atomic\": `true`,\n}\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport loader, { PageResourceStatus } from \"./loader\"\nimport redirects from \"./redirects.json\"\nimport { apiRunner } from \"./api-runner-browser\"\nimport emitter from \"./emitter\"\nimport { RouteAnnouncerProps } from \"./route-announcer-props\"\nimport { navigate as reachNavigate } from \"@reach/router\"\nimport { globalHistory } from \"@reach/router/lib/history\"\nimport { parsePath } from \"gatsby-link\"\n\n// Convert to a map for faster lookup in maybeRedirect()\nconst redirectMap = redirects.reduce((map, redirect) => {\n  map[redirect.fromPath] = redirect\n  return map\n}, {})\n\nfunction maybeRedirect(pathname) {\n  const redirect = redirectMap[pathname]\n\n  if (redirect != null) {\n    if (process.env.NODE_ENV !== `production`) {\n      if (!loader.isPageNotFound(pathname)) {\n        console.error(\n          `The route \"${pathname}\" matches both a page and a redirect; this is probably not intentional.`\n        )\n      }\n    }\n\n    window.___replace(redirect.toPath)\n    return true\n  } else {\n    return false\n  }\n}\n\nconst onPreRouteUpdate = (location, prevLocation) => {\n  if (!maybeRedirect(location.pathname)) {\n    apiRunner(`onPreRouteUpdate`, { location, prevLocation })\n  }\n}\n\nconst onRouteUpdate = (location, prevLocation) => {\n  if (!maybeRedirect(location.pathname)) {\n    apiRunner(`onRouteUpdate`, { location, prevLocation })\n  }\n}\n\nconst navigate = (to, options = {}) => {\n  // Support forward/backward navigation with numbers\n  // navigate(-2) (jumps back 2 history steps)\n  // navigate(2)  (jumps forward 2 history steps)\n  if (typeof to === `number`) {\n    globalHistory.navigate(to)\n    return\n  }\n\n  let { pathname } = parsePath(to)\n  const redirect = redirectMap[pathname]\n\n  // If we're redirecting, just replace the passed in pathname\n  // to the one we want to redirect to.\n  if (redirect) {\n    to = redirect.toPath\n    pathname = parsePath(to).pathname\n  }\n\n  // If we had a service worker update, no matter the path, reload window and\n  // reset the pathname whitelist\n  if (window.___swUpdated) {\n    window.location = pathname\n    return\n  }\n\n  // Start a timer to wait for a second before transitioning and showing a\n  // loader in case resources aren't around yet.\n  const timeoutId = setTimeout(() => {\n    emitter.emit(`onDelayedLoadPageResources`, { pathname })\n    apiRunner(`onRouteUpdateDelayed`, {\n      location: window.location,\n    })\n  }, 1000)\n\n  loader.loadPage(pathname).then(pageResources => {\n    // If no page resources, then refresh the page\n    // Do this, rather than simply `window.location.reload()`, so that\n    // pressing the back/forward buttons work - otherwise when pressing\n    // back, the browser will just change the URL and expect JS to handle\n    // the change, which won't always work since it might not be a Gatsby\n    // page.\n    if (!pageResources || pageResources.status === PageResourceStatus.Error) {\n      window.history.replaceState({}, ``, location.href)\n      window.location = pathname\n      clearTimeout(timeoutId)\n      return\n    }\n\n    // If the loaded page has a different compilation hash to the\n    // window, then a rebuild has occurred on the server. Reload.\n    if (process.env.NODE_ENV === `production` && pageResources) {\n      if (\n        pageResources.page.webpackCompilationHash !==\n        window.___webpackCompilationHash\n      ) {\n        // Purge plugin-offline cache\n        if (\n          `serviceWorker` in navigator &&\n          navigator.serviceWorker.controller !== null &&\n          navigator.serviceWorker.controller.state === `activated`\n        ) {\n          navigator.serviceWorker.controller.postMessage({\n            gatsbyApi: `clearPathResources`,\n          })\n        }\n\n        console.log(`Site has changed on server. Reloading browser`)\n        window.location = pathname\n      }\n    }\n    reachNavigate(to, options)\n    clearTimeout(timeoutId)\n  })\n}\n\nfunction shouldUpdateScroll(prevRouterProps, { location }) {\n  const { pathname, hash } = location\n  const results = apiRunner(`shouldUpdateScroll`, {\n    prevRouterProps,\n    // `pathname` for backwards compatibility\n    pathname,\n    routerProps: { location },\n    getSavedScrollPosition: args => this._stateStorage.read(args),\n  })\n  if (results.length > 0) {\n    // Use the latest registered shouldUpdateScroll result, this allows users to override plugin's configuration\n    // @see https://github.com/gatsbyjs/gatsby/issues/12038\n    return results[results.length - 1]\n  }\n\n  if (prevRouterProps) {\n    const {\n      location: { pathname: oldPathname },\n    } = prevRouterProps\n    if (oldPathname === pathname) {\n      // Scroll to element if it exists, if it doesn't, or no hash is provided,\n      // scroll to top.\n      return hash ? decodeURI(hash.slice(1)) : [0, 0]\n    }\n  }\n  return true\n}\n\nfunction init() {\n  // The \"scroll-behavior\" package expects the \"action\" to be on the location\n  // object so let's copy it over.\n  globalHistory.listen(args => {\n    args.location.action = args.action\n  })\n\n  window.___push = to => navigate(to, { replace: false })\n  window.___replace = to => navigate(to, { replace: true })\n  window.___navigate = (to, options) => navigate(to, options)\n\n  // Check for initial page-load redirect\n  maybeRedirect(window.location.pathname)\n}\n\nclass RouteAnnouncer extends React.Component {\n  constructor(props) {\n    super(props)\n    this.announcementRef = React.createRef()\n  }\n\n  componentDidUpdate(prevProps, nextProps) {\n    requestAnimationFrame(() => {\n      let pageName = `new page at ${this.props.location.pathname}`\n      if (document.title) {\n        pageName = document.title\n      }\n      const pageHeadings = document.querySelectorAll(`#gatsby-focus-wrapper h1`)\n      if (pageHeadings && pageHeadings.length) {\n        pageName = pageHeadings[0].textContent\n      }\n      const newAnnouncement = `Navigated to ${pageName}`\n      if (this.announcementRef.current) {\n        const oldAnnouncement = this.announcementRef.current.innerText\n        if (oldAnnouncement !== newAnnouncement) {\n          this.announcementRef.current.innerText = newAnnouncement\n        }\n      }\n    })\n  }\n\n  render() {\n    return <div {...RouteAnnouncerProps} ref={this.announcementRef}></div>\n  }\n}\n\n// Fire on(Pre)RouteUpdate APIs\nclass RouteUpdates extends React.Component {\n  constructor(props) {\n    super(props)\n    onPreRouteUpdate(props.location, null)\n  }\n\n  componentDidMount() {\n    onRouteUpdate(this.props.location, null)\n  }\n\n  componentDidUpdate(prevProps, prevState, shouldFireRouteUpdate) {\n    if (shouldFireRouteUpdate) {\n      onRouteUpdate(this.props.location, prevProps.location)\n    }\n  }\n\n  getSnapshotBeforeUpdate(prevProps) {\n    if (this.props.location.pathname !== prevProps.location.pathname) {\n      onPreRouteUpdate(this.props.location, prevProps.location)\n      return true\n    }\n\n    return false\n  }\n\n  render() {\n    return (\n      <React.Fragment>\n        {this.props.children}\n        <RouteAnnouncer location={location} />\n      </React.Fragment>\n    )\n  }\n}\n\nRouteUpdates.propTypes = {\n  location: PropTypes.object.isRequired,\n}\n\nexport { init, shouldUpdateScroll, RouteUpdates }\n","// Pulled from react-compat\n// https://github.com/developit/preact-compat/blob/7c5de00e7c85e2ffd011bf3af02899b63f699d3a/src/index.js#L349\nfunction shallowDiffers(a, b) {\n  for (var i in a) {\n    if (!(i in b)) return true;\n  }for (var _i in b) {\n    if (a[_i] !== b[_i]) return true;\n  }return false;\n}\n\nexport default (function (instance, nextProps, nextState) {\n  return shallowDiffers(instance.props, nextProps) || shallowDiffers(instance.state, nextState);\n});","import React from \"react\"\nimport loader, { PageResourceStatus } from \"./loader\"\nimport shallowCompare from \"shallow-compare\"\n\nclass EnsureResources extends React.Component {\n  constructor(props) {\n    super()\n    const { location, pageResources } = props\n    this.state = {\n      location: { ...location },\n      pageResources: pageResources || loader.loadPageSync(location.pathname),\n    }\n  }\n\n  static getDerivedStateFromProps({ location }, prevState) {\n    if (prevState.location.href !== location.href) {\n      const pageResources = loader.loadPageSync(location.pathname)\n      return {\n        pageResources,\n        location: { ...location },\n      }\n    }\n\n    return {\n      location: { ...location },\n    }\n  }\n\n  loadResources(rawPath) {\n    loader.loadPage(rawPath).then(pageResources => {\n      if (pageResources && pageResources.status !== PageResourceStatus.Error) {\n        this.setState({\n          location: { ...window.location },\n          pageResources,\n        })\n      } else {\n        window.history.replaceState({}, ``, location.href)\n        window.location = rawPath\n      }\n    })\n  }\n\n  shouldComponentUpdate(nextProps, nextState) {\n    // Always return false if we're missing resources.\n    if (!nextState.pageResources) {\n      this.loadResources(nextProps.location.pathname)\n      return false\n    }\n\n    // Check if the component or json have changed.\n    if (this.state.pageResources !== nextState.pageResources) {\n      return true\n    }\n    if (\n      this.state.pageResources.component !== nextState.pageResources.component\n    ) {\n      return true\n    }\n\n    if (this.state.pageResources.json !== nextState.pageResources.json) {\n      return true\n    }\n    // Check if location has changed on a page using internal routing\n    // via matchPath configuration.\n    if (\n      this.state.location.key !== nextState.location.key &&\n      nextState.pageResources.page &&\n      (nextState.pageResources.page.matchPath ||\n        nextState.pageResources.page.path)\n    ) {\n      return true\n    }\n    return shallowCompare(this, nextProps, nextState)\n  }\n\n  render() {\n    if (process.env.NODE_ENV !== `production` && !this.state.pageResources) {\n      throw new Error(\n        `EnsureResources was not able to find resources for path: \"${this.props.location.pathname}\"\nThis typically means that an issue occurred building components for that path.\nRun \\`gatsby clean\\` to remove any cached elements.`\n      )\n    }\n\n    return this.props.children(this.state)\n  }\n}\n\nexport default EnsureResources\n","import { apiRunner, apiRunnerAsync } from \"./api-runner-browser\"\nimport React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Router, navigate, Location, BaseContext } from \"@reach/router\"\nimport { ScrollContext } from \"gatsby-react-router-scroll\"\nimport domReady from \"@mikaelkristiansson/domready\"\nimport { StaticQueryContext } from \"gatsby\"\nimport {\n  shouldUpdateScroll,\n  init as navigationInit,\n  RouteUpdates,\n} from \"./navigation\"\nimport emitter from \"./emitter\"\nimport PageRenderer from \"./page-renderer\"\nimport asyncRequires from \"$virtual/async-requires\"\nimport {\n  setLoader,\n  ProdLoader,\n  publicLoader,\n  PageResourceStatus,\n} from \"./loader\"\nimport EnsureResources from \"./ensure-resources\"\nimport stripPrefix from \"./strip-prefix\"\n\n// Generated during bootstrap\nimport matchPaths from \"$virtual/match-paths.json\"\n\nconst loader = new ProdLoader(asyncRequires, matchPaths)\nsetLoader(loader)\nloader.setApiRunner(apiRunner)\n\nwindow.asyncRequires = asyncRequires\nwindow.___emitter = emitter\nwindow.___loader = publicLoader\n\nnavigationInit()\n\napiRunnerAsync(`onClientEntry`).then(() => {\n  // Let plugins register a service worker. The plugin just needs\n  // to return true.\n  if (apiRunner(`registerServiceWorker`).length > 0) {\n    require(`./register-service-worker`)\n  }\n\n  // In gatsby v2 if Router is used in page using matchPaths\n  // paths need to contain full path.\n  // For example:\n  //   - page have `/app/*` matchPath\n  //   - inside template user needs to use `/app/xyz` as path\n  // Resetting `basepath`/`baseuri` keeps current behaviour\n  // to not introduce breaking change.\n  // Remove this in v3\n  const RouteHandler = props => (\n    <BaseContext.Provider\n      value={{\n        baseuri: `/`,\n        basepath: `/`,\n      }}\n    >\n      <PageRenderer {...props} />\n    </BaseContext.Provider>\n  )\n\n  const DataContext = React.createContext({})\n\n  class GatsbyRoot extends React.Component {\n    render() {\n      const { children } = this.props\n      return (\n        <Location>\n          {({ location }) => (\n            <EnsureResources location={location}>\n              {({ pageResources, location }) => (\n                <StaticQueryContext.Provider\n                  value={pageResources.staticQueryResults}\n                >\n                  <DataContext.Provider value={{ pageResources, location }}>\n                    {children}\n                  </DataContext.Provider>\n                </StaticQueryContext.Provider>\n              )}\n            </EnsureResources>\n          )}\n        </Location>\n      )\n    }\n  }\n\n  class LocationHandler extends React.Component {\n    render() {\n      return (\n        <DataContext.Consumer>\n          {({ pageResources, location }) => (\n            <RouteUpdates location={location}>\n              <ScrollContext\n                location={location}\n                shouldUpdateScroll={shouldUpdateScroll}\n              >\n                <Router\n                  basepath={__BASE_PATH__}\n                  location={location}\n                  id=\"gatsby-focus-wrapper\"\n                >\n                  <RouteHandler\n                    path={\n                      pageResources.page.path === `/404.html`\n                        ? stripPrefix(location.pathname, __BASE_PATH__)\n                        : encodeURI(\n                            pageResources.page.matchPath ||\n                              pageResources.page.path\n                          )\n                    }\n                    {...this.props}\n                    location={location}\n                    pageResources={pageResources}\n                    {...pageResources.json}\n                  />\n                </Router>\n              </ScrollContext>\n            </RouteUpdates>\n          )}\n        </DataContext.Consumer>\n      )\n    }\n  }\n\n  const { pagePath, location: browserLoc } = window\n\n  // Explicitly call navigate if the canonical path (window.pagePath)\n  // is different to the browser path (window.location.pathname). But\n  // only if NONE of the following conditions hold:\n  //\n  // - The url matches a client side route (page.matchPath)\n  // - it's a 404 page\n  // - it's the offline plugin shell (/offline-plugin-app-shell-fallback/)\n  if (\n    pagePath &&\n    __BASE_PATH__ + pagePath !== browserLoc.pathname &&\n    !(\n      loader.findMatchPath(stripPrefix(browserLoc.pathname, __BASE_PATH__)) ||\n      pagePath === `/404.html` ||\n      pagePath.match(/^\\/404\\/?$/) ||\n      pagePath.match(/^\\/offline-plugin-app-shell-fallback\\/?$/)\n    )\n  ) {\n    navigate(__BASE_PATH__ + pagePath + browserLoc.search + browserLoc.hash, {\n      replace: true,\n    })\n  }\n\n  publicLoader.loadPage(browserLoc.pathname).then(page => {\n    if (!page || page.status === PageResourceStatus.Error) {\n      throw new Error(\n        `page resources for ${browserLoc.pathname} not found. Not rendering React`\n      )\n    }\n\n    window.___webpackCompilationHash = page.page.webpackCompilationHash\n\n    const SiteRoot = apiRunner(\n      `wrapRootElement`,\n      { element: <LocationHandler /> },\n      <LocationHandler />,\n      ({ result }) => {\n        return { element: result }\n      }\n    ).pop()\n\n    const App = () => <GatsbyRoot>{SiteRoot}</GatsbyRoot>\n\n    const renderer = apiRunner(\n      `replaceHydrateFunction`,\n      undefined,\n      ReactDOM.hydrate\n    )[0]\n\n    domReady(() => {\n      renderer(\n        <App />,\n        typeof window !== `undefined`\n          ? document.getElementById(`___gatsby`)\n          : void 0,\n        () => {\n          apiRunner(`onInitialClientRender`)\n        }\n      )\n    })\n  })\n})\n","function _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n  subClass.__proto__ = superClass;\n}\n\nmodule.exports = _inheritsLoose;","// prefer default export if available\nconst preferDefault = m => m && m.default || m\n\nexports.components = {\n  \"component---src-templates-doc-jsx\": () => import(\"./../../src/templates/doc.jsx\" /* webpackChunkName: \"component---src-templates-doc-jsx\" */),\n  \"component---src-templates-main-jsx\": () => import(\"./../../src/templates/main.jsx\" /* webpackChunkName: \"component---src-templates-main-jsx\" */)\n}\n\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport Link, {\n  withPrefix,\n  withAssetPrefix,\n  navigate,\n  push,\n  replace,\n  navigateTo,\n  parsePath,\n} from \"gatsby-link\"\nimport { useScrollRestoration } from \"gatsby-react-router-scroll\"\nimport PageRenderer from \"./public-page-renderer\"\nimport loader from \"./loader\"\n\nconst prefetchPathname = loader.enqueue\n\nconst StaticQueryContext = React.createContext({})\n\nfunction StaticQueryDataRenderer({ staticQueryData, data, query, render }) {\n  const finalData = data\n    ? data.data\n    : staticQueryData[query] && staticQueryData[query].data\n\n  return (\n    <React.Fragment>\n      {finalData && render(finalData)}\n      {!finalData && <div>Loading (StaticQuery)</div>}\n    </React.Fragment>\n  )\n}\n\nconst StaticQuery = props => {\n  const { data, query, render, children } = props\n\n  return (\n    <StaticQueryContext.Consumer>\n      {staticQueryData => (\n        <StaticQueryDataRenderer\n          data={data}\n          query={query}\n          render={render || children}\n          staticQueryData={staticQueryData}\n        />\n      )}\n    </StaticQueryContext.Consumer>\n  )\n}\n\nconst useStaticQuery = query => {\n  if (\n    typeof React.useContext !== `function` &&\n    process.env.NODE_ENV === `development`\n  ) {\n    throw new Error(\n      `You're likely using a version of React that doesn't support Hooks\\n` +\n        `Please update React and ReactDOM to 16.8.0 or later to use the useStaticQuery hook.`\n    )\n  }\n  const context = React.useContext(StaticQueryContext)\n\n  // query is a stringified number like `3303882` when wrapped with graphql, If a user forgets\n  // to wrap the query in a grqphql, then casting it to a Number results in `NaN` allowing us to\n  // catch the misuse of the API and give proper direction\n  if (isNaN(Number(query))) {\n    throw new Error(`useStaticQuery was called with a string but expects to be called using \\`graphql\\`. Try this:\n\nimport { useStaticQuery, graphql } from 'gatsby';\n\nuseStaticQuery(graphql\\`${query}\\`);\n`)\n  }\n\n  if (context?.[query]?.data) {\n    return context[query].data\n  } else {\n    throw new Error(\n      `The result of this StaticQuery could not be fetched.\\n\\n` +\n        `This is likely a bug in Gatsby and if refreshing the page does not fix it, ` +\n        `please open an issue in https://github.com/gatsbyjs/gatsby/issues`\n    )\n  }\n}\n\nStaticQuery.propTypes = {\n  data: PropTypes.object,\n  query: PropTypes.string.isRequired,\n  render: PropTypes.func,\n  children: PropTypes.func,\n}\n\nfunction graphql() {\n  throw new Error(\n    `It appears like Gatsby is misconfigured. Gatsby related \\`graphql\\` calls ` +\n      `are supposed to only be evaluated at compile time, and then compiled away. ` +\n      `Unfortunately, something went wrong and the query was left in the compiled code.\\n\\n` +\n      `Unless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.`\n  )\n}\n\nexport {\n  Link,\n  withAssetPrefix,\n  withPrefix,\n  graphql,\n  parsePath,\n  navigate,\n  push, // TODO replace for v3\n  replace, // TODO remove replace for v3\n  navigateTo, // TODO: remove navigateTo for v3\n  useScrollRestoration,\n  StaticQueryContext,\n  StaticQuery,\n  PageRenderer,\n  useStaticQuery,\n  prefetchPathname,\n}\n","var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/* eslint-disable jsx-a11y/anchor-has-content */\nimport React, { useContext } from \"react\";\nimport PropTypes from \"prop-types\";\nimport invariant from \"invariant\";\nimport createContext from \"create-react-context\";\nimport { polyfill } from \"react-lifecycles-compat\";\nimport { startsWith, pick, resolve, match, insertParams, validateRedirect, shallowCompare } from \"./lib/utils\";\nimport { globalHistory, navigate, createHistory, createMemorySource } from \"./lib/history\";\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar createNamedContext = function createNamedContext(name, defaultValue) {\n  var Ctx = createContext(defaultValue);\n  Ctx.displayName = name;\n  return Ctx;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Location Context/Provider\nvar LocationContext = createNamedContext(\"Location\");\n\n// sets up a listener if there isn't one already so apps don't need to be\n// wrapped in some top level provider\nvar Location = function Location(_ref) {\n  var children = _ref.children;\n  return React.createElement(\n    LocationContext.Consumer,\n    null,\n    function (context) {\n      return context ? children(context) : React.createElement(\n        LocationProvider,\n        null,\n        children\n      );\n    }\n  );\n};\n\nvar LocationProvider = function (_React$Component) {\n  _inherits(LocationProvider, _React$Component);\n\n  function LocationProvider() {\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, LocationProvider);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {\n      context: _this.getContext(),\n      refs: { unlisten: null }\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  LocationProvider.prototype.getContext = function getContext() {\n    var _props$history = this.props.history,\n        navigate = _props$history.navigate,\n        location = _props$history.location;\n\n    return { navigate: navigate, location: location };\n  };\n\n  LocationProvider.prototype.componentDidCatch = function componentDidCatch(error, info) {\n    if (isRedirect(error)) {\n      var _navigate = this.props.history.navigate;\n\n      _navigate(error.uri, { replace: true });\n    } else {\n      throw error;\n    }\n  };\n\n  LocationProvider.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n    if (prevState.context.location !== this.state.context.location) {\n      this.props.history._onTransitionComplete();\n    }\n  };\n\n  LocationProvider.prototype.componentDidMount = function componentDidMount() {\n    var _this2 = this;\n\n    var refs = this.state.refs,\n        history = this.props.history;\n\n    history._onTransitionComplete();\n    refs.unlisten = history.listen(function () {\n      Promise.resolve().then(function () {\n        // TODO: replace rAF with react deferred update API when it's ready https://github.com/facebook/react/issues/13306\n        requestAnimationFrame(function () {\n          if (!_this2.unmounted) {\n            _this2.setState(function () {\n              return { context: _this2.getContext() };\n            });\n          }\n        });\n      });\n    });\n  };\n\n  LocationProvider.prototype.componentWillUnmount = function componentWillUnmount() {\n    var refs = this.state.refs;\n\n    this.unmounted = true;\n    refs.unlisten();\n  };\n\n  LocationProvider.prototype.render = function render() {\n    var context = this.state.context,\n        children = this.props.children;\n\n    return React.createElement(\n      LocationContext.Provider,\n      { value: context },\n      typeof children === \"function\" ? children(context) : children || null\n    );\n  };\n\n  return LocationProvider;\n}(React.Component);\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nLocationProvider.defaultProps = {\n  history: globalHistory\n};\nprocess.env.NODE_ENV !== \"production\" ? LocationProvider.propTypes = {\n  history: PropTypes.object.isRequired\n} : void 0;\nvar ServerLocation = function ServerLocation(_ref2) {\n  var url = _ref2.url,\n      children = _ref2.children;\n\n  var searchIndex = url.indexOf(\"?\");\n  var searchExists = searchIndex > -1;\n  var pathname = void 0;\n  var search = \"\";\n  var hash = \"\";\n\n  if (searchExists) {\n    pathname = url.substring(0, searchIndex);\n    search = url.substring(searchIndex);\n  } else {\n    pathname = url;\n  }\n\n  return React.createElement(\n    LocationContext.Provider,\n    {\n      value: {\n        location: {\n          pathname: pathname,\n          search: search,\n          hash: hash\n        },\n        navigate: function navigate() {\n          throw new Error(\"You can't call navigate on the server.\");\n        }\n      }\n    },\n    children\n  );\n};\n////////////////////////////////////////////////////////////////////////////////\n// Sets baseuri and basepath for nested routers and links\nvar BaseContext = createNamedContext(\"Base\", { baseuri: \"/\", basepath: \"/\" });\n\n////////////////////////////////////////////////////////////////////////////////\n// The main event, welcome to the show everybody.\nvar Router = function Router(props) {\n  return React.createElement(\n    BaseContext.Consumer,\n    null,\n    function (baseContext) {\n      return React.createElement(\n        Location,\n        null,\n        function (locationContext) {\n          return React.createElement(RouterImpl, _extends({}, baseContext, locationContext, props));\n        }\n      );\n    }\n  );\n};\n\nvar RouterImpl = function (_React$PureComponent) {\n  _inherits(RouterImpl, _React$PureComponent);\n\n  function RouterImpl() {\n    _classCallCheck(this, RouterImpl);\n\n    return _possibleConstructorReturn(this, _React$PureComponent.apply(this, arguments));\n  }\n\n  RouterImpl.prototype.render = function render() {\n    var _props = this.props,\n        location = _props.location,\n        _navigate2 = _props.navigate,\n        basepath = _props.basepath,\n        primary = _props.primary,\n        children = _props.children,\n        baseuri = _props.baseuri,\n        _props$component = _props.component,\n        component = _props$component === undefined ? \"div\" : _props$component,\n        domProps = _objectWithoutProperties(_props, [\"location\", \"navigate\", \"basepath\", \"primary\", \"children\", \"baseuri\", \"component\"]);\n\n    var routes = React.Children.toArray(children).reduce(function (array, child) {\n      var routes = createRoute(basepath)(child);\n      return array.concat(routes);\n    }, []);\n    var pathname = location.pathname;\n\n\n    var match = pick(routes, pathname);\n\n    if (match) {\n      var params = match.params,\n          uri = match.uri,\n          route = match.route,\n          element = match.route.value;\n\n      // remove the /* from the end for child routes relative paths\n\n      basepath = route.default ? basepath : route.path.replace(/\\*$/, \"\");\n\n      var props = _extends({}, params, {\n        uri: uri,\n        location: location,\n        navigate: function navigate(to, options) {\n          return _navigate2(resolve(to, uri), options);\n        }\n      });\n\n      var clone = React.cloneElement(element, props, element.props.children ? React.createElement(\n        Router,\n        { location: location, primary: primary },\n        element.props.children\n      ) : undefined);\n\n      // using 'div' for < 16.3 support\n      var FocusWrapper = primary ? FocusHandler : component;\n      // don't pass any props to 'div'\n      var wrapperProps = primary ? _extends({ uri: uri, location: location, component: component }, domProps) : domProps;\n\n      return React.createElement(\n        BaseContext.Provider,\n        { value: { baseuri: uri, basepath: basepath } },\n        React.createElement(\n          FocusWrapper,\n          wrapperProps,\n          clone\n        )\n      );\n    } else {\n      // Not sure if we want this, would require index routes at every level\n      // warning(\n      //   false,\n      //   `<Router basepath=\"${basepath}\">\\n\\nNothing matched:\\n\\t${\n      //     location.pathname\n      //   }\\n\\nPaths checked: \\n\\t${routes\n      //     .map(route => route.path)\n      //     .join(\n      //       \"\\n\\t\"\n      //     )}\\n\\nTo get rid of this warning, add a default NotFound component as child of Router:\n      //   \\n\\tlet NotFound = () => <div>Not Found!</div>\n      //   \\n\\t<Router>\\n\\t  <NotFound default/>\\n\\t  {/* ... */}\\n\\t</Router>`\n      // );\n      return null;\n    }\n  };\n\n  return RouterImpl;\n}(React.PureComponent);\n\nRouterImpl.defaultProps = {\n  primary: true\n};\n\n\nvar FocusContext = createNamedContext(\"Focus\");\n\nvar FocusHandler = function FocusHandler(_ref3) {\n  var uri = _ref3.uri,\n      location = _ref3.location,\n      component = _ref3.component,\n      domProps = _objectWithoutProperties(_ref3, [\"uri\", \"location\", \"component\"]);\n\n  return React.createElement(\n    FocusContext.Consumer,\n    null,\n    function (requestFocus) {\n      return React.createElement(FocusHandlerImpl, _extends({}, domProps, {\n        component: component,\n        requestFocus: requestFocus,\n        uri: uri,\n        location: location\n      }));\n    }\n  );\n};\n\n// don't focus on initial render\nvar initialRender = true;\nvar focusHandlerCount = 0;\n\nvar FocusHandlerImpl = function (_React$Component2) {\n  _inherits(FocusHandlerImpl, _React$Component2);\n\n  function FocusHandlerImpl() {\n    var _temp2, _this4, _ret2;\n\n    _classCallCheck(this, FocusHandlerImpl);\n\n    for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n      args[_key2] = arguments[_key2];\n    }\n\n    return _ret2 = (_temp2 = (_this4 = _possibleConstructorReturn(this, _React$Component2.call.apply(_React$Component2, [this].concat(args))), _this4), _this4.state = {}, _this4.requestFocus = function (node) {\n      if (!_this4.state.shouldFocus && node) {\n        node.focus();\n      }\n    }, _temp2), _possibleConstructorReturn(_this4, _ret2);\n  }\n\n  FocusHandlerImpl.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {\n    var initial = prevState.uri == null;\n    if (initial) {\n      return _extends({\n        shouldFocus: true\n      }, nextProps);\n    } else {\n      var myURIChanged = nextProps.uri !== prevState.uri;\n      var navigatedUpToMe = prevState.location.pathname !== nextProps.location.pathname && nextProps.location.pathname === nextProps.uri;\n      return _extends({\n        shouldFocus: myURIChanged || navigatedUpToMe\n      }, nextProps);\n    }\n  };\n\n  FocusHandlerImpl.prototype.componentDidMount = function componentDidMount() {\n    focusHandlerCount++;\n    this.focus();\n  };\n\n  FocusHandlerImpl.prototype.componentWillUnmount = function componentWillUnmount() {\n    focusHandlerCount--;\n    if (focusHandlerCount === 0) {\n      initialRender = true;\n    }\n  };\n\n  FocusHandlerImpl.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n    if (prevProps.location !== this.props.location && this.state.shouldFocus) {\n      this.focus();\n    }\n  };\n\n  FocusHandlerImpl.prototype.focus = function focus() {\n    if (process.env.NODE_ENV === \"test\") {\n      // getting cannot read property focus of null in the tests\n      // and that bit of global `initialRender` state causes problems\n      // should probably figure it out!\n      return;\n    }\n\n    var requestFocus = this.props.requestFocus;\n\n\n    if (requestFocus) {\n      requestFocus(this.node);\n    } else {\n      if (initialRender) {\n        initialRender = false;\n      } else if (this.node) {\n        // React polyfills [autofocus] and it fires earlier than cDM,\n        // so we were stealing focus away, this line prevents that.\n        if (!this.node.contains(document.activeElement)) {\n          this.node.focus();\n        }\n      }\n    }\n  };\n\n  FocusHandlerImpl.prototype.render = function render() {\n    var _this5 = this;\n\n    var _props2 = this.props,\n        children = _props2.children,\n        style = _props2.style,\n        requestFocus = _props2.requestFocus,\n        _props2$component = _props2.component,\n        Comp = _props2$component === undefined ? \"div\" : _props2$component,\n        uri = _props2.uri,\n        location = _props2.location,\n        domProps = _objectWithoutProperties(_props2, [\"children\", \"style\", \"requestFocus\", \"component\", \"uri\", \"location\"]);\n\n    return React.createElement(\n      Comp,\n      _extends({\n        style: _extends({ outline: \"none\" }, style),\n        tabIndex: \"-1\",\n        ref: function ref(n) {\n          return _this5.node = n;\n        }\n      }, domProps),\n      React.createElement(\n        FocusContext.Provider,\n        { value: this.requestFocus },\n        this.props.children\n      )\n    );\n  };\n\n  return FocusHandlerImpl;\n}(React.Component);\n\npolyfill(FocusHandlerImpl);\n\nvar k = function k() {};\n\n////////////////////////////////////////////////////////////////////////////////\nvar forwardRef = React.forwardRef;\n\nif (typeof forwardRef === \"undefined\") {\n  forwardRef = function forwardRef(C) {\n    return C;\n  };\n}\n\nvar Link = forwardRef(function (_ref4, ref) {\n  var innerRef = _ref4.innerRef,\n      props = _objectWithoutProperties(_ref4, [\"innerRef\"]);\n\n  return React.createElement(\n    BaseContext.Consumer,\n    null,\n    function (_ref5) {\n      var basepath = _ref5.basepath,\n          baseuri = _ref5.baseuri;\n      return React.createElement(\n        Location,\n        null,\n        function (_ref6) {\n          var location = _ref6.location,\n              navigate = _ref6.navigate;\n\n          var to = props.to,\n              state = props.state,\n              replace = props.replace,\n              _props$getProps = props.getProps,\n              getProps = _props$getProps === undefined ? k : _props$getProps,\n              anchorProps = _objectWithoutProperties(props, [\"to\", \"state\", \"replace\", \"getProps\"]);\n\n          var href = resolve(to, baseuri);\n          var encodedHref = encodeURI(href);\n          var isCurrent = location.pathname === encodedHref;\n          var isPartiallyCurrent = startsWith(location.pathname, encodedHref);\n\n          return React.createElement(\"a\", _extends({\n            ref: ref || innerRef,\n            \"aria-current\": isCurrent ? \"page\" : undefined\n          }, anchorProps, getProps({ isCurrent: isCurrent, isPartiallyCurrent: isPartiallyCurrent, href: href, location: location }), {\n            href: href,\n            onClick: function onClick(event) {\n              if (anchorProps.onClick) anchorProps.onClick(event);\n              if (shouldNavigate(event)) {\n                event.preventDefault();\n                var shouldReplace = replace;\n                if (typeof replace !== \"boolean\" && isCurrent) {\n                  var _location$state = _extends({}, location.state),\n                      key = _location$state.key,\n                      restState = _objectWithoutProperties(_location$state, [\"key\"]);\n\n                  shouldReplace = shallowCompare(_extends({}, state), restState);\n                }\n                navigate(href, {\n                  state: state,\n                  replace: shouldReplace\n                });\n              }\n            }\n          }));\n        }\n      );\n    }\n  );\n});\n\nLink.displayName = \"Link\";\n\nprocess.env.NODE_ENV !== \"production\" ? Link.propTypes = {\n  to: PropTypes.string.isRequired\n} : void 0;\n\n////////////////////////////////////////////////////////////////////////////////\nfunction RedirectRequest(uri) {\n  this.uri = uri;\n}\n\nvar isRedirect = function isRedirect(o) {\n  return o instanceof RedirectRequest;\n};\n\nvar redirectTo = function redirectTo(to) {\n  throw new RedirectRequest(to);\n};\n\nvar RedirectImpl = function (_React$Component3) {\n  _inherits(RedirectImpl, _React$Component3);\n\n  function RedirectImpl() {\n    _classCallCheck(this, RedirectImpl);\n\n    return _possibleConstructorReturn(this, _React$Component3.apply(this, arguments));\n  }\n\n  // Support React < 16 with this hook\n  RedirectImpl.prototype.componentDidMount = function componentDidMount() {\n    var _props3 = this.props,\n        navigate = _props3.navigate,\n        to = _props3.to,\n        from = _props3.from,\n        _props3$replace = _props3.replace,\n        replace = _props3$replace === undefined ? true : _props3$replace,\n        state = _props3.state,\n        noThrow = _props3.noThrow,\n        baseuri = _props3.baseuri,\n        props = _objectWithoutProperties(_props3, [\"navigate\", \"to\", \"from\", \"replace\", \"state\", \"noThrow\", \"baseuri\"]);\n\n    Promise.resolve().then(function () {\n      var resolvedTo = resolve(to, baseuri);\n      navigate(insertParams(resolvedTo, props), { replace: replace, state: state });\n    });\n  };\n\n  RedirectImpl.prototype.render = function render() {\n    var _props4 = this.props,\n        navigate = _props4.navigate,\n        to = _props4.to,\n        from = _props4.from,\n        replace = _props4.replace,\n        state = _props4.state,\n        noThrow = _props4.noThrow,\n        baseuri = _props4.baseuri,\n        props = _objectWithoutProperties(_props4, [\"navigate\", \"to\", \"from\", \"replace\", \"state\", \"noThrow\", \"baseuri\"]);\n\n    var resolvedTo = resolve(to, baseuri);\n    if (!noThrow) redirectTo(insertParams(resolvedTo, props));\n    return null;\n  };\n\n  return RedirectImpl;\n}(React.Component);\n\nvar Redirect = function Redirect(props) {\n  return React.createElement(\n    BaseContext.Consumer,\n    null,\n    function (_ref7) {\n      var baseuri = _ref7.baseuri;\n      return React.createElement(\n        Location,\n        null,\n        function (locationContext) {\n          return React.createElement(RedirectImpl, _extends({}, locationContext, { baseuri: baseuri }, props));\n        }\n      );\n    }\n  );\n};\n\nprocess.env.NODE_ENV !== \"production\" ? Redirect.propTypes = {\n  from: PropTypes.string,\n  to: PropTypes.string.isRequired\n} : void 0;\n\n////////////////////////////////////////////////////////////////////////////////\nvar Match = function Match(_ref8) {\n  var path = _ref8.path,\n      children = _ref8.children;\n  return React.createElement(\n    BaseContext.Consumer,\n    null,\n    function (_ref9) {\n      var baseuri = _ref9.baseuri;\n      return React.createElement(\n        Location,\n        null,\n        function (_ref10) {\n          var navigate = _ref10.navigate,\n              location = _ref10.location;\n\n          var resolvedPath = resolve(path, baseuri);\n          var result = match(resolvedPath, location.pathname);\n          return children({\n            navigate: navigate,\n            location: location,\n            match: result ? _extends({}, result.params, {\n              uri: result.uri,\n              path: path\n            }) : null\n          });\n        }\n      );\n    }\n  );\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Hooks\n\nvar useLocation = function useLocation() {\n  var context = useContext(LocationContext);\n\n  if (!context) {\n    throw new Error(\"useLocation hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n  }\n\n  return context.location;\n};\n\nvar useNavigate = function useNavigate() {\n  var context = useContext(LocationContext);\n\n  if (!context) {\n    throw new Error(\"useNavigate hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n  }\n\n  return context.navigate;\n};\n\nvar useParams = function useParams() {\n  var context = useContext(BaseContext);\n\n  if (!context) {\n    throw new Error(\"useParams hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n  }\n\n  var location = useLocation();\n\n  var results = match(context.basepath, location.pathname);\n\n  return results ? results.params : null;\n};\n\nvar useMatch = function useMatch(path) {\n  if (!path) {\n    throw new Error(\"useMatch(path: string) requires an argument of a string to match against\");\n  }\n  var context = useContext(BaseContext);\n\n  if (!context) {\n    throw new Error(\"useMatch hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n  }\n\n  var location = useLocation();\n\n  var resolvedPath = resolve(path, context.baseuri);\n  var result = match(resolvedPath, location.pathname);\n  return result ? _extends({}, result.params, {\n    uri: result.uri,\n    path: path\n  }) : null;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Junk\nvar stripSlashes = function stripSlashes(str) {\n  return str.replace(/(^\\/+|\\/+$)/g, \"\");\n};\n\nvar createRoute = function createRoute(basepath) {\n  return function (element) {\n    if (!element) {\n      return null;\n    }\n\n    if (element.type === React.Fragment && element.props.children) {\n      return React.Children.map(element.props.children, createRoute(basepath));\n    }\n    !(element.props.path || element.props.default || element.type === Redirect) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"<Router>: Children of <Router> must have a `path` or `default` prop, or be a `<Redirect>`. None found on element type `\" + element.type + \"`\") : invariant(false) : void 0;\n\n    !!(element.type === Redirect && (!element.props.from || !element.props.to)) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"<Redirect from=\\\"\" + element.props.from + \"\\\" to=\\\"\" + element.props.to + \"\\\"/> requires both \\\"from\\\" and \\\"to\\\" props when inside a <Router>.\") : invariant(false) : void 0;\n\n    !!(element.type === Redirect && !validateRedirect(element.props.from, element.props.to)) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \"<Redirect from=\\\"\" + element.props.from + \" to=\\\"\" + element.props.to + \"\\\"/> has mismatched dynamic segments, ensure both paths have the exact same dynamic segments.\") : invariant(false) : void 0;\n\n    if (element.props.default) {\n      return { value: element, default: true };\n    }\n\n    var elementPath = element.type === Redirect ? element.props.from : element.props.path;\n\n    var path = elementPath === \"/\" ? basepath : stripSlashes(basepath) + \"/\" + stripSlashes(elementPath);\n\n    return {\n      value: element,\n      default: element.props.default,\n      path: element.props.children ? stripSlashes(path) + \"/*\" : path\n    };\n  };\n};\n\nvar shouldNavigate = function shouldNavigate(event) {\n  return !event.defaultPrevented && event.button === 0 && !(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n};\n\n////////////////////////////////////////////////////////////////////////\nexport {  Link, Location, LocationProvider, Match, Redirect, Router, ServerLocation, createHistory, createMemorySource, isRedirect, navigate, redirectTo, globalHistory, match as matchPath, useLocation, useNavigate, useParams, useMatch , BaseContext };","function _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    module.exports = _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    module.exports = _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nmodule.exports = _typeof;","/**\n * Remove a prefix from a string. Return the input string if the given prefix\n * isn't found.\n */\n\nexport default function stripPrefix(str, prefix = ``) {\n  if (!prefix) {\n    return str\n  }\n\n  if (str === prefix) {\n    return `/`\n  }\n\n  if (str.startsWith(`${prefix}/`)) {\n    return str.slice(prefix.length)\n  }\n\n  return str\n}\n","\"use strict\";\n\nexports.__esModule = true;\nexports.parsePath = parsePath;\n\nfunction parsePath(path) {\n  var pathname = path || \"/\";\n  var search = \"\";\n  var hash = \"\";\n  var hashIndex = pathname.indexOf(\"#\");\n\n  if (hashIndex !== -1) {\n    hash = pathname.substr(hashIndex);\n    pathname = pathname.substr(0, hashIndex);\n  }\n\n  var searchIndex = pathname.indexOf(\"?\");\n\n  if (searchIndex !== -1) {\n    search = pathname.substr(searchIndex);\n    pathname = pathname.substr(0, searchIndex);\n  }\n\n  return {\n    pathname: pathname,\n    search: search === \"?\" ? \"\" : search,\n    hash: hash === \"#\" ? \"\" : hash\n  };\n}","export default function _inheritsLoose(subClass, superClass) {\n  subClass.prototype = Object.create(superClass.prototype);\n  subClass.prototype.constructor = subClass;\n  subClass.__proto__ = superClass;\n}","export default function _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) {\n    arr2[i] = arr[i];\n  }\n\n  return arr2;\n}","import arrayWithoutHoles from \"./arrayWithoutHoles\";\nimport iterableToArray from \"./iterableToArray\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray\";\nimport nonIterableSpread from \"./nonIterableSpread\";\nexport default function _toConsumableArray(arr) {\n  return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray\";\nexport default function _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}","import arrayLikeToArray from \"./arrayLikeToArray\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","const support = function (feature) {\n  if (typeof document === `undefined`) {\n    return false\n  }\n  const fakeLink = document.createElement(`link`)\n  try {\n    if (fakeLink.relList && typeof fakeLink.relList.supports === `function`) {\n      return fakeLink.relList.supports(feature)\n    }\n  } catch (err) {\n    return false\n  }\n  return false\n}\n\nconst linkPrefetchStrategy = function (url, options) {\n  return new Promise((resolve, reject) => {\n    if (typeof document === `undefined`) {\n      reject()\n      return\n    }\n\n    const link = document.createElement(`link`)\n    link.setAttribute(`rel`, `prefetch`)\n    link.setAttribute(`href`, url)\n\n    Object.keys(options).forEach(key => {\n      link.setAttribute(key, options[key])\n    })\n\n    link.onload = resolve\n    link.onerror = reject\n\n    const parentElement =\n      document.getElementsByTagName(`head`)[0] ||\n      document.getElementsByName(`script`)[0].parentNode\n    parentElement.appendChild(link)\n  })\n}\n\nconst xhrPrefetchStrategy = function (url) {\n  return new Promise((resolve, reject) => {\n    const req = new XMLHttpRequest()\n    req.open(`GET`, url, true)\n\n    req.onload = () => {\n      if (req.status === 200) {\n        resolve()\n      } else {\n        reject()\n      }\n    }\n\n    req.send(null)\n  })\n}\n\nconst supportedPrefetchStrategy = support(`prefetch`)\n  ? linkPrefetchStrategy\n  : xhrPrefetchStrategy\n\nconst preFetched = {}\n\nconst prefetch = function (url, options) {\n  return new Promise(resolve => {\n    if (preFetched[url]) {\n      resolve()\n      return\n    }\n\n    supportedPrefetchStrategy(url, options)\n      .then(() => {\n        resolve()\n        preFetched[url] = true\n      })\n      .catch(() => {}) // 404s are logged to the console anyway\n  })\n}\n\nexport default prefetch\n","export default path => {\n  if (path === undefined) {\n    return path\n  }\n  if (path === `/`) {\n    return `/`\n  }\n  if (path.charAt(path.length - 1) === `/`) {\n    return path.slice(0, -1)\n  }\n  return path\n}\n","import { match } from \"@reach/router/lib/utils\"\nimport stripPrefix from \"./strip-prefix\"\nimport normalizePagePath from \"./normalize-page-path\"\n\nconst pathCache = new Map()\nlet matchPaths = []\n\nconst trimPathname = rawPathname => {\n  const pathname = decodeURIComponent(rawPathname)\n  // Remove the pathPrefix from the pathname.\n  const trimmedPathname = stripPrefix(pathname, __BASE_PATH__)\n    // Remove any hashfragment\n    .split(`#`)[0]\n    // Remove search query\n    .split(`?`)[0]\n\n  return trimmedPathname\n}\n\nfunction absolutify(path) {\n  // If it's already absolute, return as-is\n  if (\n    path.startsWith(`/`) ||\n    path.startsWith(`https://`) ||\n    path.startsWith(`http://`)\n  ) {\n    return path\n  }\n  // Calculate path relative to current location, adding a trailing slash to\n  // match behavior of @reach/router\n  return new URL(\n    path,\n    window.location.href + (window.location.href.endsWith(`/`) ? `` : `/`)\n  ).pathname\n}\n\n/**\n * Set list of matchPaths\n *\n * @param {Array<{path: string, matchPath: string}>} value collection of matchPaths\n */\nexport const setMatchPaths = value => {\n  matchPaths = value\n}\n\n/**\n * Return a matchpath url\n * if `match-paths.json` contains `{ \"/foo*\": \"/page1\", ...}`, then\n * `/foo?bar=far` => `/page1`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string|null}\n */\nexport const findMatchPath = rawPathname => {\n  const trimmedPathname = cleanPath(rawPathname)\n\n  for (const { matchPath, path } of matchPaths) {\n    if (match(matchPath, trimmedPathname)) {\n      return normalizePagePath(path)\n    }\n  }\n\n  return null\n}\n\n// Given a raw URL path, returns the cleaned version of it (trim off\n// `#` and query params), or if it matches an entry in\n// `match-paths.json`, its matched path is returned\n//\n// E.g. `/foo?bar=far` => `/foo`\n//\n// Or if `match-paths.json` contains `{ \"/foo*\": \"/page1\", ...}`, then\n// `/foo?bar=far` => `/page1`\nexport const findPath = rawPathname => {\n  const trimmedPathname = trimPathname(absolutify(rawPathname))\n  if (pathCache.has(trimmedPathname)) {\n    return pathCache.get(trimmedPathname)\n  }\n\n  let foundPath = findMatchPath(trimmedPathname)\n\n  if (!foundPath) {\n    foundPath = cleanPath(rawPathname)\n  }\n\n  pathCache.set(trimmedPathname, foundPath)\n\n  return foundPath\n}\n\n/**\n * Clean a url and converts /index.html => /\n * E.g. `/foo?bar=far` => `/foo`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string}\n */\nexport const cleanPath = rawPathname => {\n  const trimmedPathname = trimPathname(absolutify(rawPathname))\n\n  let foundPath = trimmedPathname\n  if (foundPath === `/index.html`) {\n    foundPath = `/`\n  }\n\n  foundPath = normalizePagePath(foundPath)\n\n  return foundPath\n}\n","import prefetchHelper from \"./prefetch\"\nimport emitter from \"./emitter\"\nimport { setMatchPaths, findPath, findMatchPath } from \"./find-path\"\n\n/**\n * Available resource loading statuses\n */\nexport const PageResourceStatus = {\n  /**\n   * At least one of critical resources failed to load\n   */\n  Error: `error`,\n  /**\n   * Resources loaded successfully\n   */\n  Success: `success`,\n}\n\nconst preferDefault = m => (m && m.default) || m\n\nconst stripSurroundingSlashes = s => {\n  s = s[0] === `/` ? s.slice(1) : s\n  s = s.endsWith(`/`) ? s.slice(0, -1) : s\n  return s\n}\n\nconst createPageDataUrl = path => {\n  const fixedPath = path === `/` ? `index` : stripSurroundingSlashes(path)\n  return `${__PATH_PREFIX__}/page-data/${fixedPath}/page-data.json`\n}\n\nfunction doFetch(url, method = `GET`) {\n  return new Promise((resolve, reject) => {\n    const req = new XMLHttpRequest()\n    req.open(method, url, true)\n    req.onreadystatechange = () => {\n      if (req.readyState == 4) {\n        resolve(req)\n      }\n    }\n    req.send(null)\n  })\n}\n\nconst doesConnectionSupportPrefetch = () => {\n  if (\n    `connection` in navigator &&\n    typeof navigator.connection !== `undefined`\n  ) {\n    if ((navigator.connection.effectiveType || ``).includes(`2g`)) {\n      return false\n    }\n    if (navigator.connection.saveData) {\n      return false\n    }\n  }\n  return true\n}\n\nconst toPageResources = (pageData, component = null) => {\n  const page = {\n    componentChunkName: pageData.componentChunkName,\n    path: pageData.path,\n    webpackCompilationHash: pageData.webpackCompilationHash,\n    matchPath: pageData.matchPath,\n    staticQueryHashes: pageData.staticQueryHashes,\n  }\n\n  return {\n    component,\n    json: pageData.result,\n    page,\n  }\n}\n\nexport class BaseLoader {\n  constructor(loadComponent, matchPaths) {\n    // Map of pagePath -> Page. Where Page is an object with: {\n    //   status: PageResourceStatus.Success || PageResourceStatus.Error,\n    //   payload: PageResources, // undefined if PageResourceStatus.Error\n    // }\n    // PageResources is {\n    //   component,\n    //   json: pageData.result,\n    //   page: {\n    //     componentChunkName,\n    //     path,\n    //     webpackCompilationHash,\n    //     staticQueryHashes\n    //   },\n    //   staticQueryResults\n    // }\n    this.pageDb = new Map()\n    this.inFlightDb = new Map()\n    this.staticQueryDb = new Map()\n    this.pageDataDb = new Map()\n    this.prefetchTriggered = new Set()\n    this.prefetchCompleted = new Set()\n    this.loadComponent = loadComponent\n    setMatchPaths(matchPaths)\n  }\n\n  inFlightNetworkRequests = new Map()\n\n  memoizedGet(url) {\n    let inFlightPromise = this.inFlightNetworkRequests.get(url)\n\n    if (!inFlightPromise) {\n      inFlightPromise = doFetch(url, `GET`)\n      this.inFlightNetworkRequests.set(url, inFlightPromise)\n    }\n\n    // Prefer duplication with then + catch over .finally to prevent problems in ie11 + firefox\n    return inFlightPromise\n      .then(response => {\n        this.inFlightNetworkRequests.delete(url)\n        return response\n      })\n      .catch(err => {\n        this.inFlightNetworkRequests.delete(url)\n        throw err\n      })\n  }\n\n  setApiRunner(apiRunner) {\n    this.apiRunner = apiRunner\n    this.prefetchDisabled = apiRunner(`disableCorePrefetching`).some(a => a)\n  }\n\n  fetchPageDataJson(loadObj) {\n    const { pagePath, retries = 0 } = loadObj\n    const url = createPageDataUrl(pagePath)\n    return this.memoizedGet(url).then(req => {\n      const { status, responseText } = req\n\n      // Handle 200\n      if (status === 200) {\n        try {\n          const jsonPayload = JSON.parse(responseText)\n          if (jsonPayload.path === undefined) {\n            throw new Error(`not a valid pageData response`)\n          }\n\n          return Object.assign(loadObj, {\n            status: PageResourceStatus.Success,\n            payload: jsonPayload,\n          })\n        } catch (err) {\n          // continue regardless of error\n        }\n      }\n\n      // Handle 404\n      if (status === 404 || status === 200) {\n        // If the request was for a 404 page and it doesn't exist, we're done\n        if (pagePath === `/404.html`) {\n          return Object.assign(loadObj, {\n            status: PageResourceStatus.Error,\n          })\n        }\n\n        // Need some code here to cache the 404 request. In case\n        // multiple loadPageDataJsons result in 404s\n        return this.fetchPageDataJson(\n          Object.assign(loadObj, { pagePath: `/404.html`, notFound: true })\n        )\n      }\n\n      // handle 500 response (Unrecoverable)\n      if (status === 500) {\n        return Object.assign(loadObj, {\n          status: PageResourceStatus.Error,\n        })\n      }\n\n      // Handle everything else, including status === 0, and 503s. Should retry\n      if (retries < 3) {\n        return this.fetchPageDataJson(\n          Object.assign(loadObj, { retries: retries + 1 })\n        )\n      }\n\n      // Retried 3 times already, result is an error.\n      return Object.assign(loadObj, {\n        status: PageResourceStatus.Error,\n      })\n    })\n  }\n\n  loadPageDataJson(rawPath) {\n    const pagePath = findPath(rawPath)\n    if (this.pageDataDb.has(pagePath)) {\n      return Promise.resolve(this.pageDataDb.get(pagePath))\n    }\n\n    return this.fetchPageDataJson({ pagePath }).then(pageData => {\n      this.pageDataDb.set(pagePath, pageData)\n\n      return pageData\n    })\n  }\n\n  findMatchPath(rawPath) {\n    return findMatchPath(rawPath)\n  }\n\n  // TODO check all uses of this and whether they use undefined for page resources not exist\n  loadPage(rawPath) {\n    const pagePath = findPath(rawPath)\n    if (this.pageDb.has(pagePath)) {\n      const page = this.pageDb.get(pagePath)\n      return Promise.resolve(page.payload)\n    }\n\n    if (this.inFlightDb.has(pagePath)) {\n      return this.inFlightDb.get(pagePath)\n    }\n\n    const inFlightPromise = Promise.all([\n      this.loadAppData(),\n      this.loadPageDataJson(pagePath),\n    ]).then(allData => {\n      const result = allData[1]\n      if (result.status === PageResourceStatus.Error) {\n        return {\n          status: PageResourceStatus.Error,\n        }\n      }\n\n      let pageData = result.payload\n      const { componentChunkName, staticQueryHashes = [] } = pageData\n\n      const finalResult = {}\n\n      const componentChunkPromise = this.loadComponent(componentChunkName).then(\n        component => {\n          finalResult.createdAt = new Date()\n          let pageResources\n          if (!component) {\n            finalResult.status = PageResourceStatus.Error\n          } else {\n            finalResult.status = PageResourceStatus.Success\n            if (result.notFound === true) {\n              finalResult.notFound = true\n            }\n            pageData = Object.assign(pageData, {\n              webpackCompilationHash: allData[0]\n                ? allData[0].webpackCompilationHash\n                : ``,\n            })\n            pageResources = toPageResources(pageData, component)\n          }\n          // undefined if final result is an error\n          return pageResources\n        }\n      )\n\n      const staticQueryBatchPromise = Promise.all(\n        staticQueryHashes.map(staticQueryHash => {\n          // Check for cache in case this static query result has already been loaded\n          if (this.staticQueryDb.has(staticQueryHash)) {\n            const jsonPayload = this.staticQueryDb.get(staticQueryHash)\n            return { staticQueryHash, jsonPayload }\n          }\n\n          return this.memoizedGet(\n            `${__PATH_PREFIX__}/static/d/${staticQueryHash}.json`\n          ).then(req => {\n            const jsonPayload = JSON.parse(req.responseText)\n            return { staticQueryHash, jsonPayload }\n          })\n        })\n      ).then(staticQueryResults => {\n        const staticQueryResultsMap = {}\n\n        staticQueryResults.forEach(({ staticQueryHash, jsonPayload }) => {\n          staticQueryResultsMap[staticQueryHash] = jsonPayload\n          this.staticQueryDb.set(staticQueryHash, jsonPayload)\n        })\n\n        return staticQueryResultsMap\n      })\n\n      return Promise.all([componentChunkPromise, staticQueryBatchPromise]).then(\n        ([pageResources, staticQueryResults]) => {\n          let payload\n          if (pageResources) {\n            payload = { ...pageResources, staticQueryResults }\n            finalResult.payload = payload\n            emitter.emit(`onPostLoadPageResources`, {\n              page: payload,\n              pageResources: payload,\n            })\n          }\n\n          this.pageDb.set(pagePath, finalResult)\n\n          return payload\n        }\n      )\n    })\n\n    inFlightPromise\n      .then(response => {\n        this.inFlightDb.delete(pagePath)\n      })\n      .catch(error => {\n        this.inFlightDb.delete(pagePath)\n        throw error\n      })\n\n    this.inFlightDb.set(pagePath, inFlightPromise)\n\n    return inFlightPromise\n  }\n\n  // returns undefined if loading page ran into errors\n  loadPageSync(rawPath) {\n    const pagePath = findPath(rawPath)\n    if (this.pageDb.has(pagePath)) {\n      const pageData = this.pageDb.get(pagePath).payload\n      return pageData\n    }\n    return undefined\n  }\n\n  shouldPrefetch(pagePath) {\n    // Skip prefetching if we know user is on slow or constrained connection\n    if (!doesConnectionSupportPrefetch()) {\n      return false\n    }\n\n    // Check if the page exists.\n    if (this.pageDb.has(pagePath)) {\n      return false\n    }\n\n    return true\n  }\n\n  prefetch(pagePath) {\n    if (!this.shouldPrefetch(pagePath)) {\n      return false\n    }\n\n    // Tell plugins with custom prefetching logic that they should start\n    // prefetching this path.\n    if (!this.prefetchTriggered.has(pagePath)) {\n      this.apiRunner(`onPrefetchPathname`, { pathname: pagePath })\n      this.prefetchTriggered.add(pagePath)\n    }\n\n    // If a plugin has disabled core prefetching, stop now.\n    if (this.prefetchDisabled) {\n      return false\n    }\n\n    const realPath = findPath(pagePath)\n    // Todo make doPrefetch logic cacheable\n    // eslint-disable-next-line consistent-return\n    this.doPrefetch(realPath).then(() => {\n      if (!this.prefetchCompleted.has(pagePath)) {\n        this.apiRunner(`onPostPrefetchPathname`, { pathname: pagePath })\n        this.prefetchCompleted.add(pagePath)\n      }\n    })\n\n    return true\n  }\n\n  doPrefetch(pagePath) {\n    throw new Error(`doPrefetch not implemented`)\n  }\n\n  hovering(rawPath) {\n    this.loadPage(rawPath)\n  }\n\n  getResourceURLsForPathname(rawPath) {\n    const pagePath = findPath(rawPath)\n    const page = this.pageDataDb.get(pagePath)\n    if (page) {\n      const pageResources = toPageResources(page.payload)\n\n      return [\n        ...createComponentUrls(pageResources.page.componentChunkName),\n        createPageDataUrl(pagePath),\n      ]\n    } else {\n      return null\n    }\n  }\n\n  isPageNotFound(rawPath) {\n    const pagePath = findPath(rawPath)\n    const page = this.pageDb.get(pagePath)\n    return page && page.notFound === true\n  }\n\n  loadAppData(retries = 0) {\n    return this.memoizedGet(`${__PATH_PREFIX__}/page-data/app-data.json`).then(\n      req => {\n        const { status, responseText } = req\n\n        let appData\n\n        if (status !== 200 && retries < 3) {\n          // Retry 3 times incase of non-200 responses\n          return this.loadAppData(retries + 1)\n        }\n\n        // Handle 200\n        if (status === 200) {\n          try {\n            const jsonPayload = JSON.parse(responseText)\n            if (jsonPayload.webpackCompilationHash === undefined) {\n              throw new Error(`not a valid app-data response`)\n            }\n\n            appData = jsonPayload\n          } catch (err) {\n            // continue regardless of error\n          }\n        }\n\n        return appData\n      }\n    )\n  }\n}\n\nconst createComponentUrls = componentChunkName =>\n  (window.___chunkMapping[componentChunkName] || []).map(\n    chunk => __PATH_PREFIX__ + chunk\n  )\n\nexport class ProdLoader extends BaseLoader {\n  constructor(asyncRequires, matchPaths) {\n    const loadComponent = chunkName =>\n      asyncRequires.components[chunkName]\n        ? asyncRequires.components[chunkName]()\n            .then(preferDefault)\n            // loader will handle the case when component is null\n            .catch(() => null)\n        : Promise.resolve()\n\n    super(loadComponent, matchPaths)\n  }\n\n  doPrefetch(pagePath) {\n    const pageDataUrl = createPageDataUrl(pagePath)\n    return prefetchHelper(pageDataUrl, {\n      crossOrigin: `anonymous`,\n      as: `fetch`,\n    })\n      .then(() =>\n        // This was just prefetched, so will return a response from\n        // the cache instead of making another request to the server\n        this.loadPageDataJson(pagePath)\n      )\n      .then(result => {\n        if (result.status !== PageResourceStatus.Success) {\n          return Promise.resolve()\n        }\n        const pageData = result.payload\n        const chunkName = pageData.componentChunkName\n        const componentUrls = createComponentUrls(chunkName)\n        return Promise.all(componentUrls.map(prefetchHelper)).then(\n          () => pageData\n        )\n      })\n  }\n\n  loadPageDataJson(rawPath) {\n    return super.loadPageDataJson(rawPath).then(data => {\n      if (data.notFound) {\n        // check if html file exist using HEAD request:\n        // if it does we should navigate to it instead of showing 404\n        return doFetch(rawPath, `HEAD`).then(req => {\n          if (req.status === 200) {\n            // page (.html file) actually exist (or we asked for 404 )\n            // returning page resources status as errored to trigger\n            // regular browser navigation to given page\n            return {\n              status: PageResourceStatus.Error,\n            }\n          }\n\n          // if HEAD request wasn't 200, return notFound result\n          // and show 404 page\n          return data\n        })\n      }\n      return data\n    })\n  }\n}\n\nlet instance\n\nexport const setLoader = _loader => {\n  instance = _loader\n}\n\nexport const publicLoader = {\n  // Deprecated methods. As far as we're aware, these are only used by\n  // core gatsby and the offline plugin, however there's a very small\n  // chance they're called by others.\n  getResourcesForPathname: rawPath => {\n    console.warn(\n      `Warning: getResourcesForPathname is deprecated. Use loadPage instead`\n    )\n    return instance.i.loadPage(rawPath)\n  },\n  getResourcesForPathnameSync: rawPath => {\n    console.warn(\n      `Warning: getResourcesForPathnameSync is deprecated. Use loadPageSync instead`\n    )\n    return instance.i.loadPageSync(rawPath)\n  },\n  enqueue: rawPath => instance.prefetch(rawPath),\n\n  // Real methods\n  getResourceURLsForPathname: rawPath =>\n    instance.getResourceURLsForPathname(rawPath),\n  loadPage: rawPath => instance.loadPage(rawPath),\n  loadPageSync: rawPath => instance.loadPageSync(rawPath),\n  prefetch: rawPath => instance.prefetch(rawPath),\n  isPageNotFound: rawPath => instance.isPageNotFound(rawPath),\n  hovering: rawPath => instance.hovering(rawPath),\n  loadAppData: () => instance.loadAppData(),\n}\n\nexport default publicLoader\n","\"use strict\";\n\nvar offsetY = 0;\n\nvar getTargetOffset = function getTargetOffset(hash) {\n  var id = window.decodeURI(hash.replace(\"#\", \"\"));\n\n  if (id !== \"\") {\n    var element = document.getElementById(id);\n\n    if (element) {\n      var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;\n      var clientTop = document.documentElement.clientTop || document.body.clientTop || 0;\n      var computedStyles = window.getComputedStyle(element);\n      var scrollMarginTop = computedStyles.getPropertyValue(\"scroll-margin-top\") || computedStyles.getPropertyValue(\"scroll-snap-margin-top\") || \"0px\";\n      return element.getBoundingClientRect().top + scrollTop - parseInt(scrollMarginTop, 10) - clientTop - offsetY;\n    }\n  }\n\n  return null;\n};\n\nexports.onInitialClientRender = function (_, pluginOptions) {\n  if (pluginOptions.offsetY) {\n    offsetY = pluginOptions.offsetY;\n  }\n\n  requestAnimationFrame(function () {\n    var offset = getTargetOffset(window.location.hash);\n\n    if (offset !== null) {\n      window.scrollTo(0, offset);\n    }\n  });\n};\n\nexports.shouldUpdateScroll = function (_ref) {\n  var location = _ref.routerProps.location;\n  var offset = getTargetOffset(location.hash);\n  return offset !== null ? [0, offset] : true;\n};","\"use strict\";\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.ScrollContainer = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _scrollHandler = require(\"./scroll-handler\");\n\nvar _router = require(\"@reach/router\");\n\n// TODO: In Gatsby v3, this file should be removed.\n// We are deprecating this in V2 in favor of useScrollRestoration\nvar propTypes = {\n  scrollKey: _propTypes.default.string.isRequired,\n  shouldUpdateScroll: _propTypes.default.func,\n  children: _propTypes.default.element.isRequired\n};\nvar hasNotWarnedDeprecation = true;\n\nvar ScrollContainerImplementation = /*#__PURE__*/function (_React$Component) {\n  (0, _inheritsLoose2.default)(ScrollContainerImplementation, _React$Component);\n\n  function ScrollContainerImplementation(props) {\n    var _this;\n\n    _this = _React$Component.call(this, props) || this;\n\n    if (process.env.NODE_ENV !== \"production\" && hasNotWarnedDeprecation) {\n      hasNotWarnedDeprecation = false;\n      console.log(\"Deprecation Warning:\\n\\n  Gatsby <ScrollContainer> is deprecated in Gatsby v2 and will be removed in Gatsby v3.\\n  Update to the React hook alternative useScrollRestoration, like this:.\\n  \\n  ```\\n  import React from 'react';\\n  import { useScrollRestoration } from 'gatsby-react-router-scroll';\\n\\n  function Component() {\\n    const scrollRestoration = useScrollRestoration('\" + _this.props.scrollKey + \"');\\n\\n    return <ul {...scrollRestoration} />;\\n  }\\n  ```\\n  \");\n    }\n\n    return _this;\n  }\n\n  var _proto = ScrollContainerImplementation.prototype;\n\n  _proto.componentDidMount = function componentDidMount() {\n    var _this2 = this;\n\n    // eslint-disable-next-line react/no-find-dom-node\n    var node = _reactDom.default.findDOMNode(this);\n\n    var _this$props = this.props,\n        location = _this$props.location,\n        scrollKey = _this$props.scrollKey;\n    if (!node) return;\n    node.addEventListener(\"scroll\", function () {\n      _this2.props.context.save(location, scrollKey, node.scrollTop);\n    });\n    var position = this.props.context.read(location, scrollKey);\n    node.scrollTo(0, position || 0);\n  };\n\n  _proto.render = function render() {\n    return this.props.children;\n  };\n\n  return ScrollContainerImplementation;\n}(React.Component);\n\nvar ScrollContainer = function ScrollContainer(props) {\n  return /*#__PURE__*/React.createElement(_router.Location, null, function (_ref) {\n    var location = _ref.location;\n    return /*#__PURE__*/React.createElement(_scrollHandler.ScrollContext.Consumer, null, function (context) {\n      return /*#__PURE__*/React.createElement(ScrollContainerImplementation, (0, _extends2.default)({}, props, {\n        context: context,\n        location: location\n      }));\n    });\n  });\n};\n\nexports.ScrollContainer = ScrollContainer;\nScrollContainer.propTypes = propTypes;","const preferDefault = m => (m && m.default) || m\n\nif (process.env.BUILD_STAGE === `develop`) {\n  module.exports = preferDefault(require(`./public-page-renderer-dev`))\n} else if (process.env.BUILD_STAGE === `build-javascript`) {\n  module.exports = preferDefault(require(`./public-page-renderer-prod`))\n} else {\n  module.exports = () => null\n}\n","/*\n  Why commonjs and not ES imports/exports?\n\n  This module is used to alias `create-react-context` package, but drop the the actual implementation part\n  because Gatsby requires version of react that has implementatoin baked in.\n  \n  Package source is using ES modules:\n    - https://github.com/jamiebuilds/create-react-context/blob/v0.3.0/src/index.js\n  \n  But to build this package `babel-plugin-add-module-exports` is used ( https://www.npmjs.com/package/babel-plugin-add-module-exports).\n  Which result in both `module.exports` and `exports.default` being set to same thing.\n\n  We don't use that babel plugin so we only have `exports.default`.\n\n  This cause problems in various 3rd party react components that rely on `module.exports` being set.\n  See https://github.com/gatsbyjs/gatsby/issues/23645 for example of it.\n  \n  Instead of adding same babel plugin we mimic output here. Adding babel plugin just for this would:\n   a) unnecesairly slow down compilation for all other files (if we just apply it everywhere)\n   b) or complicate babel-loader configuration with overwrite specifically for this file\n*/\n\nconst { createContext } = require(`react`)\n\nmodule.exports = createContext\nmodule.exports.default = createContext\n","function _extends() {\n  module.exports = _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;","import React from \"react\"\nimport PropTypes from \"prop-types\"\n\nimport InternalPageRenderer from \"./page-renderer\"\n\nconst ProdPageRenderer = ({ location, pageResources }) => {\n  if (!pageResources) {\n    return null\n  }\n  return React.createElement(InternalPageRenderer, {\n    location,\n    pageResources,\n    ...pageResources.json,\n  })\n}\n\nProdPageRenderer.propTypes = {\n  location: PropTypes.shape({\n    pathname: PropTypes.string.isRequired,\n  }).isRequired,\n}\n\nexport default ProdPageRenderer\n","const plugins = require(`./api-runner-browser-plugins`)\nconst {\n  getResourcesForPathname,\n  getResourcesForPathnameSync,\n  getResourceURLsForPathname,\n  loadPage,\n  loadPageSync,\n} = require(`./loader`).publicLoader\n\nexports.apiRunner = (api, args = {}, defaultReturn, argTransform) => {\n  // Hooks for gatsby-cypress's API handler\n  if (process.env.CYPRESS_SUPPORT) {\n    if (window.___apiHandler) {\n      window.___apiHandler(api)\n    } else if (window.___resolvedAPIs) {\n      window.___resolvedAPIs.push(api)\n    } else {\n      window.___resolvedAPIs = [api]\n    }\n  }\n\n  let results = plugins.map(plugin => {\n    if (!plugin.plugin[api]) {\n      return undefined\n    }\n\n    // Deprecated April 2019. Use `loadPageSync` instead\n    args.getResourcesForPathnameSync = getResourcesForPathnameSync\n    // Deprecated April 2019. Use `loadPage` instead\n    args.getResourcesForPathname = getResourcesForPathname\n    args.getResourceURLsForPathname = getResourceURLsForPathname\n    args.loadPage = loadPage\n    args.loadPageSync = loadPageSync\n\n    const result = plugin.plugin[api](args, plugin.options)\n    if (result && argTransform) {\n      args = argTransform({ args, result, plugin })\n    }\n    return result\n  })\n\n  // Filter out undefined results.\n  results = results.filter(result => typeof result !== `undefined`)\n\n  if (results.length > 0) {\n    return results\n  } else if (defaultReturn) {\n    return [defaultReturn]\n  } else {\n    return []\n  }\n}\n\nexports.apiRunnerAsync = (api, args, defaultReturn) =>\n  plugins.reduce(\n    (previous, next) =>\n      next.plugin[api]\n        ? previous.then(() => next.plugin[api](args, next.options))\n        : previous,\n    Promise.resolve()\n  )\n"],"sourceRoot":""}