{"version":3,"sources":["components/filehandling.js","components/urlhandling.js","components/shaders/lightfield_shader.js","components/shaders/quilt_shader.js","components/mirrors.js","components/models/Portrait.js","components/models/LKG_4k.js","components/models/LKG_8k.js","textures/cannon_1k.hdr","app.js","index.js"],"names":["QuiltToTexture","quilt","path","setQuilt","vid","undefined","console","log","type","JSON","stringify","includes","pause","THREE","load","invalidate","src","crossOrigin","loop","playsInline","play","video_texture","format","checkImage","url","setColumns","setRows","request","XMLHttpRequest","open","send","onload","status","regexClean","RegExp","regexTest","test","regexNums","exec","match","quilt_tex","repeat","set","QuiltfromURL","quilt_vertShader","quilt_fragShader","Mirror_Reflection","props","Reflector","resolution","args","width","height","mirror","mixStrength","mixBlur","rotation","Math","PI","Material","color","metalness","roughness","toneMapped","Glass_Reflection","opacity","transparent","Portrait","video","group","useRef","useGLTF","nodes","materials","quilt_material","flatShading","uniforms","isvid","value","quiltTexture","tilesX","columns","tilesY","rows","aspectScaler","aspect","quiltViewPortion","vertexShader","fragmentShader","useState","setPlay","next","setNext","previous","setPrevious","Display","Emmissive","emissiveIntensity","Mirrors","ref","dispose","reflections","position","scale","geometry","BasePlate","material","castShadow","receiveShadow","onPointerDown","e","onPointerUp","Mesh014","Mesh014_1","intensity","Mesh013","Mesh013_1","Mesh015","Mesh015_1","Buttons","buttons","display","Mesh010","Mesh010_1","LED","LED_Frame","Portrait_Body","preload","LookingGlass","fallback","frames","limit","xshift","yshift","Environment","files","HDRI","App","useCapture","duration","fps","bind","startRecording","setAspect","setXshift","setYshift","hologramURL","setHologramURL","SetReflections","mute","SetMute","document","createElement","setAttribute","muted","useEffect","queryString","window","location","search","urlParams","URLSearchParams","urlQuilt","get","className","mode","classname","dpr","camera","target","fov","gl","preserveDrawingBuffer","onCreated","shadows","shadowMap","shadowCameraNear","shadowCameraFar","OrbitControls","minPolarAngle","maxPolarAngle","enablePan","enableZoom","Stats","style","margin","maxwidth","paddingBottom","onClick","for","id","onChange","file","URL","revokeObjectURL","createObjectURL","name","LoadQuilt","item","valueAsNumber","history","replaceState","pathname","UpdateURL","href","render","querySelector"],"mappings":"0NAyCA,SAASA,EAAeC,EAAOC,EAAMC,EAAUC,GAC7C,QAAaC,GAATJ,EAAoB,CACtBK,QAAQC,IAAIN,GACZ,IAAMO,EAAOC,KAAKC,UAAUT,EAAMO,MAClC,GAAIA,EAAKG,SAAS,SAChBP,EAAIQ,QAEJT,GADY,IAAIU,iBAAsBC,KAAKZ,IAE3Ca,mBACI,GAAIP,EAAKG,SAAS,SAAU,CAChCP,EAAIY,IAAMd,EACVE,EAAIa,YAAc,YAClBb,EAAIc,MAAO,EACXd,EAAIe,aAAc,EAElBf,EAAIgB,OACJ,IAAMC,EAAgB,IAAIR,eAAmBT,GAC7CiB,EAAcC,OAAST,aACvBV,EAASkB,GACTN,oBAGFb,EAAO,oCACPC,GAAS,IAAIU,iBAAsBC,KAAKZ,IACxCa,cC/DG,SAASQ,EAAWC,EAAKrB,EAAUsB,EAAYC,EAAStB,GAC7D,IAAIuB,EAAU,IAAIC,eAClBD,EAAQE,KAAK,MAAOL,GAAK,GACzBG,EAAQG,OACRH,EAAQI,OAAS,WACO,KAAlBJ,EAAQK,aAAwB3B,GAAPmB,GAC3BlB,QAAQC,IAAI,6BAQlB,SAAsBiB,EAAKrB,EAAUsB,EAAYC,EAAStB,GACxD,QAAWC,GAAPmB,EAAkB,CAEpBlB,QAAQC,IAAIiB,EAAK,cACjB,IAAIS,EAAaC,OAAO,2BACpBC,EAAYF,EAAWG,KAAKZ,GAChClB,QAAQC,IAAI4B,GACZ,IACIE,GADcF,EAAYF,EAAWK,KAAKd,GAAOS,EAAWK,KAAK,iBACzC,GAAGC,MAAM,QACrCjC,QAAQC,IAAI8B,EAAU,GAAI,WAC1B/B,QAAQC,IAAI8B,EAAU,GAAI,QAC1BZ,EAAWY,EAAU,IACrBX,EAAQW,EAAU,IAStB,SAAwBb,EAAKrB,EAAUC,GACrC,QAAWC,GAAPmB,EAAkB,CACpBlB,QAAQC,IAAIiB,EAAK,oBACjB,IAAIgB,GAAY,IAAI3B,iBAAsBC,KAAKU,GAC/CrB,EAASqC,GACTA,EAAUC,OAAOC,IAAM,IAAI7B,UAAc,EAAG,IAb5Cb,CAAewB,EAAKrB,QAEpBG,QAAQC,IAAI,mFACZkB,EAAW,GACXC,EAAQ,GAxBNiB,CAAanB,EAAKrB,EAAUsB,EAAYC,IAExCpB,QAAQC,IAAI,+BCTX,I,2BCDIqC,EAAgB,ujBAgBhBC,EAAgB,47E,QCfpB,SAASC,EAAkBC,GAChC,OACE,cAACC,EAAA,EAAD,CAAWC,WAAY,IAAKC,KAAM,CAACH,EAAMI,MAAOJ,EAAMK,QAASC,OAAQ,EAAGC,YAAa,EAAGC,QAAS,EAAGC,SAAU,EAAEC,KAAKC,GAAK,EAAG,EAAGD,KAAKC,GAAK,GAA5I,SACG,SAACC,EAAUZ,GAAX,OAAqB,cAACY,EAAD,aAAUC,MAAM,UAAUC,UAAW,IAAKC,UAAW,EAAGC,YAAY,GAAWhB,OAKpG,SAASiB,EAAiBjB,GAC/B,OACE,cAACC,EAAA,EAAD,CAAWC,WAAY,IAAKC,KAAM,CAACH,EAAMI,MAAOJ,EAAMK,QAASC,OAAQ,GAAKC,YAAa,GAAKE,SAAU,EAAEC,KAAKC,GAAK,EAAG,EAAGD,KAAKC,GAAK,GAApI,SACG,SAACC,EAAUZ,GAAX,OACC,cAACY,EAAD,aACEC,MAAM,UACNC,UAAW,EACXC,UAAW,EACXG,QAAS,GACTC,aAAa,EACbH,YAAY,GACRhB,OCXC,SAASoB,EAAT,GAAiC,IAO1CC,EAPgCrB,EAAS,oBACvCsB,EAAQC,mBACd,EAA6BC,YAAQ,2BAA7BC,EAAR,EAAQA,MAAOC,EAAf,EAAeA,UAQbL,OADuB/D,GAArB0C,EAAM9C,MAAMmE,MAOhB,IAAIM,EAAiB,IAAI7D,iBAAqB,CAC5C8D,aAAa,EACbC,SAAU,CACRC,MAAO,CAAEC,MAAOV,GAChBW,aAAc,CAAED,MAAO/B,EAAM9C,OAC7B+E,OAAQ,CAAEF,MAAO/B,EAAMkC,SACvBC,OAAQ,CAAEJ,MAAO/B,EAAMoC,MACvBC,aAAc,CAACN,MAAO,IAAIjE,UAAc,EAAK,KAAK,KAAMkC,EAAMsC,SAC9DC,iBAAkB,CAAER,MAAO,IAAIjE,UAAc,KAAS,KAAQ,KAAS,QAEzE0E,aAAc3C,EACd4C,eAAgB3C,IAGlB,EAAwB4C,oBAAS,GAAjC,mBAAOrE,EAAP,KAAasE,EAAb,KACA,EAAwBD,oBAAS,GAAjC,mBAAOE,EAAP,KAAaC,EAAb,KACA,EAAgCH,oBAAS,GAAzC,mBAAOI,EAAP,KAAiBC,EAAjB,KASA,OANArB,EAAUsB,QAAUrB,EACpBD,EAAUuB,UAAUC,kBAAoB,EACxCxB,EAAU,oBAAoBX,UAAY,GAC1CW,EAAUyB,QAAQpC,UAAY,GAI5B,gDAAOqC,IAAK9B,GAAWtB,GAAvB,IAA8BqD,QAAS,KAAvC,UAEGrD,EAAMsD,aAAe,kCACpB,uBAAO7C,SAAU,CAAC,OAAQ,KAAU,GAAI8C,SAAU,CAAC,EAAG,IAAK,GAA3D,SACE,cAACtC,EAAD,CAAkBZ,OAAQ,EAAGD,MAAO,QAGtC,uBAAOK,SAAU,CAAC,QAAS,KAAU,GAAI8C,SAAU,CAAC,EAAG,MAAO,MAA9D,SACE,cAACxD,EAAD,CAAmBM,OAAQ,IAAMD,MAAO,QAG1C,uBAAOK,SAAU,CAAC,QAAS,KAAU,GAAI8C,SAAU,CAAC,EAAG,IAAM,MAA7D,SACE,cAACxD,EAAD,CAAmBM,OAAQ,IAAMD,MAAO,QAG1C,uBAAOK,SAAU,CAAC,QAAS,EAAG,QAAS8C,SAAU,CAAC,KAAM,IAAK,KAA7D,SACE,cAACxD,EAAD,CAAmBM,OAAQ,EAAGD,MAAO,QAGvC,uBAAOK,SAAU,CAAC,QAAS,GAAI,QAAS8C,SAAU,EAAE,KAAM,IAAK,KAA/D,SACE,cAACxD,EAAD,CAAmBM,OAAQ,EAAGD,MAAO,WAGzC,wBAAOoD,MAAO,EAAd,UACE,sBAAMC,SAAUhC,EAAMiC,UAAUD,SAAUE,SAAUlC,EAAMiC,UAAUC,SAAUJ,SAAU,CAAC,EAAG,IAAM,KAAM9C,SAAU,EAAEC,KAAKC,GAAI,EAAG,GAAIiD,YAAU,EAACC,eAAa,IAC5J,wBAAON,SAAU,CAAC,KAAM,GAAI,KAAO9C,SAAU,CAACC,KAAKC,GAAK,EAAG,GAAI,MAAOmD,cAAe,SAACC,GAAD,OAAOpB,GAAQ,IAAQqB,YAAa,SAACD,GAAD,OAAOpB,GAAQ,IAAxI,UACE,sBAAMc,SAAUhC,EAAMwC,QAAQR,SAAUE,SAAUlC,EAAMwC,QAAQN,SAAUC,YAAU,EAACC,eAAa,IAClG,sBAAMJ,SAAUhC,EAAMyC,UAAUT,SAAUE,SAAUlC,EAAMyC,UAAUP,SAAUC,YAAU,EAACC,eAAa,IACtG,+BAAezD,MAAO,IAAKC,OAAQ,GAAII,SAAU,CAAC,EAAEC,KAAKC,GAAG,EAAE,GAAI4C,SAAU,EAAE,GAAI,IAAK,GAAIY,UAAW9F,EAAO,EAAI,IAAKwC,MAAO,aAE/H,wBAAO0C,SAAU,CAAC,KAAM,KAAM,KAAO9C,SAAU,CAACC,KAAKC,GAAK,EAAG,GAAI,MAAOmD,cAAe,SAACC,GAAD,OAAOlB,GAAQ,IAAQmB,YAAa,SAACD,GAAD,OAAOlB,GAAQ,IAA1I,UACE,sBAAMY,SAAUhC,EAAM2C,QAAQX,SAAUE,SAAUlC,EAAM2C,QAAQT,SAAUC,YAAU,EAACC,eAAa,IAClG,sBAAMJ,SAAUhC,EAAM4C,UAAUZ,SAAUE,SAAUlC,EAAM4C,UAAUV,SAAUC,YAAU,EAACC,eAAa,IACtG,+BAAezD,MAAO,IAAKC,OAAQ,GAAII,SAAU,CAAC,EAAEC,KAAKC,GAAG,EAAE,GAAI4C,SAAU,EAAE,GAAI,IAAK,GAAIY,UAAWvB,EAAO,EAAI,IAAK/B,MAAO,aAE/H,wBAAO0C,SAAU,CAAC,KAAM,MAAO,KAAO9C,SAAU,CAACC,KAAKC,GAAK,EAAG,GAAI,MAAOmD,cAAe,SAACC,GAAD,OAAOhB,GAAY,IAAQiB,YAAa,SAACD,GAAD,OAAOhB,GAAY,IAAnJ,UACE,sBAAMU,SAAUhC,EAAM6C,QAAQb,SAAUE,SAAUlC,EAAM6C,QAAQX,SAAUC,YAAU,EAACC,eAAa,IAClG,sBAAMJ,SAAUhC,EAAM8C,UAAUd,SAAUE,SAAUlC,EAAM8C,UAAUZ,SAAUC,YAAU,EAACC,eAAa,IACtG,+BAAezD,MAAO,IAAKC,OAAQ,GAAII,SAAU,CAAC,EAAEC,KAAKC,GAAG,EAAE,GAAI4C,SAAU,EAAE,GAAI,IAAK,GAAIY,UAAWrB,EAAW,EAAI,IAAKjC,MAAO,aAEnI,sBAAM4C,SAAUhC,EAAM+C,QAAQf,SAAUE,SAAUjC,EAAU+C,QAASlB,SAAU,CAAC,KAAM,MAAO,KAAO9C,SAAU,CAACC,KAAKC,GAAK,EAAG,GAAI,MAAOiD,YAAU,EAACC,eAAa,IAC/J,sBAAMJ,SAAUhC,EAAMiD,QAAQjB,SAAUE,SAAUjC,EAAUsB,QAASO,SAAU,EAAE,IAAM,KAAM,IAAM9C,SAAU,CAACC,KAAKC,GAAK,EAAG,EAAG,KAC9H,wBAAO4C,SAAU,CAAC,KAAM,MAAO,KAAO9C,SAAU,CAACC,KAAKC,GAAK,EAAG,GAAI,MAAlE,UACE,sBAAM8C,SAAUhC,EAAMkD,QAAQlB,SAAUE,SAAUlC,EAAMkD,QAAQhB,SAAUC,YAAU,EAACC,eAAa,IAClG,sBAAMJ,SAAUhC,EAAMmD,UAAUnB,SAAUE,SAAUjC,EAAUyB,aAEhE,sBAAMM,SAAUhC,EAAMoD,IAAIpB,SAAUE,SAAUjC,EAAUmD,IAAKtB,SAAU,CAAC,KAAM,MAAO,KAAO9C,SAAU,CAACC,KAAKC,GAAK,EAAG,GAAI,MAAOiD,YAAU,EAACC,eAAa,IACvJ,sBAAMJ,SAAUhC,EAAMqD,UAAUrB,SAAUE,SAAUjC,EAAUuB,UAAWM,SAAU,EAAE,IAAM,MAAO,KAAO9C,SAAU,CAACC,KAAKC,GAAK,EAAG,EAAG,GAAIiD,YAAU,EAACC,eAAa,IAChK,sBAAMJ,SAAUhC,EAAMnB,OAAOmD,SAAUE,SAAUjC,EAAUyB,QAASI,SAAU,EAAE,IAAM,KAAM,IAAM9C,SAAU,CAACC,KAAKC,GAAK,EAAG,EAAG,GAAIiD,YAAU,EAACC,eAAa,IACzJ,sBAAMJ,SAAUhC,EAAMsD,cAActB,SAAUE,SAAUjC,EAAU,oBAAqB6B,SAAU,EAAE,IAAM,KAAM,IAAM9C,SAAU,CAACC,KAAKC,GAAK,EAAG,EAAG,GAAIiD,YAAU,EAACC,eAAa,WCyDpLrC,IAAQwD,QAAQ,eCHhBxD,IAAQwD,QAAQ,eFhDhBxD,IAAQwD,QAAQ,2B,YG3GD,MAA0B,sCCQ1B,SAASC,EAAT,GAAmC,IAATjF,EAAQ,oBAEjD,OACA,gCAEI,eAAC,WAAD,CAAUkF,SAAU,aAApB,UAEI,cAAC9D,EAAD,CAAU+D,OAAQnF,EAAMmF,OAAQC,MAAOpF,EAAMoF,MAAO7B,SAAU,CAAC,EAAE,EAAE,GAAIrG,MAAO8C,EAAM9C,MAAOgF,QAASlC,EAAMkC,QAASE,KAAMpC,EAAMoC,KAAME,OAAQtC,EAAMsC,OAAQ+C,OAAQrF,EAAMqF,OAAQC,OAAQtF,EAAMsF,OAAQhC,YAAatD,EAAMsD,cAI1N,cAACiC,EAAA,EAAD,CAAaC,MAAOC,SCR5B,SAASC,IACP,MAA+BC,YAAW,CAAEC,SAAU,GAAIC,IAAK,KAA/D,mBAAOC,EAAP,KAAaC,EAAb,KACA,EAA0BrD,oBAAS,IAAI5E,iBAAsBC,KAAK,sCAAlE,mBAAOb,EAAP,KAAcE,EAAd,KACA,EAA8BsF,mBAAS,GAAvC,mBAAOR,EAAP,KAAgBxD,EAAhB,KACA,EAAwBgE,mBAAS,GAAjC,mBAAON,EAAP,KAAazD,EAAb,KACA,EAA4B+D,mBAAS,KAArC,mBAAOJ,EAAP,KAAe0D,EAAf,KACA,EAA4BtD,mBAAS,IAArC,mBAAO2C,EAAP,KAAeY,EAAf,KACA,EAA4BvD,mBAAS,IAArC,mBAAO4C,EAAP,KAAeY,EAAf,KACA,EAAsCxD,mBAAS,IAA/C,mBAAOyD,EAAP,KAAoBC,EAApB,KACA,EAAgC1D,mBAAS,IAAzC,mBACA,GADA,UAC0BA,mBAAS,KAAnC,mBACA,GADA,UAC4CA,sBAA5C,mBACA,GADA,UACwCA,sBAAxC,mBACA,GADA,UAC0BA,sBAA1B,mBACA,GADA,UACqCA,oBAAS,IAA9C,oBAAOY,GAAP,MAAoB+C,GAApB,MACA,GAAwB3D,oBAAS,GAAjC,qBAAO4D,GAAP,MAAaC,GAAb,MAGFhJ,QAAQC,IAAK,qBAEX,IAAMH,GAAMmJ,SAASC,cAAc,SAkCnC,OAjCApJ,GAAIqJ,aAAyB,2BAC7BrJ,GAAIsJ,MAAQL,IACA,IAAIxI,iBAAsBC,KAAK,qCACjCQ,OAAST,aAGnB8I,qBAAU,WACR,IAAMC,EAAcC,OAAOC,SAASC,OAC9BC,EAAY,IAAIC,gBAAgBL,GAChCM,EAAWF,EAAUG,IAAI,cACD9J,GAA1B2J,EAAUG,IAAI,WAChB5I,EAAW2I,EAAS/J,EAAUsB,EAAYC,GAC1CyH,EAAee,SAGY7J,GAAzB2J,EAAUG,IAAI,SAChBzI,EAAQsI,EAAUG,IAAI,cAEQ9J,GAA5B2J,EAAUG,IAAI,YAChB1I,EAAWuI,EAAUG,IAAI,cAE1B,IAaD,qCACA,qBAAKC,UAAU,SAAf,SAAwB,mBAAGA,UAAU,iBAAb,yFACtB,eAAC,IAAD,CACAC,KAAK,aACLC,UAAW,SACXC,IAAK,CAAC,EAAG,GACTC,OAAQ,CAAElE,SAAU,CAAC,EAAG,EAAG,IAAKmE,OAAQ,CAAC,EAAG,EAAG,GAAIC,IAAK,IACxDC,GAAI,CAAEC,uBAAuB,GAC7BC,UAAWhC,EACXiC,SAAS,EACTC,WAAS,EART,UAUE,cAAC/C,EAAD,CAAcE,OAAQ,EAAGC,MAAO,GAAIlI,MAAOA,EAAOgF,QAASA,EAASE,KAAMA,EAAME,OAAQA,EAAQwD,KAAMA,EAAMxC,YAAaA,KAEzH,uBAAM7C,SAAU,EAAEC,KAAKC,GAAG,EAAE,EAAE,GAAIiD,YAAU,EAACC,eAAa,EAA1D,UACE,+BAAe1D,KAAM,CAAC,IAAK,IAAK,OAChC,sCAAsBU,MAAO,QAASE,UAAW,OAGnD,kCAAkBwC,SAAU,CAAC,GAAI,IAAK,GAAIY,UAAW,EAAGP,YAAY,EAAMqE,iBAAkB,EAAGC,gBAAiB,MAChH,iCAAiBrH,MAAO,QAASsD,UAAW,IAE5C,cAACgE,EAAA,EAAD,CAAeT,OAAQ,CAAC,EAAG,EAAG,GAAIU,cAAiB1H,KAAKC,GAAG,EAAG0H,cAAiB3H,KAAKC,GAAG,EAAG2H,WAAW,EAAOC,YAAY,OAE1H,cAACC,EAAA,EAAD,IACA,sBAAKC,MAAO,CAAE5H,MAAO,QAAS6H,OAAQ,OAAQC,SAAU,QAASC,cAAe,QAAhF,UACA,wBAAQvB,UAAW,eAAgBwB,QAAS9C,EAA5C,0CAGA,uBAAO+C,IAAI,OAAX,yBACA,uBAAOrL,KAAK,OAAOsL,GAAG,OAAOC,SAAU,SAACjF,GAAD,aV5FtC,SAAmBkF,EAAM7L,EAAUsB,EAAYC,EAAStB,EAAIuK,GACjEsB,IAAIC,gBAAgBF,GACpB7L,EAAS6L,GACT,IAAI9L,EAAO,GACX,QAAYG,GAAR2L,EAAmB,CAErB9L,EAAO+L,IAAIE,gBAAgBH,GAC3B,IAAM/J,EAAaC,OAAO,2BAC1B,GAAID,EAAWG,KAAK4J,EAAKI,MAAO,CAC9B,IACM/J,EADcJ,EAAWK,KAAK0J,EAAKI,MACX,GAAG7J,MAAM,QACvCjC,QAAQC,IAAI8B,EAAU,GAAI,WAC1B/B,QAAQC,IAAI8B,EAAU,GAAI,QAC1BZ,EAAWY,EAAU,IACrBX,EAAQW,EAAU,IAClB/B,QAAQC,IAAI,6CACZP,EAAegM,EAAM9L,EAAMC,EAAUC,QAGtCE,QAAQC,IAAI,+CACZP,EAAegM,EAAM9L,EAAKC,EAAUC,QAGrCE,QAAQC,IAAI,qFACZkB,EAAW,GACXC,EAAQ,GUmEwC2K,CAAS,UAACvF,EAAE2D,OAAOlC,aAAV,aAAC,EAAgB+D,KAAK,GAAInM,EAAUsB,EAAYC,EAAStB,OAChH,uBAAOyL,IAAI,UAAX,qBACA,uBAAOrL,KAAK,SAASsL,GAAG,UAAUhH,MAAOG,EAAS8G,SAAU,SAACjF,GAAD,OAAOrF,EAAWqF,EAAE2D,OAAO8B,kBACvF,yCACA,uBAAO/L,KAAK,SAASsL,GAAG,OAAOhH,MAAOK,EAAM4G,SAAU,SAACjF,GAAD,OAAOpF,EAAQoF,EAAE2D,OAAO8B,kBAC9E,uBAAOV,IAAI,SAAX,0BACA,uBAAOrL,KAAK,SAASsL,GAAG,SAAShH,MAAOO,EAAQ0G,SAAU,SAACjF,GAAD,OAAOiC,EAAUjC,EAAE2D,OAAO8B,kBACpF,uBAAOV,IAAI,SAAX,qBACA,uBAAOrL,KAAK,SAASsL,GAAG,SAAShH,MAAOsD,EAAQ2D,SAAU,SAACjF,GAAD,OAAOkC,EAAUlC,EAAE2D,OAAO8B,kBACpF,uBAAOV,IAAI,SAAX,qBACA,uBAAOrL,KAAK,SAASsL,GAAG,SAAShH,MAAOuD,EAAQ0D,SAAU,SAACjF,GAAD,OAAOmC,EAAUnC,EAAE2D,OAAO8B,kBACpF,uBAAOV,IAAI,MAAX,iCACA,uBAAOrL,KAAK,OAAOsL,GAAG,MAAMhH,MAAOoE,EAAa6C,SAAU,SAACjF,GAAD,OAAOqC,EAAerC,EAAE2D,OAAO3F,UACzF,wBAAQ8G,QAAS,SAAC9E,GAAD,OArDvB,WACE,IAAM8C,EAAcC,OAAOC,SAASC,OAC9BC,EAAY,IAAIC,gBAAgBL,GACtCI,EAAUtH,IAAI,UAAWuC,GACzB+E,EAAUtH,IAAI,OAAQyC,GACtB6E,EAAUtH,IAAI,QAASwG,GACvBW,OAAO2C,QAAQC,aAAa,GAAI,GAAhC,UAAuC3C,SAAS4C,SAAhD,YAA4D1C,IA+ChC2C,IAAxB,mCACA,wBAAQf,QAAS,SAAC9E,GAAD,OAAOsC,IAAgB/C,KAAxC,gCACA,wBAAQuF,QAAS,SAAC9E,GAAD,OAAO1G,GAAIgB,QAA5B,wBACA,wBAAQwK,QAAS,SAAC9E,GAAD,OAAOwC,IAASD,KAAjC,0BAeA,gDACe,uBACb,oBAAImC,MAAO,CAAE5H,MAAO,SAApB,sOAGA,qBAAI4H,MAAO,CAAE5H,MAAO,SAApB,8JACoJ,OAEpJ,qBAAI4H,MAAO,CAAE5H,MAAO,SAApB,8EACoE,IAClE,mBAAGgJ,KAAK,qEAAR,kBAFF,gBAURC,iBAAO,cAACpE,EAAD,IAASc,SAASuD,cAAc,Y","file":"static/js/main.288d83ad.chunk.js","sourcesContent":["// this file handles file input and name parsing. Currently file types like quilts, lightfields, and rgb-d are handled separately while prototyping.\nimport * as THREE from 'three'\nimport { invalidate, useThree } from '@react-three/fiber'\n\nexport function LoadQuilt(file, setQuilt, setColumns, setRows, vid,gl) {\n URL.revokeObjectURL(file) //revoke URL for current element\n setQuilt(file)\n var path = \"\"\n if (file != undefined) {\n // get columns from file name\n path = URL.createObjectURL(file)\n const regexClean = RegExp(/qs[0-9]{1,2}x[0-9]{1,2}/)\n if (regexClean.test(file.name)) {\n const resultClean = regexClean.exec(file.name)\n const regexNums = resultClean[0].match(/\\d+/g)\n console.log(regexNums[0], 'columns')\n console.log(regexNums[1], 'rows')\n setColumns(regexNums[0])\n setRows(regexNums[1])\n console.log(\"your quilt is properly named!🎉\")\n QuiltToTexture(file, path, setQuilt, vid,gl)\n }\n else {\n console.log(\"your quilt is named improperly.😭\")\n QuiltToTexture(file, path,setQuilt, vid,gl) // load the file even though the name is wrong\n }\n } else {\n console.log('quilt is undefined or lacks proper name, setting parameters to 8 columns & 6 rows')\n setColumns(8)\n setRows(6)\n }\n}\n\n// Convert Quilt into image or video texture depending on file input type. \n\n// Scratch Pad: \n// This function needs to have a file input. \n// it then parses the file extension to determine if it's an image or video, and sets the appropriate function.\n// it needs to return the path to the texture or the texture itself, which is not currently handled in application state. \n// should it just return the entire shader? If this occurs then it also needs to be setup on application start to load the default quilt. \n\nfunction QuiltToTexture(quilt, path, setQuilt, vid) {\n if (quilt != undefined) {\n console.log(quilt)\n const type = JSON.stringify(quilt.type)\n if (type.includes('image')) {\n vid.pause()\n const tex = new THREE.TextureLoader().load(path)\n setQuilt(tex)\n invalidate()\n }else if (type.includes('video')) {\n vid.src = path\n vid.crossOrigin = 'Anonymous'\n vid.loop = true\n vid.playsInline = true\n // vid.autoplay = true\n vid.play()\n const video_texture = new THREE.VideoTexture(vid)\n video_texture.format = THREE.RGBAFormat\n setQuilt(video_texture)\n invalidate()\n }\n } else {\n path = '/j_smf_lightfield_qs5x9a0.75.webp'\n setQuilt(new THREE.TextureLoader().load(path))\n invalidate()\n }\n}\n\n// WIP lightfield file parsing from mp4, it's a bit slow currently, can be sped up. Needs cleanup.\n\nconst camsX = 44\nconst camsY = 1\nconst resX = 3008\nconst resY = 1688\nvar fieldTexture\n\nexport function LoadLightfieldVideo(file, SetLightfieldFile, SetFieldTexture) {\n ExtractVideo(file, SetFieldTexture)\n}\n\nexport async function ExtractVideo(file, SetFieldTexture) {\n // based on https://stackoverflow.com/questions/32699721/javascript-extract-video-frames-reliably\n const video = document.createElement('video')\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d')\n var path = ''\n canvas.width = resX\n canvas.height = resY\n canvas.setAttribute('id', 'videosrc')\n path = URL.createObjectURL(file)\n video.src = path\n let seekResolve\n let count = 0\n let offset = 0\n const allBuffer = new Uint8Array(resX * resY * 4 * camsX * camsY)\n\n console.log('starting extraction')\n\n const getBufferFromVideo = () => {\n ctx.drawImage(video, 0, 0, resX, resY)\n const imgData = ctx.getImageData(0, 0, resX, resY)\n allBuffer.set(imgData.data, offset)\n offset += imgData.data.byteLength\n count++\n }\n\n const fetchFrames = async () => {\n let currentTime = 0\n\n while (count < camsX * camsY) {\n getBufferFromVideo()\n currentTime += 0.0333\n video.currentTime = currentTime\n await new Promise((res) => (seekResolve = res))\n }\n\n var fieldTexture2 = new THREE.DataTexture2DArray(allBuffer, resX, resY, camsX * camsY)\n console.log('Loaded field data')\n SetFieldTexture(fieldTexture2)\n }\n\n video.addEventListener('seeked', async function () {\n if (seekResolve) seekResolve()\n })\n\n video.addEventListener('loadeddata', async () => {\n await fetchFrames()\n console.log('loaded data')\n })\n}\n","import * as THREE from 'three'\n\nexport function checkImage(url, setQuilt, setColumns, setRows, vid) {\n var request = new XMLHttpRequest()\n request.open('GET', url, true)\n request.send()\n request.onload = function () {\n if (request.status == 200 && url != undefined) {\n console.log('image exists 💃')\n QuiltfromURL(url, setQuilt, setColumns, setRows, vid)\n } else {\n console.log(\"image doesn't exist in URL\")\n }\n }\n}\n\nfunction QuiltfromURL(url, setQuilt, setColumns, setRows, vid) {\n if (url != undefined) {\n // get columns from file name\n console.log(url, 'quilt name')\n var regexClean = RegExp(/qs[0-9]{1,2}x[0-9]{1,2}/)\n let regexTest = regexClean.test(url)\n console.log(regexTest)\n let resultClean = regexTest ? regexClean.exec(url) : regexClean.exec('banana_qs8x6') //if regex is valid use url params, if not default to 8x6\n var regexNums = resultClean[0].match(/\\d+/g)\n console.log(regexNums[0], 'columns')\n console.log(regexNums[1], 'rows')\n setColumns(regexNums[0])\n setRows(regexNums[1])\n QuiltToTexture(url, setQuilt, vid)\n } else {\n console.log('url is undefined or lacks proper name, setting parameters to 8 columns & 6 rows')\n setColumns(8)\n setRows(6)\n }\n}\n\nfunction QuiltToTexture(url, setQuilt, vid) {\n if (url != undefined) {\n console.log(url, 'quilt is defined')\n var quilt_tex = new THREE.TextureLoader().load(url)\n setQuilt(quilt_tex)\n quilt_tex.repeat.set = new THREE.Vector2(0, 0)\n } else {\n // path = '/j_smf_lightfield_qs5x9a0.75.webp'\n // quilt_tex = new THREE.TextureLoader().load(path)\n // quilt_tex.repeat.set = new THREE.Vector2(0,0)\n }\n}\n","// Borrowed from: https://github.com/hypothete/lightfield-webgl2\n\nexport var lightfield_fragShader = `\nprecision highp float;\nprecision highp int;\nprecision highp sampler2DArray;\n\nuniform sampler2DArray field;\nuniform vec2 camArraySize;\nuniform float aperture;\nuniform float focus;\n\nin vec2 vSt;\nin vec2 vUv;\n\nvoid main() {\n vec4 color = vec4(0.0);\n float colorCount = 0.0; // proportional exposure\n\n // if (vUv.x < 0.0 || vUv.x > 1.0 || vUv.y < 0.0 || vUv.y > 1.0) {\n // discard;\n // }\n\n for (float i = 0.0; i < camArraySize.x; i++) {\n for (float j = 0.0; j < camArraySize.y; j++) {\n float dx = i - (vSt.x * camArraySize.x - 0.5);\n float dy = j - (vSt.y * camArraySize.y - 0.5);\n float sqDist = dx * dx + dy * dy;\n if (sqDist < aperture) {\n float camOff = i + camArraySize.x * j;\n vec2 focOff = vec2(dx, dy) * focus;\n color += texture(field, vec3(vUv + focOff, camOff));\n colorCount++;\n }\n }\n }\n\n gl_FragColor = vec4(color.rgb / colorCount, 1.0);\n}`\n\nexport var lightfield_vertShader = `\nout vec2 vSt;\nout vec2 vUv;\n\nvoid main() {\n // note that position is referring to each vertex's clip space\n vec3 posToCam = cameraPosition - position;\n vec3 nDir = normalize(posToCam);\n // given similar triangles we can project the focusing plane point\n float zRatio = posToCam.z / nDir.z;\n vec3 uvPoint = zRatio * nDir;\n // offset the uv into 0-1.0 coords\n vUv = uvPoint.xy + 0.5;\n vUv.x = 1.0 - vUv.x; // why is this necessary?\n vSt = uv;\n vSt.x = 1.0 - vSt.x;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}\n`\n","// shader\nexport var quilt_vertShader = `\n varying vec2 vUv; \n varying vec3 vNormal;\n varying vec4 vPos; \n void main() {\n vUv = uv;\n // vUv.y = 1.0 - vUv.y; // why???\n // normal info\n // https://discourse.threejs.org/t/basic-custom-shader-camera/10065\n // not correct, we want to get the normalRay relative to the device.\n vNormal = (modelViewMatrix * vec4(normal, 0.025)).xyz;\n vNormal = normalize(vec3(vNormal.x, 0, vNormal.z));\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n vPos = gl_Position;\n }`\n\nexport var quilt_fragShader = `\n uniform sampler2D quiltTexture;\n uniform float tilesX;\n uniform float tilesY;\n uniform vec2 aspectScaler;\n uniform vec2 quiltViewPortion;\n uniform bool isvid;\n varying vec2 vUv;\n varying vec3 vNormal;\n varying vec4 vPos; \n vec2 texArr(vec3 uvz) {\n // float z = floor(uvz.z * tilesX * tilesY);\n float z = uvz.z;\n float x = (mod(z, tilesX) + uvz.x) / tilesX;\n float y = (floor(z / tilesX) + uvz.y) / tilesY;\n return vec2(x, y) * quiltViewPortion;\n }\n float remap(float value, float from1, float to1, float from2, float to2) {\n return (value - from1) / (to1 - from1) * (to2 - from2) + from2;\n }\n void main() {\n vec3 nuv = vec3(vUv.xy, 0.0);\n nuv.xy *= aspectScaler; // aspect ratio adjustment\n \n //discard pixels outside vUV\n if (nuv.x < 0.0 || nuv.x > 1.0 || nuv.y < 0.0 || nuv.y > 1.0) {\n discard;\n }\n nuv.z = -vNormal.x * 1.6; // now -1 to 1 is like the viewcone\n float fade = nuv.z; // how far off center it is determines fade\n nuv.z = nuv.z * .5 + .5; // 0-1\n nuv.z = clamp(nuv.z, 0.0, 1.0);\n // nuv.z = mod(nuv.z + 4.0, 1.0); // ok really between 0-1 now\n // gl_FragColor = vec4(nuv.z, g, 0.0, 1.0);\n \n // get some samples\n float tiles = tilesX * tilesY;\n nuv.z *= tiles;\n nuv.x += (vPos.x/tilesX)* 0.0000001;\n vec3 uv_1 = nuv;\n uv_1.z = floor(uv_1.z);\n uv_1.z = clamp(uv_1.z, 0.0, tiles - 1.0);\n vec3 uv_2 = nuv;\n uv_2.z = ceil(uv_2.z);\n uv_2.z = clamp(uv_2.z, 0.0, tiles - 1.0);\n float lerp = clamp(mod(nuv.z + 2.0, 1.0), 0.0, 1.0);\n vec4 col1 = texture2D(quiltTexture, texArr(uv_1)); \n vec4 col2 = texture2D(quiltTexture, texArr(uv_2)); \n col1 = mix(col1, col2, lerp);\n vec4 privacy = vec4(0.0,0.0,0.0,1.0);\n if (abs(fade) > 1.0) {\n vec3 edgeUv = nuv;\n edgeUv.z = tiles - 1.0;\n if (fade > 0.0) {\n edgeUv.z = 0.0;\n }\n vec4 col3 = texture2D(quiltTexture, texArr(edgeUv)); \n float fadeLerp = clamp((abs(fade) - 1.0) * 2.3, 0.0, 1.0);\n vec4 privacylerp = mix(col3, privacy, 0.95);\n col1 = mix(col1, privacylerp, abs(fadeLerp));\n }\n if (isvid) {\n gl_FragColor = col1;\n }\n else {\n gl_FragColor = linearToOutputTexel( col1 );\n } \n }`","import { Reflector } from '@react-three/drei'\n\nexport function Mirror_Reflection(props) {\n return (\n \n {(Material, props) => }\n \n )\n}\n\nexport function Glass_Reflection(props) {\n return (\n \n {(Material, props) => (\n \n )}\n \n )\n}\n","/*\nAuto-generated by: https://github.com/pmndrs/gltfjsx\n*/\nimport * as THREE from 'three'\nimport React, { useRef, useState } from 'react'\nimport { useThree } from '@react-three/fiber'\nimport { useGLTF } from '@react-three/drei'\nimport { Glass_Reflection, Mirror_Reflection } from '../mirrors'\nimport { quilt_vertShader, quilt_fragShader } from '../shaders/quilt_shader'\n \nexport default function Portrait({ ...props }) {\n const group = useRef()\n const { nodes, materials } = useGLTF('/Portrait_1007_2021.glb')\n\n\n //check to see if quilt is video to resolve color space issues in three.js 137 hacky workaround for now\n\n var video;\n\n if (props.quilt.video != undefined) {\n video = true\n }\n else {\n video = false\n }\n\n var quilt_material = new THREE.ShaderMaterial({\n flatShading: true,\n uniforms: {\n isvid: { value: video}, // hack to switch color space issue with three.js 137\n quiltTexture: { value: props.quilt },\n tilesX: { value: props.columns },\n tilesY: { value: props.rows },\n aspectScaler: {value: new THREE.Vector2(1, ((2048/1536)*props.aspect))},\n quiltViewPortion: { value: new THREE.Vector2(4095.0 / 4096.0, 4095.0 / 4096.0) },\n },\n vertexShader: quilt_vertShader,\n fragmentShader: quilt_fragShader\n })\n\n const [play, setPlay] = useState(true)\n const [next, setNext] = useState(true)\n const [previous, setPrevious] = useState(true)\n\n // assign shader to display\n materials.Display = quilt_material\n materials.Emmissive.emissiveIntensity = 3\n materials['02 - Default.001'].roughness = .3\n materials.Mirrors.roughness = .3\n // nodes.Mesh010.material.color = new THREE.Color(\"rgb(5, 5, 5)\")\n\n return (\n \n {/* Mirrors & Reflection Planes */}\n {props.reflections && \n \n \n \n {/* Top Mirror */}\n \n \n \n {/* Bottom Mirror */}\n \n \n \n {/* Right Side Mirror */}\n \n \n \n {/* Left Side Mirror */}\n \n \n \n }\n \n \n setPlay(false)} onPointerUp={(e) => setPlay(true)}>\n \n \n \n \n setNext(false)} onPointerUp={(e) => setNext(true)}>\n \n \n \n \n setPrevious(false)} onPointerUp={(e) => setPrevious(true)}>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nuseGLTF.preload('/Portrait_1007_2021.glb')\n","/*\nAuto-generated by: https://github.com/pmndrs/gltfjsx\n*/\n\nimport React, { useRef } from 'react'\nimport { useGLTF } from '@react-three/drei'\nimport * as THREE from 'three'\nimport { quilt_vertShader, quilt_fragShader } from '../shaders/quilt_shader'\nimport { Glass_Reflection, Mirror_Reflection } from '../mirrors'\n\nexport default function LKG_4k({...props}) {\n const group = useRef()\n const { nodes, materials } = useGLTF('/LKG_4K.glb')\n\n props.aspect \n \n\n var test_material = new THREE.ShaderMaterial({\n uniforms: {\n quiltTexture: { value: props.quilt },\n tilesX: { value: props.columns },\n tilesY: { value: props.rows },\n aspectScaler: {value: new THREE.Vector2(((3840/2160)/props.aspect), 1)},\n quiltViewPortion: { value: new THREE.Vector2(4095.0 / 4096.0, 4095.0 / 4096.0) }\n },\n vertexShader: quilt_vertShader,\n fragmentShader: quilt_fragShader\n })\n\n\n // assign shader to display and adjust glass transparency/color\n materials.Display = test_material\n\n return (\n \n \n \n \n {/* Top Mirror */}\n \n \n \n {/* Bottom Mirror */}\n \n \n \n {/* Right Side Mirror */}\n \n \n \n {/* Left Side Mirror */}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nuseGLTF.preload('/LKG_4K.glb')\n","/*\nAuto-generated by: https://github.com/pmndrs/gltfjsx\n*/\n\nimport React, { useRef } from 'react'\nimport { useGLTF } from '@react-three/drei'\nimport * as THREE from 'three'\nimport { quilt_vertShader, quilt_fragShader} from '../shaders/quilt_shader'\nimport { Glass_Reflection, Mirror_Reflection } from '../mirrors'\n\nexport default function LKG_8k({...props}) {\n const group = useRef()\n const { nodes, materials } = useGLTF('/LKG_8K.glb')\n\n var test_material = new THREE.ShaderMaterial({\n uniforms: {\n quiltTexture: { value: props.quilt },\n tilesX: { value: props.columns },\n tilesY: { value: props.rows },\n aspectScaler: {value: new THREE.Vector2(((3840/2160)/props.aspect), 1)},\n quiltViewPortion: { value: new THREE.Vector2(4095.0 / 4096.0, 4095.0 / 4096.0) }\n },\n vertexShader: quilt_vertShader,\n fragmentShader: quilt_fragShader\n })\n\n // assign shader to display and adjust glass transparency/color\n materials['Material.003'] = test_material\n\n return (\n \n \n \n \n {/* Top Mirror */}\n \n \n \n {/* Bottom Mirror */}\n \n \n \n {/* Right Side Mirror */}\n \n \n \n {/* Left Side Mirror */}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n )\n}\n\nuseGLTF.preload('/LKG_8K.glb')\n","export default __webpack_public_path__ + \"static/media/cannon_1k.e563838c.hdr\";","import { LightfieldPlane } from './components/lightfield.js'\nimport LKG_4k from './components/models/LKG_4k.js'\nimport LKG_8k from './components/models/LKG_8k.js'\nimport { Suspense } from 'react';\nimport Portrait from './components/models/Portrait.js'\nimport { Environment } from '@react-three/drei';\nimport HDRI from './textures/cannon_1k.hdr'\n\nexport default function LookingGlass({...props}) {\n\nreturn (\n\n {/* The suspense component is needed since the quilt takes some time to load, we should look at optimizing this or loading the portrait and *then* loading the quilt */}\n \n {/* the below component is the Portrait 3D model, it has props of position, path, rows and columns */}\n \n {/* */}\n {/* */}\n {/* */}\n \n \n\n)}","import { render } from 'react-dom'\nimport React, { Suspense, useState, useEffect } from 'react'\nimport useCapture from 'use-capture'\nimport { Canvas } from '@react-three/fiber'\nimport { OrbitControls } from '@react-three/drei'\nimport * as THREE from 'three'\nimport { Stats } from '@react-three/drei'\nimport { LoadQuilt, ExtractVideo, LoadLightfieldVideo } from './components/filehandling.js'\nimport { checkImage } from './components/urlhandling.js'\nimport LookingGlass from './app'\n\nfunction App() {\n const [bind, startRecording] = useCapture({ duration: 10, fps: 24 })\n const [quilt, setQuilt] = useState(new THREE.TextureLoader().load('/j_smf_lightfield_qs5x9a0.75.webp'))\n const [columns, setColumns] = useState(5)\n const [rows, setRows] = useState(9)\n const [aspect, setAspect] = useState(0.75)\n const [xshift, setXshift] = useState(0.5)\n const [yshift, setYshift] = useState(0.5)\n const [hologramURL, setHologramURL] = useState('')\n const [aperture, SetAperture] = useState(0.5)\n const [focus, SetFocus] = useState(0.6)\n const [lightfieldFile, SetLightfieldFile] = useState()\n const [fieldTexture, SetFieldTexture] = useState()\n const [webgl, SetWebgl] = useState()\n const [reflections, SetReflections]= useState(true)\n const [mute, SetMute] = useState(true)\n\n// default quilt params\nconsole.log( \"portrait rendered\")\n var quilt_tex\n const vid = document.createElement('video')\n vid.setAttribute = (\"class\", \"media-document mac video\")\n vid.muted = mute\n quilt_tex = new THREE.TextureLoader().load('/j_smf_lightfield_qs5x9a0.75.webp')\n quilt_tex.format = THREE.RGBAFormat\n\n// attempt to load quilt from url TODO: make more robust, it will curently load any url even if no file is present.\n useEffect(() => {\n const queryString = window.location.search\n const urlParams = new URLSearchParams(queryString)\n const urlQuilt = urlParams.get('quilt')\n if (urlParams.get('quilt') != undefined) {\n checkImage(urlQuilt,setQuilt, setColumns, setRows)\n setHologramURL(urlQuilt)\n }\n // modify this later so these only get called if the regex in checkImage fails.\n if (urlParams.get('rows') != undefined) {\n setRows(urlParams.get('rows'))\n } \n if (urlParams.get('columns') != undefined) {\n setColumns(urlParams.get('columns'))\n }\n }, [])\n\n// Update URL params for sharing\nfunction UpdateURL() {\n const queryString = window.location.search\n const urlParams = new URLSearchParams(queryString)\n urlParams.set('columns', columns)\n urlParams.set('rows', rows)\n urlParams.set('quilt', hologramURL)\n window.history.replaceState({}, '', `${location.pathname}?${urlParams}`)\n}\n\n return (\n <>\n

🧪Experimental: This project is still under active development!

\n \n \n {/* General scene setup with ambient lighting */}\n \n \n \n \n {/* additional light */}\n \n \n {/* Orbit Controls can be added if we want users to have control over the model,we probably don't want this for the gen2 website, but this may be cool for hologram.supply */}\n \n \n \n
\n \n \n LoadQuilt(e.target.files?.item(0), setQuilt, setColumns, setRows, vid, webgl)} />\n \n setColumns(e.target.valueAsNumber)} />\n \n setRows(e.target.valueAsNumber)} />\n \n setAspect(e.target.valueAsNumber)} />\n \n setXshift(e.target.valueAsNumber)} />\n \n setYshift(e.target.valueAsNumber)} />\n \n setHologramURL(e.target.value)} />\n \n \n \n \n {/*
\n
The Tools below are for experimental Lightfield Import, the file needs to be an mp4 with sequential frames. It is still a major WIP. \n LoadLightfieldVideo(e.target.files?.item(0), SetLightfieldFile, SetFieldTexture)}/>\n \n
\n
\n \n SetAperture(e.target.valueAsNumber)} />\n
\n
\n \n SetFocus(e.target.valueAsNumber)}/>\n
\n
*/}\n
\n instructions
\n
    \n Both Images and Videos can be used! Some Quilt videos will have playback issues or stutters due to browser limitations with high resolution video playback. Video resolutions higher than 4096x4096 are not recommended.\n
\n
    \n Loading a Quilt that does not have the proper file syntax will not be parsed. This can be manually updated with the Columns and Rows input boxes.{' '}\n
\n
    \n Please submit feedback, bugs or feature requests to the following{' '}\n form.\n
\n
\n
\n \n )\n}\n\nrender(, document.querySelector('#root'))\n"],"sourceRoot":""}