{"version":3,"sources":["App.js","serviceWorker.js","index.js"],"names":["initSqlJS","require","initialViewState","longitude","latitude","zoom","pitch","bearing","App","props","placeToZoom","decodeURI","window","location","hash","slice","state","searchboxtext","viewState","onlyFar","only100kTitles","farsims","Set","allsims","locateFile","f","then","SQL","makeAutocomplete","this","loadPages","fetch","resp","arrayBuffer","b","autocompleteBuffer","concat","map","isFar","Array","from","length","v","i","url","column","sink","forEach","Table","table","array","getColumn","toArray","add","setState","simsloaded","pages","lng","lat","title","characterSet","db","Database","Uint8Array","count","dlat","sidelength","dlng","didx","Math","round","density","Float32Array","rankInDensity","sizes","max","pow","log1p","min","onHover","onClick","makeDensityHeatmap","TextLayer","id","data","pickable","backgroundColor","getText","d","index","get","getSize","sizeMaxPixels","sizeUnits","wrapLongitude","fontFamily","getPosition","target","ScatterplotLayer","radiusMinPixels","radiusMaxPixels","getRadius","object","getFillColor","getLineColor","layers","lhsSims","blockHover","pagepick","pageclick","pointLayer","sims","finishedZoomOnLoad","titleProp","titleLayer","activePageHighlight","loadSims","firstSuggestion","inputToLabelledIds","input","find","label","initialMove","zoomTo","pageIndex","value","anchor","onTransitionEnd","setTimeout","picked","newpageclick","isNew","makeTitles","makePoints","push","context","pagepickcoords","pagesims","values","c","filter","n","sort","a","viewport","pagesimlats","p","pagesimlngs","pagesimrgbs","project","sourceX","sourceY","pagesimangles","targetX","targetY","atan2","PI","shimFromCenter","join","simlines","LineLayer","getWidth","getSourcePosition","getTargetPosition","getColor","monochromesimtexts","getAngle","getTextAnchor","simIndicesByAngle","color","name","autocompleteIsDisabled","type","checked","onChange","e","confirm","htmlFor","disabled","options","filterOption","onInputChange","isDisabled","placeholder","key","href","preventDefault","style","display","controller","onViewStateChange","transitionDuration","transitionInterpolator","FlyToInterpolator","transitionEasing","t","smoothstep","React","Component","inputToRowids","statement","prepare","bind","inputToFTSQuery","step","getAsObject","rowid","s","toLocaleLowerCase","split","Boolean","hostname","match","ReactDOM","render","document","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"0hBAOMA,EAAYC,EAAQ,KAEpBC,EAAmB,CACvBC,WAAY,MACZC,SAAU,MACVC,KAAM,GACNC,MAAO,EACPC,QAAS,G,IAqBLC,E,YACJ,WAAYC,GAAQ,IAAD,sBACjB,4CAAMA,IACN,IAAMC,EAAcC,UAAUC,OAAOC,SAASC,KAAKC,MAAM,IAFxC,OAGjB,EAAKC,MAAQ,CAACN,cAAaO,cAAe,GAAIC,UAAWhB,EAAkBiB,SAAS,EAAMC,gBAAgB,EAAMC,QAAU,IAAIC,IAAQC,QAAU,IAAID,KACpJtB,EAAU,CAACwB,WAAY,SAAAC,GAAC,kBAASA,MAAMC,MAAK,SAAAC,GAC1C,EAAKX,MAAMW,IAAMA,EACjB,EAAKC,sBANU,E,iFASE,IAAD,OAClBC,KAAKC,YACLC,MAAM,qBAAqBL,MAAK,SAAAM,GAAI,OAAIA,EAAKC,cAAcP,MAAK,SAAAQ,GAC9D,EAAKlB,MAAMmB,mBAAqBD,EAChC,EAAKN,2B,iCAGG,IAAD,UACO,MAAGQ,OAAH,oBAAa,EAAC,GAAM,GAAOC,KAAI,SAAAC,GAAK,OAAIC,MAAMC,KAAK,CAACC,OAAQ,KAAK,SAACC,EAAEC,GAAH,MAC9E,CAACC,IAAI,SAAD,OAAWN,EAAQ,MAAO,GAA1B,oBAAwCK,EAAE,EAA1C,UACHE,OAAO,KAAD,OAAOF,EAAE,GACfG,KAAOR,EAAQ,EAAKtB,MAAMK,QAAU,EAAKL,MAAMO,iBAC3CwB,SAAQ,gBAAEH,EAAF,EAAEA,IAAKC,EAAP,EAAOA,OAAQC,EAAf,EAAeA,KAAf,OAAyBE,IAAMR,KAAKT,MAAMa,IAAMlB,MAAK,SAAAuB,GACnE,IAAMC,EAAQD,EAAME,UAAUN,GAAQO,UACtCN,EAAKO,IAAIH,GACT,EAAKI,SAAS,CAACC,WAAY,EAAKvC,MAAMK,QAAQoB,OAAS,EAAKzB,MAAMO,QAAQkB,iB,kCAGjE,IAAD,OACVO,IAAMR,KAAKT,MAAM,0BAA0BL,MAAK,SAAA8B,GAAK,OAAI,EAAKF,SAAS,CACrEE,QACAC,IAAKD,EAAML,UAAU,OAAOC,UAC5BM,IAAKF,EAAML,UAAU,OAAOC,UAC5BO,MAAOH,EAAML,UAAU,SACvBS,cAAgCJ,EAAML,UAAU,SAnD5C,CAAC,IAAI,IAAI,IAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,OAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,SAAI,kB,yCAuDj7CtB,KAAKb,MAAMW,KAAOE,KAAKb,MAAMmB,oBAC9BN,KAAKyB,SAAS,CAACO,GAAI,IAAIhC,KAAKb,MAAMW,IAAImC,SAAS,IAAIC,WAAWlC,KAAKb,MAAMmB,yB,4CAG1B,IAA/BsB,EAA8B,EAA9BA,IAAKC,EAAyB,EAAzBA,IAAKM,EAAoB,EAApBA,MACtBC,EAD0C,EAAbC,WAE7BC,EAAc,EAAPF,EACPG,EAAO,SAACjE,EAAUC,GAAX,OAAwBiE,KAAKC,OAAOH,EAAK,IAAIhE,EAAU,MAAM8D,EAAKI,KAAKC,OAAOL,EAAK,IAAI7D,EAAS,MACvGmE,EAAU,IAAIC,aAAaP,EAAOE,GAClCM,EAAgBD,aAAahC,KAAK,CAACC,OAAQuB,IAAQ,SAACtB,EAAEC,GAAH,QAAW4B,EAAQH,EAAKX,EAAId,GAAGe,EAAIf,QACtF+B,EAAQF,aAAahC,KAAK,CAACC,OAAQuB,IAAQ,SAACtB,EAAEC,GAAH,OAAS0B,KAAKM,IAAI,KAAM,SAAmBN,KAAKO,IAAIjC,EAAI,EAAG,KAAQ0B,KAAKQ,MAAMR,KAAKO,IAAIH,EAAc9B,GAAI,IAAM0B,KAAKO,IAAIP,KAAKS,IAAI,KAAKnC,EAAE,GAAG4B,EAAQH,EAAKX,EAAId,GAAGe,EAAIf,MAAM,UAC1N,MAAQ,CAAE4B,UAASE,gBAAeC,W,oCAEkC,IAA1DjB,EAAyD,EAAzDA,IAAKC,EAAoD,EAApDA,IAAKC,EAA+C,EAA/CA,MAAOK,EAAwC,EAAxCA,MAAOJ,EAAiC,EAAjCA,aAAcmB,EAAmB,EAAnBA,QAASC,EAAU,EAAVA,QAClDN,EAAS7C,KAAKoD,mBAAmB,CAACxB,MAAKC,MAAKM,QAAOE,WAAY,MAA/DQ,MACP,OAAQ,IAAIQ,IAAU,CACpBC,GAAG,SAAD,OAAWnB,GACboB,KAAM,CAAC3C,OAAQuB,GACfqB,UAAU,EACVN,UACAC,UACApB,eACA0B,gBAAiB,CAAC,IAAI,IAAI,KAC1BC,QAAS,SAACC,EAAD,OAAIC,EAAJ,EAAIA,MAAJ,kBAAoB9B,EAAM+B,IAAI1B,EAAQ,EAAIyB,GAA1C,OACTE,QAAS,SAACH,EAAD,OAAIC,EAAJ,EAAIA,MAAJ,OAAef,EAAMV,EAAQ,EAAIyB,IAC1CG,cAAe,GACfC,UAAW,SACXC,eAAe,EACfC,WAAY,gBACZC,YAAa,SAACR,EAAD,GAAwB,IAAnBC,EAAkB,EAAlBA,MAAMQ,EAAY,EAAZA,OAGtB,OAFAA,EAAO,GAAKxC,EAAIO,EAAQ,EAAIyB,GAC5BQ,EAAO,GAAKvC,EAAIM,EAAQ,EAAIyB,GACrBQ,O,oCAI6B,IAA9BxC,EAA6B,EAA7BA,IAAKC,EAAwB,EAAxBA,IAAKqB,EAAmB,EAAnBA,QAASC,EAAU,EAAVA,QAC7B,OAAQ,IAAIkB,IAAiB,CAC3Bf,GAAG,SAAD,OAAW1B,EAAIhB,QACjB2C,KAAM,CAAC3C,OAAQgB,EAAIhB,QACnB4C,UAAU,EACVN,UACAC,UACAmB,gBAAiB,EACjBC,gBAAiB,GACjBC,UAAW,GACXP,eAAe,EACfE,YAAa,SAACM,EAAD,GAAkC,IAAxBb,EAAuB,EAAvBA,MAAWQ,GAAY,EAAjBb,KAAiB,EAAZa,QAGhC,OAFAA,EAAO,GAAKxC,EAAIA,EAAIhB,OAAS,EAAIgD,GACjCQ,EAAO,GAAKvC,EAAID,EAAIhB,OAAS,EAAIgD,GAC1BQ,GAETM,aAAc,CAAC,IAAI,IAAI,IACvBC,aAAc,CAAC,EAAE,EAAE,O,+BAGb,IAAD,OACP,GAAiB,MAAd3E,KAAKb,MACN,OAAQ,kDAEV,IAAIyF,EAAS,GAAQC,EAAU,GAJxB,EAKuK7E,KAAKb,MAA3KwC,EALD,EAKCA,MAAOC,EALR,EAKQA,IAAKC,EALb,EAKaA,IAAKC,EALlB,EAKkBA,MAAOC,EALzB,EAKyBA,aAAc+C,EALvC,EAKuCA,WAAYC,EALnD,EAKmDA,SAAUC,EAL7D,EAK6DA,UAAWtF,EALxE,EAKwEA,QAASF,EALjF,EAKiFA,QAASF,EAL1F,EAK0FA,QAASC,EALnG,EAKmGA,eAAgB0F,EALnH,EAKmHA,WAAYjD,EAL/H,EAK+HA,GAAInD,EALnI,EAKmIA,YACpIqG,GANC,EAKgJC,mBAC1I7F,EAAUE,EAAUE,GAC3B0F,EAAY7F,EAAiB,kBAAoB,YACjD8F,EAAarF,KAAKb,MAAMiG,GACxBE,EAAsBR,EAAa,KAAOC,GAAYC,EAC5D,GAAY,MAATrD,EAAe,CAChB,GAAG0D,GAAcrD,GAAMH,GAAOD,GAAOE,GAAyB,OAAhBjD,EAAsB,CAClEmB,KAAKuF,WACL,IAAMC,EAAkBC,EAAmB,CAACzD,KAAIF,QAAO4D,MAAO7G,IAAc8G,MAAK,qBAAEC,QAAqB/G,KACxG,GAAI2G,EAEG,CACL,IAAMK,EAAc7F,KAAK8F,OAAO,CAACC,UAAWP,EAAgBQ,MAAOC,OAAQpH,IAC3EgH,EAAYxG,UAAU6G,gBAAkB,kBAAM,EAAKzE,SAAS,CAAC0D,oBAAoB,KACjFgB,YAAW,kBAAM,EAAK1E,SAAL,eAAkBoE,EAAlB,CAA+BhH,YAAa,UAAQ,QAJrEmB,KAAKyB,SAAS,CAAC5C,YAAa,KAAMsG,oBAAoB,IAa1D,GAAGtD,GAAOD,GAAOE,GAASmD,IAAeI,EAAY,CACnD,IAAMlD,EAAQ5C,EAAiB,IAAS,IAClC2D,EAAU,SAAC,GAAD,IAAEU,EAAF,EAAEA,MAAOwC,EAAT,EAASA,OAAT,OAAqB,EAAK3E,SAAS,CAACsD,SAAUqB,EAASjE,EAAQ,EAAIyB,EAAQ,EAAI,KAAMkB,YAAY,KAC3G3B,EAAU,SAAC,GAAqB,IAApBS,EAAmB,EAAnBA,MAAOwC,EAAY,EAAZA,OACjBC,EAAelE,EAAQ,EAAIyB,EAAQ,EACnC0C,EAAQF,GAAU,EAAKjH,MAAM6F,YAAcqB,EACjD,EAAK5E,SAAS,CAACuD,UAAWsB,EAAQD,EAAe,KAAMvB,YAAawB,IACpEvH,OAAOC,SAASC,KAAOqH,EAAQxE,EAAM+B,IAAI1B,EAAQ,EAAIyB,GAAS,IAEhEuC,YAAW,kBAAM,EAAK1E,SAAL,eAAgB2D,EAAY,EAAKmB,WAAW,CAAC3E,MAAKC,MAAKC,QAAOC,eAAcmB,UAASC,UAAShB,cAAU,GAE3H,IAAI8C,GAAcrD,EAAK,CAQrB5B,KAAKyB,SAAS,CAACwD,WAAYjF,KAAKwG,WAAW,CAAC5E,MAAKC,MAAKqB,QAPtC,SAAC,GAAD,IAAEU,EAAF,EAAEA,MAAOwC,EAAT,EAASA,OAAT,OAAqB,EAAK3E,SAAS,CAACsD,SAAUqB,EAASxE,EAAIhB,OAAS,EAAIgD,EAAQ,EAAI,KAAMkB,YAAY,KAOvD3B,QAN/C,SAAC,GAAqB,IAApBS,EAAmB,EAAnBA,MAAOwC,EAAY,EAAZA,OACjBC,EAAezE,EAAIhB,OAAS,EAAIgD,EAAQ,EACxC0C,EAAQF,GAAU,EAAKjH,MAAM6F,YAAcqB,EACjD,EAAK5E,SAAS,CAACuD,UAAWsB,EAAQD,EAAe,KAAMvB,YAAawB,IACpEvH,OAAOC,SAASC,KAAOqH,EAAQxE,EAAM+B,IAAIjC,EAAIhB,OAAS,EAAIgD,GAAS,QAKvE,GADAgB,EAAO6B,KAAKxB,GAAaL,EAAO6B,KAAKpB,GAChCC,GAAyBJ,GAAUD,GAAgBA,EAAWyB,QAAS,CAC1E,IAAMC,EAAiB,CAAC/E,EAAI0D,EAAsB,GAAIzD,EAAIyD,EAAsB,IAC1EsB,EAAWlG,MAAMC,KAAKuE,EAAK2B,UAAU,SAAAC,GAAC,OAAIA,EAAExB,MAAsByB,QAAO,SAAAC,GAAC,OAAIA,EAAI,KACxFJ,EAASK,MAAK,SAACC,EAAE7G,GAAH,OAAc,IAAJA,IAAgB,IAAJ6G,MAHsC,IAIzDC,EAAalC,EAAvByB,QAAUS,SACXC,EAAcR,EAASpG,KAAI,SAAA6G,GAAC,OAAIxF,GAAKwF,GAAK,GAAK,MAC/CC,EAAcV,EAASpG,KAAI,SAAA6G,GAAC,OAAIzF,GAAKyF,GAAK,GAAK,MAC/CE,EAAcX,EAASpG,KAAI,SAAA6G,GAAC,MAAI,CAAC7E,KAAKM,IAAI,EAAG,IAAM,GAAS,IAAJuE,IAAW7E,KAAKS,IAAI,GAAS,IAAJoE,GAAU,KAAM7E,KAAKS,IAAI,GAAS,IAAJoE,GAAS,SAPpD,EAQ/CF,EAASK,QAAQb,GAR8B,mBAQnEc,EARmE,KAQ1DC,EAR0D,KASpEC,EAAgBf,EAASpG,KAAI,SAAC6G,EAAEvG,GAAO,IAAD,EACfqG,EAASK,QAAQ,CAACF,EAAYxG,GAAIsG,EAAYtG,KAD/B,mBACnC8G,EADmC,KAC1BC,EAD0B,KAG1C,OAD6D,IAAnDrF,KAAKsF,MAAMJ,EAAUG,EAASD,EAAUH,GAAiBjF,KAAKuF,GAC5D,KAAO,OAEfC,EAAiBtH,MAAMC,KAAK,CAACC,OAAQ,KAAKqH,KAAK,KAC/CC,EAAW,IAAIC,IAAU,CAC7B7E,GAAG,cAAD,OAAgBgC,GAClB/B,KAAMqD,EACNwB,SAAU,GACVC,kBAAmB1B,EACnB2B,kBAAmB,SAAC3E,EAAD,OAAIC,EAAJ,EAAIA,MAAJ,MAAe,CAAC0D,EAAY1D,GAAQwD,EAAYxD,KACnE2E,SAAU,SAAC5E,EAAD,OAAIC,EAAJ,EAAIA,MAAJ,OAAe2D,EAAY3D,MAEvCgB,EAAO6B,KAAKyB,GACZ,IAAMM,EAAqB,IAAInF,IAAU,CACvCC,GAAG,cAAD,OAAgBgC,GAClB/B,KAAM,CAAC3C,OAAQgG,EAAShG,OAAS,GACjCmB,eACA0B,gBAAiB,CAAC,IAAI,IAAI,KAC1BS,WAAY,gBACZJ,QAAS,GACTK,YAAawC,EACb8B,SAAW,SAAC9E,EAAD,OAAIC,EAAJ,EAAIA,MAAJ,OAAeA,IAAUgD,EAAShG,OAAS,EAAI+G,EAAc/D,IACxE8E,cAAgB,SAAC/E,EAAD,YAAIC,QAAqBgD,EAAShG,OAAS,SAAW,SACtE2H,SAAW,SAAC5E,EAAD,OAAKC,EAAL,EAAKA,MAAL,OAAgBA,IAAUgD,EAAShG,OAAS,CAAC,EAAE,EAAE,GAAK2G,EAAY3D,IAC7EF,QAAU,SAACC,EAAD,OAAKC,EAAL,EAAKA,MAAL,OAAgBA,IAAUgD,EAAShG,OAAnB,cAAmCkB,EAAM+B,IAAIyB,EAAoB,GAAjE,kBAA+E0C,GAA/E,OAAgGlG,EAAM+B,KAAK+C,EAAShD,IAAU,GAAK,GAAnI,SAE5BgB,EAAO6B,KAAK+B,GACZ,IAAMG,EAAoBjI,MAAMC,KAAK,CAACC,OAAQgG,EAAShG,SAAS,SAACC,EAAEC,GAAH,OAASA,KACzE6H,EAAkB1B,MAAK,SAACC,EAAE7G,GAAH,OAASsH,EAAcT,GAAKS,EAActH,MACjEwE,EAAU8D,EAAkBnI,KAAI,SAAAM,GAC9B,IAAMiF,GAAaa,EAAS9F,IAAM,GAAG,EACrC,MAAQ,CAAC8H,MAAOrB,EAAYzG,GAAI+H,KAAM/G,EAAM+B,IAAIkC,GAAYA,iBAIlE,IAAM+C,IAA2B9G,GAAMF,GACvC,OACA,6BACE,yBAAKwB,GAAG,YAAR,yDACA,yBAAKA,GAAG,iBACN,6BACG1B,EAAG,UAAMA,EAAIhB,OAAV,aAA8B,mBACjCsE,EAAO,GAAK,yBACZG,EAAa,GAAK,yBAErB,6BAEG9F,EACC,6BACE,2BAAO+D,GAAG,SAASyF,KAAK,WAAWC,QAASzJ,EAAgB0J,SAAU,SAAAC,GAAC,OAAInK,OAAOoK,QAAQ,6FAA8F,EAAK1H,SAAS,CAAClC,gBAAgB,OACvN,2BAAO6J,QAAQ,UAAf,0BAHc,KAMpB,6BACE,2BAAO9F,GAAG,QAAQyF,KAAK,WAAWC,QAAS1J,EAAS2J,SAAU,SAAAC,GAAC,OAAI,EAAKzH,SAAS,CAACnC,QAAS4J,EAAE9E,OAAO4E,WAAWK,UAAWnE,IAC1H,2BAAOkE,QAAQ,SAAf,2BAAgDlE,EAAO,GAAK,YAA5D,MAEF,kBAAC,IAAD,CACEoE,QAAUR,EAAyB,GAAKrD,EAAmB,CAACzD,KAAIF,QAAO4D,MAAO1F,KAAKb,MAAMC,gBACzF4G,MAAQhG,KAAKb,MAAMC,cACnBmK,aAAc,kBAAM,GACpBC,cAAgB,SAACpK,GAAD,OAAmB,EAAKqC,SAAS,CAACrC,mBAClD6J,SAAW,gBAAErD,EAAF,EAAEA,MAAOI,EAAT,EAASA,MAAT,OAAoB,EAAKvE,SAAL,eAAkB,EAAKqE,OAAO,CAACC,UAAWC,EAAOC,OAAQL,IAAzD,CAAkExG,cAAewG,MAChH6D,WAAYX,EACZY,YAAaZ,EAAyB,uBAAyB,WAEjE,yBAAKxF,GAAG,cACJuB,EAAQjE,OAAS,EAAK,6BAAK,6BAAL,qBAAwBkB,EAAM+B,IAAIyB,EAAoB,GAAtD,KAAoE,KAE1FT,EAAQrE,KAAI,gBAAEoI,EAAF,EAAEA,MAAOC,EAAT,EAASA,KAAM9C,EAAf,EAAeA,UAAf,OACV,uBAAG4D,IAAG,cAASrE,EAAT,YAAgCS,GACpC6D,KAAK,IACLzG,QAAS,SAAC+F,GAAWA,GAAGA,EAAEW,iBAAkB,EAAKpI,SAAL,eAAkB,EAAKqE,OAAO,CAACC,YAAWE,OAAQ4C,OAC9FiB,MAAO,CAACC,QAAS,QAASnB,MAAO,QAASnF,gBAAgB,OAAD,OAASmF,EAAMX,KAAK,KAApB,OACvDY,QAMZ,6BACI,kBAAC,IAAD,CAAQxJ,UAAWW,KAAKb,MAAME,UAAW2K,YAAY,EAAMpF,OAAQA,EAAQtB,GAAI,aAAc2G,kBAAmB,gBAAE5K,EAAF,EAAEA,UAAF,OAAiB,EAAKoC,SAAS,CAACpC,qB,gCAK3H,IAArB0G,EAAoB,EAApBA,UAAWE,EAAS,EAATA,OAEjB,OADAlH,OAAOC,SAASC,KAAOgH,EACf,CACNjB,UAAWe,EAAY,EACvB1G,UAAU,eACLW,KAAKb,MAAME,UADP,CAEPf,UAAW0B,KAAKb,MAAMyC,IAAImE,GAC1BxH,SAAUyB,KAAKb,MAAM0C,IAAIkE,GACzBvH,KAAMwB,KAAKb,MAAMG,QAAU,EAAI,GAC/B4K,mBAAoB,OACpBC,uBAAwB,IAAIC,IAC5BC,iBAAkB,SAAAC,GAAC,OAAIC,EAAWA,EAAWD,Y,GA5PnCE,IAAMC,WAmQlBhF,EAAqB,SAAC,GAAD,IAAEzD,EAAF,EAAEA,GAAG0D,EAAL,EAAKA,MAAM5D,EAAX,EAAWA,MAAX,OAAsBpB,MAAMC,KAAK+J,EAAc,CAAC1I,KAAG0D,WAAS,SAAA5E,GAAC,MAAK,CAACkF,MAAOlF,EAAE,EAAG8E,MAAO9D,EAAM+B,IAAI/C,EAAE,QACvH4J,EAAa,UAAG,SAAhBA,EAAgB,8EAAY1I,EAAZ,EAAYA,GAAG0D,EAAf,EAAeA,OAC7BiF,EAAY3I,EAAG4I,QAHL,0EAINC,KAAK,CAACC,EAAgBpF,KAFZ,WAGbiF,EAAUI,OAHG,gBAIlB,OAJkB,SAIZJ,EAAUK,cAAcC,MAJZ,0DAAhBP,MAOAI,EAAkB,SAACI,GAAD,OAAOA,EAAEC,oBAAoBC,MAAM,2BAA2BrE,QAAO,SAAAC,GAAC,OAAIA,EAAEpG,OAAS,KAAGqH,KAAK,UAAY,KAC3HsC,EAAa,SAAAD,GAAC,OAAI,EAAIA,EAAIA,EAAI,EAAIA,EAAIA,EAAIA,GAEjC3L,ICrSK0M,QACW,cAA7BtM,OAAOC,SAASsM,UAEe,UAA7BvM,OAAOC,SAASsM,UAEhBvM,OAAOC,SAASsM,SAASC,MACvB,2DCZNC,IAASC,OAAO,kBAAC,EAAD,MAASC,SAASC,eAAe,SD6H3C,kBAAmBC,WACrBA,UAAUC,cAAcC,MAAMjM,MAAK,SAAAkM,GACjCA,EAAaC,kB","file":"static/js/main.2ed29514.chunk.js","sourcesContent":["import React from 'react';\nimport './App.css';\nimport DeckGL from '@deck.gl/react';\nimport { FlyToInterpolator } from '@deck.gl/core';\nimport { ScatterplotLayer, TextLayer, LineLayer } from '@deck.gl/layers';\nimport { Table } from 'apache-arrow';\nimport Select from 'react-select';\nconst initSqlJS = require('sql.js');\n\nconst initialViewState = {\n longitude: -73.99,\n latitude: 40.69,\n zoom: 10,\n pitch: 0,\n bearing: 0,\n}\n\nexport function utf8vectorToAtlas(strings) {\n return ([\" \",\"!\",\"\\\"\",\"$\",\"&\",\"'\",\"(\",\")\",\"*\",\"+\",\",\",\"-\",\".\",\"/\",\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\":\",\";\",\"=\",\"?\",\"@\",\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\",\"I\",\"J\",\"K\",\"L\",\"M\",\"N\",\"O\",\"P\",\"Q\",\"R\",\"S\",\"T\",\"U\",\"V\",\"W\",\"X\",\"Y\",\"Z\",\"`\",\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\",\"h\",\"i\",\"j\",\"k\",\"l\",\"m\",\"n\",\"o\",\"p\",\"q\",\"r\",\"s\",\"t\",\"u\",\"v\",\"w\",\"x\",\"y\",\"z\",\"~\",\"«\",\"°\",\"³\",\"´\",\"·\",\"º\",\"»\",\"½\",\"À\",\"Á\",\"Â\",\"Ä\",\"Å\",\"Æ\",\"Ç\",\"È\",\"É\",\"Ì\",\"Í\",\"Î\",\"Ð\",\"Ñ\",\"Ò\",\"Ó\",\"Ô\",\"Õ\",\"Ö\",\"×\",\"Ø\",\"Ú\",\"Ü\",\"Ý\",\"Þ\",\"ß\",\"à\",\"á\",\"â\",\"ã\",\"ä\",\"å\",\"æ\",\"ç\",\"è\",\"é\",\"ê\",\"ë\",\"ì\",\"í\",\"î\",\"ï\",\"ð\",\"ñ\",\"ò\",\"ó\",\"ô\",\"õ\",\"ö\",\"ø\",\"ù\",\"ú\",\"û\",\"ü\",\"ý\",\"þ\",\"ÿ\",\"Ā\",\"ā\",\"ă\",\"Ą\",\"ą\",\"Ć\",\"ć\",\"Ċ\",\"ċ\",\"Č\",\"č\",\"Ď\",\"ď\",\"Đ\",\"đ\",\"Ē\",\"ē\",\"ĕ\",\"ė\",\"ę\",\"ě\",\"Ğ\",\"ğ\",\"Ġ\",\"ġ\",\"Ģ\",\"ģ\",\"Ħ\",\"ħ\",\"ĩ\",\"Ī\",\"ī\",\"į\",\"İ\",\"ı\",\"Ķ\",\"ķ\",\"Ļ\",\"ļ\",\"Ľ\",\"ľ\",\"Ł\",\"ł\",\"ń\",\"Ņ\",\"ņ\",\"Ň\",\"ň\",\"ŋ\",\"Ō\",\"ō\",\"ŏ\",\"Ő\",\"ő\",\"Œ\",\"œ\",\"ŕ\",\"Ř\",\"ř\",\"Ś\",\"ś\",\"ŝ\",\"Ş\",\"ş\",\"Š\",\"š\",\"Ţ\",\"ţ\",\"Ť\",\"ť\",\"ũ\",\"Ū\",\"ū\",\"ŭ\",\"ů\",\"ű\",\"ų\",\"Ŵ\",\"ŵ\",\"ŷ\",\"Ź\",\"ź\",\"Ż\",\"ż\",\"Ž\",\"ž\",\"Ə\",\"ơ\",\"Ư\",\"ư\",\"ǁ\",\"ǂ\",\"ǃ\",\"ǫ\",\"Ǵ\",\"ǵ\",\"Ș\",\"ș\",\"Ț\",\"ț\",\"ə\",\"ʔ\",\"ʹ\",\"ʻ\",\"ʼ\",\"ʽ\",\"ʿ\",\"̀\",\"́\",\"̄\",\"̨\",\"̱\",\"Π\",\"ά\",\"έ\",\"α\",\"γ\",\"η\",\"ι\",\"λ\",\"ν\",\"ο\",\"ρ\",\"τ\",\"υ\",\"φ\",\"і\",\"ا\",\"ة\",\"ت\",\"ح\",\"ف\",\"ḍ\",\"ḏ\",\"ḥ\",\"ḩ\",\"Ḱ\",\"ḱ\",\"Ḵ\",\"ḵ\",\"Ḷ\",\"ḷ\",\"ḻ\",\"ṇ\",\"ṟ\",\"ṣ\",\"ṭ\",\"ṯ\",\"ẁ\",\"Ẕ\",\"ạ\",\"Ả\",\"ả\",\"Ấ\",\"ấ\",\"ầ\",\"ẩ\",\"ẫ\",\"ậ\",\"ắ\",\"ằ\",\"ẵ\",\"ặ\",\"Ẹ\",\"ẹ\",\"ẻ\",\"ẽ\",\"ế\",\"ề\",\"ể\",\"ễ\",\"ệ\",\"ỉ\",\"ị\",\"ọ\",\"ỏ\",\"ố\",\"ồ\",\"ổ\",\"ỗ\",\"ộ\",\"ớ\",\"ờ\",\"ở\",\"ợ\",\"ụ\",\"ủ\",\"Ứ\",\"ứ\",\"ừ\",\"ử\",\"ữ\",\"ự\",\"ỳ\",\"ỷ\",\"ỹ\",\"–\",\"—\",\"‘\",\"’\",\"“\",\"”\",\"†\",\"•\",\"′\",\"№\",\"−\",\"々\",\"の\",\"ガ\",\"ヒ\",\"モ\",\"ン\",\"人\",\"族\",\"ꞌ\"]);\n // cmon champ we don't have four whole seconds to run through over a million strings, this is only 2019, we are but simple people\n // if you do, feel free to comment out that return\n console.log(Date.now());\n const atlas = new Set();\n for(let i = 0 ; i < strings.length; i++ ) {\n const s = strings.get(i);\n for(let j = s.length; j-- > 0 ; ) {\n atlas.add(s[j]);\n }\n }\n const sortedAtlas = Array.from(atlas); sortedAtlas.sort();\n console.log(JSON.stringify(sortedAtlas));\n console.log(Date.now());\n return atlas;\n}\n\nclass App extends React.Component {\n constructor(props) {\n super(props)\n const placeToZoom = decodeURI(window.location.hash.slice(1));\n this.state = {placeToZoom, searchboxtext: \"\", viewState: initialViewState, onlyFar: true, only100kTitles: true, farsims: (new Set()), allsims: (new Set())};\n initSqlJS({locateFile: f => `./${f}`}).then(SQL => {\n this.state.SQL = SQL;\n this.makeAutocomplete();\n });\n }\n componentDidMount() {\n this.loadPages()\n fetch('./autocomplete.db').then(resp => resp.arrayBuffer().then(b => {\n this.state.autocompleteBuffer = b;\n this.makeAutocomplete()\n }));\n }\n loadSims() {\n const queries = [].concat(...[true, false].map(isFar => Array.from({length: 20}, (v,i) =>\n ({url: `./tops${isFar ? \"Far\": \"\"}Packed.ps${i+1}.arrow`,\n column: `ps${i+1}`,\n sink: (isFar ? this.state.farsims : this.state.allsims)}))));\n queries.forEach(({url, column, sink}) => Table.from(fetch(url)).then(table => {\n const array = table.getColumn(column).toArray();\n sink.add(array);\n this.setState({simsloaded: this.state.farsims.length + this.state.allsims.length});\n }));\n }\n loadPages() {\n Table.from(fetch(\"./pages.noindex.arrow\")).then(pages => this.setState({\n pages,\n lng: pages.getColumn('lng').toArray(),\n lat: pages.getColumn('lat').toArray(),\n title: pages.getColumn('title'),\n characterSet: utf8vectorToAtlas(pages.getColumn('title')),\n }));\n }\n makeAutocomplete() {\n if(this.state.SQL && this.state.autocompleteBuffer) {\n this.setState({db: new this.state.SQL.Database(new Uint8Array(this.state.autocompleteBuffer))});\n }\n }\n makeDensityHeatmap({lng, lat, count, sidelength}) {\n const dlat = sidelength;\n const dlng = dlat * 2;\n const didx = (longitude,latitude) => Math.round((dlng-1)/(longitude+180))*dlat+Math.round((dlat-1)/(latitude+90));\n const density = new Float32Array(dlat * dlng);\n const rankInDensity = Float32Array.from({length: count}, (v,i) => ++density[didx(lng[i],lat[i])] );\n const sizes = Float32Array.from({length: count}, (v,i) => Math.max(8.57, 1024 * 1024 * 32 / Math.pow(i + 4, 0.75) / Math.log1p(Math.pow(rankInDensity[i], 30) * Math.pow(Math.min(100*(i+1),density[didx(lng[i],lat[i])]),1.5))));\n return ({ density, rankInDensity, sizes });\n }\n makeTitles({lng, lat, title, count, characterSet, onHover, onClick}) {\n const {sizes} = this.makeDensityHeatmap({lng, lat, count, sidelength: 10000});\n return (new TextLayer({\n id: `titles${count}`,\n data: {length: count},\n pickable: true,\n onHover,\n onClick,\n characterSet,\n backgroundColor: [255,230,170],\n getText: (d,{index}) => ` ${title.get(count - 1 - index)} `,\n getSize: (d,{index}) => sizes[count - 1 - index],\n sizeMaxPixels: 30,\n sizeUnits: 'meters',\n wrapLongitude: true,\n fontFamily: '\"Roboto Slab\"',\n getPosition: (d, {index,target}) => {\n target[0] = lng[count - 1 - index];\n target[1] = lat[count - 1 - index];\n return target;\n },\n }));\n }\n makePoints({lng, lat, onHover, onClick}) {\n return (new ScatterplotLayer({\n id: `points${lng.length}`,\n data: {length: lng.length},\n pickable: true,\n onHover,\n onClick,\n radiusMinPixels: 2,\n radiusMaxPixels: 20,\n getRadius: 10,\n wrapLongitude: true,\n getPosition: (object, {index,data,target}) => {\n target[0] = lng[lng.length - 1 - index];\n target[1] = lat[lng.length - 1 - index];\n return target;\n },\n getFillColor: [100,100,50],\n getLineColor: [0,0,0],\n }));\n }\n render() {\n if(this.state == null) {\n return (

loading very soon!

);\n }\n let layers = []; let lhsSims = [];\n const { pages, lng, lat, title, characterSet, blockHover, pagepick, pageclick, allsims, farsims, onlyFar, only100kTitles, pointLayer, db, placeToZoom, finishedZoomOnLoad } = this.state;\n const sims = onlyFar ? farsims : allsims;\n const titleProp = only100kTitles ? \"first100kTitles\" : \"allTitles\";\n const titleLayer = this.state[titleProp];\n const activePageHighlight = blockHover ? null : pagepick || pageclick;\n if(pages != null) {\n if(titleLayer && db && lat && lng && title && placeToZoom !== null) {\n this.loadSims();\n const firstSuggestion = inputToLabelledIds({db, title, input: placeToZoom}).find(({label}) => label === placeToZoom);\n if(!firstSuggestion) {\n this.setState({placeToZoom: null, finishedZoomOnLoad: true});\n } else {\n const initialMove = this.zoomTo({pageIndex: firstSuggestion.value, anchor: placeToZoom});\n initialMove.viewState.onTransitionEnd = () => this.setState({finishedZoomOnLoad: true});\n setTimeout(() => this.setState({...initialMove, placeToZoom: null}), 0);\n }\n }\n // performance SIGNIFICANTLY increases for a million points and strings\n // when you reuse the same objects every render call\n // when reusing text and making new points, the perf drops from 10fps to 1fps\n // making new text takes about a minute so that is a nonstarter\n // TODO: optimize TextLayer to be able to render a million strings into GPU buffers for 20M multi-icons\n // between not rendering two passes of foreground and background for the multi-icon sprite sheet, and halving the precision on all of the float buffers (16-bit for most, 32-bit for positions over which text is going), and maybe saving some room at the bottom of the sprite sheet for a large blank background around all text as 1.2M sprites to rasterize at the beginning, it would be possible to build on the existing functionality, but, not today.\n if(lat && lng && title && pointLayer && !titleLayer) {\n const count = only100kTitles ? 100000 : 500000;\n const onHover = ({index, picked}) => this.setState({pagepick: picked ? count - 1 - index + 1 : null, blockHover: false});\n const onClick = ({index, picked}) => {\n const newpageclick = count - 1 - index + 1;\n const isNew = picked && this.state.pageclick !== newpageclick;\n this.setState({pageclick: isNew ? newpageclick : null, blockHover: !isNew});\n window.location.hash = isNew ? title.get(count - 1 - index) : \"\";\n };\n setTimeout(() => this.setState({[titleProp]: this.makeTitles({lng, lat, title, characterSet, onHover, onClick, count})}),0);\n }\n if(!pointLayer && lng) {\n const onHover = ({index, picked}) => this.setState({pagepick: picked ? lng.length - 1 - index + 1 : null, blockHover: false});\n const onClick = ({index, picked}) => {\n const newpageclick = lng.length - 1 - index + 1;\n const isNew = picked && this.state.pageclick !== newpageclick;\n this.setState({pageclick: isNew ? newpageclick : null, blockHover: !isNew });\n window.location.hash = isNew ? title.get(lng.length - 1 - index) : \"\";\n };\n this.setState({pointLayer: this.makePoints({lng, lat, onHover, onClick})});\n }\n layers.push(pointLayer); layers.push(titleLayer);\n if(!!activePageHighlight && !!sims && !!pointLayer && !!pointLayer.context) {\n const pagepickcoords = [lng[activePageHighlight - 1], lat[activePageHighlight - 1]];\n const pagesims = Array.from(sims.values(), c => c[activePageHighlight]).filter(n => n > 0);\n pagesims.sort((a,b) => (b & 255) - (a & 255));\n const {context: {viewport}} = pointLayer;\n const pagesimlats = pagesims.map(p => lat[(p >> 8) - 1]);\n const pagesimlngs = pagesims.map(p => lng[(p >> 8) - 1]);\n const pagesimrgbs = pagesims.map(p => [Math.max(0, 255 - 5 * (p & 255)), Math.min(2 * (p & 255), 255), Math.min(5 * (p & 255),255)]);\n const [sourceX, sourceY] = viewport.project(pagepickcoords);\n const pagesimangles = pagesims.map((p,i) => {\n const [targetX, targetY] = viewport.project([pagesimlngs[i], pagesimlats[i]]);\n const d = Math.atan2(sourceY - targetY, targetX - sourceX) * 180 / Math.PI;\n return (d + 360) % 360;\n });\n const shimFromCenter = Array.from({length: 50}).join(\" \");\n const simlines = new LineLayer({\n id: `line-layer-${activePageHighlight}`,\n data: pagesims,\n getWidth: 20,\n getSourcePosition: pagepickcoords,\n getTargetPosition: (d,{index}) => [pagesimlngs[index], pagesimlats[index]],\n getColor: (d,{index}) => pagesimrgbs[index],\n });\n layers.push(simlines);\n const monochromesimtexts = new TextLayer({\n id: `text-layer-${activePageHighlight}`,\n data: {length: pagesims.length + 1},\n characterSet,\n backgroundColor: [234,255,234],\n fontFamily: '\"Roboto Slab\"',\n getSize: 30,\n getPosition: pagepickcoords,\n getAngle: ((d,{index}) => index === pagesims.length ? 0 : pagesimangles[index]),\n getTextAnchor: ((d,{index}) => index === pagesims.length ? 'middle' : 'start'),\n getColor: ((d, {index}) => index === pagesims.length ? [0,0,0] : pagesimrgbs[index]),\n getText: ((d, {index}) => index === pagesims.length ? ` ${title.get(activePageHighlight-1)} ` : `${shimFromCenter}${title.get((pagesims[index] >> 8) - 1)} `),\n });\n layers.push(monochromesimtexts);\n const simIndicesByAngle = Array.from({length: pagesims.length}, (v,i) => i);\n simIndicesByAngle.sort((a,b) => pagesimangles[a] - pagesimangles[b]);\n lhsSims = simIndicesByAngle.map(i => {\n const pageIndex = (pagesims[i] >> 8)-1;\n return ({color: pagesimrgbs[i], name: title.get(pageIndex), pageIndex});\n });\n }\n }\n const autocompleteIsDisabled = !(db && title);\n return (\n
\n
© Lee Butterman 2020. Made in Oakland, California.
\n
\n
\n {lng ? `${lng.length} places. ` : \"Loading places. \"}\n {sims ? \"\" : \"Loading similarities. \"}\n {titleLayer ? \"\" : \"Adding place labels. \"}\n
\n
\n {\n !only100kTitles ? null : (\n
\n window.confirm(\"Preparing half a million titles to render takes a minute. Are you sure you want to wait?\") ? this.setState({only100kTitles: false}) : true } />\n \n
)\n }\n
\n this.setState({onlyFar: e.target.checked})} disabled={!sims} />\n \n
\n true}\n onInputChange={ (searchboxtext) => this.setState({searchboxtext}) }\n onChange={ ({label, value}) => this.setState({...this.zoomTo({pageIndex: value, anchor: label}), searchboxtext: label}) }\n isDisabled={autocompleteIsDisabled}\n placeholder={autocompleteIsDisabled ? 'Loading autocomplete' : 'Search'}\n />\n
\n { lhsSims.length > 0 ? (

↶ Similar to {title.get(activePageHighlight-1)}:
) : null}\n {\n lhsSims.map(({color, name, pageIndex}) => (\n { if(e) e.preventDefault(); this.setState({...this.zoomTo({pageIndex, anchor: name})})}}\n style={{display: \"block\", color: \"white\", backgroundColor: `rgb(${color.join(',')})`}}>\n { name }\n \n ))\n }\n
\n
\n
\n this.setState({viewState})} />\n
\n
);\n }\n\n zoomTo({pageIndex, anchor}) {\n window.location.hash = anchor;\n return ({\n pageclick: pageIndex + 1,\n viewState: {\n ...this.state.viewState,\n longitude: this.state.lng[pageIndex],\n latitude: this.state.lat[pageIndex],\n zoom: this.state.onlyFar ? 9 : 11,\n transitionDuration: 'auto',\n transitionInterpolator: new FlyToInterpolator(),\n transitionEasing: t => smoothstep(smoothstep(t)),\n }\n })\n }\n}\n\nconst sqlselect = \"select rowid from titles where titles match ? order by rowid limit 40\";\nconst inputToLabelledIds = ({db,input,title}) => Array.from(inputToRowids({db,input}), i => ({value: i-1, label: title.get(i-1)}));\nconst inputToRowids = function* ({db,input}) {\n const statement = db.prepare(sqlselect);\n statement.bind([inputToFTSQuery(input)]);\n while (statement.step()) {\n yield statement.getAsObject().rowid;\n }\n}\nconst inputToFTSQuery = (s) => s.toLocaleLowerCase().split(/[^a-z0-9\\u0080-\\uFFFF]+/).filter(n => n.length > 0).join(' NEAR ') + '*';\nconst smoothstep = t => 3 * t * t - 2 * t * t * t;\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' }\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}