diff options
Diffstat (limited to 'apps/web')
104 files changed, 7222 insertions, 6999 deletions
diff --git a/apps/web/components.json b/apps/web/components.json index 0e8b6332..405a08cd 100644 --- a/apps/web/components.json +++ b/apps/web/components.json @@ -18,4 +18,4 @@ "hooks": "@/hooks" }, "iconLibrary": "lucide" -}
\ No newline at end of file +} diff --git a/apps/web/drizzle.config.ts b/apps/web/drizzle.config.ts index 6b7a1605..a0602a74 100644 --- a/apps/web/drizzle.config.ts +++ b/apps/web/drizzle.config.ts @@ -1,19 +1,19 @@ -import type { Config } from "drizzle-kit";
-import * as dotenv from "dotenv";
-
-// Load the right env file based on environment
-if (process.env.NODE_ENV === "production") {
- dotenv.config({ path: ".env.production" });
-} else {
- dotenv.config({ path: ".env.local" });
-}
-
-export default {
- schema: "../../packages/db/src/schema.ts",
- dialect: "postgresql",
- dbCredentials: {
- url: process.env.DATABASE_URL!,
- },
- out: "./migrations",
- strict: process.env.NODE_ENV === "production",
-} satisfies Config;
+import type { Config } from "drizzle-kit"; +import * as dotenv from "dotenv"; + +// Load the right env file based on environment +if (process.env.NODE_ENV === "production") { + dotenv.config({ path: ".env.production" }); +} else { + dotenv.config({ path: ".env.local" }); +} + +export default { + schema: "../../packages/db/src/schema.ts", + dialect: "postgresql", + dbCredentials: { + url: process.env.DATABASE_URL!, + }, + out: "./migrations", + strict: process.env.NODE_ENV === "production", +} satisfies Config; diff --git a/apps/web/migrations/meta/0000_snapshot.json b/apps/web/migrations/meta/0000_snapshot.json index 7ea2b944..2da63d5c 100644 --- a/apps/web/migrations/meta/0000_snapshot.json +++ b/apps/web/migrations/meta/0000_snapshot.json @@ -93,12 +93,8 @@ "name": "accounts_user_id_users_id_fk", "tableFrom": "accounts", "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -168,12 +164,8 @@ "name": "sessions_user_id_users_id_fk", "tableFrom": "sessions", "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -183,9 +175,7 @@ "sessions_token_unique": { "name": "sessions_token_unique", "nullsNotDistinct": false, - "columns": [ - "token" - ] + "columns": ["token"] } }, "policies": {}, @@ -246,9 +236,7 @@ "users_email_unique": { "name": "users_email_unique", "nullsNotDistinct": false, - "columns": [ - "email" - ] + "columns": ["email"] } }, "policies": {}, @@ -316,4 +304,4 @@ "schemas": {}, "tables": {} } -}
\ No newline at end of file +} diff --git a/apps/web/migrations/meta/0001_snapshot.json b/apps/web/migrations/meta/0001_snapshot.json index 78c3cffb..008540ad 100644 --- a/apps/web/migrations/meta/0001_snapshot.json +++ b/apps/web/migrations/meta/0001_snapshot.json @@ -93,12 +93,8 @@ "name": "accounts_user_id_users_id_fk", "tableFrom": "accounts", "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -168,12 +164,8 @@ "name": "sessions_user_id_users_id_fk", "tableFrom": "sessions", "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -183,9 +175,7 @@ "sessions_token_unique": { "name": "sessions_token_unique", "nullsNotDistinct": false, - "columns": [ - "token" - ] + "columns": ["token"] } }, "policies": {}, @@ -246,9 +236,7 @@ "users_email_unique": { "name": "users_email_unique", "nullsNotDistinct": false, - "columns": [ - "email" - ] + "columns": ["email"] } }, "policies": {}, @@ -334,9 +322,7 @@ "waitlist_email_unique": { "name": "waitlist_email_unique", "nullsNotDistinct": false, - "columns": [ - "email" - ] + "columns": ["email"] } }, "policies": {}, @@ -355,4 +341,4 @@ "schemas": {}, "tables": {} } -}
\ No newline at end of file +} diff --git a/apps/web/migrations/meta/0002_snapshot.json b/apps/web/migrations/meta/0002_snapshot.json index 9155d971..42512564 100644 --- a/apps/web/migrations/meta/0002_snapshot.json +++ b/apps/web/migrations/meta/0002_snapshot.json @@ -93,12 +93,8 @@ "name": "accounts_user_id_users_id_fk", "tableFrom": "accounts", "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -168,12 +164,8 @@ "name": "sessions_user_id_users_id_fk", "tableFrom": "sessions", "tableTo": "users", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], + "columnsFrom": ["user_id"], + "columnsTo": ["id"], "onDelete": "cascade", "onUpdate": "no action" } @@ -183,9 +175,7 @@ "sessions_token_unique": { "name": "sessions_token_unique", "nullsNotDistinct": false, - "columns": [ - "token" - ] + "columns": ["token"] } }, "policies": {}, @@ -247,9 +237,7 @@ "users_email_unique": { "name": "users_email_unique", "nullsNotDistinct": false, - "columns": [ - "email" - ] + "columns": ["email"] } }, "policies": {}, @@ -335,9 +323,7 @@ "waitlist_email_unique": { "name": "waitlist_email_unique", "nullsNotDistinct": false, - "columns": [ - "email" - ] + "columns": ["email"] } }, "policies": {}, @@ -356,4 +342,4 @@ "schemas": {}, "tables": {} } -}
\ No newline at end of file +} diff --git a/apps/web/migrations/meta/_journal.json b/apps/web/migrations/meta/_journal.json index 309c040e..58b995c8 100644 --- a/apps/web/migrations/meta/_journal.json +++ b/apps/web/migrations/meta/_journal.json @@ -24,4 +24,4 @@ "breakpoints": true } ] -}
\ No newline at end of file +} diff --git a/apps/web/package.json b/apps/web/package.json index c409136c..f5cd7da4 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -38,11 +38,12 @@ "dotenv": "^16.5.0", "drizzle-orm": "^0.44.2", "embla-carousel-react": "^8.5.1", + "feed": "^5.1.0", "framer-motion": "^11.13.1", "input-otp": "^1.4.1", "lucide-react": "^0.468.0", "motion": "^12.18.1", - "next": "^15.4.1", + "next": "^15.4.3", "next-themes": "^0.4.4", "pg": "^8.16.2", "radix-ui": "^1.4.2", diff --git a/apps/web/public/ffmpeg/ffmpeg-core.js b/apps/web/public/ffmpeg/ffmpeg-core.js index 83363183..405d1dbc 100644 --- a/apps/web/public/ffmpeg/ffmpeg-core.js +++ b/apps/web/public/ffmpeg/ffmpeg-core.js @@ -1,21 +1,18 @@ - var createFFmpegCore = (() => { - var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; - - return ( -function(createFFmpegCore = {}) { - -var Module=typeof createFFmpegCore!="undefined"?createFFmpegCore:{}; // Ensure that createFFmpegCore is defined and available.var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});const NULL=0;const SIZE_I32=Uint32Array.BYTES_PER_ELEMENT;const DEFAULT_ARGS=["./ffmpeg","-nostdin","-y"];const DEFAULT_ARGS_FFPROBE=["./ffprobe"];Module["NULL"]=NULL;Module["SIZE_I32"]=SIZE_I32;Module["DEFAULT_ARGS"]=DEFAULT_ARGS;Module["DEFAULT_ARGS_FFPROBE"]=DEFAULT_ARGS_FFPROBE;Module["ret"]=-1;Module["timeout"]=-1;Module["logger"]=()=>{};Module["progress"]=()=>{};function stringToPtr(str){const len=Module["lengthBytesUTF8"](str)+1;const ptr=Module["_malloc"](len);Module["stringToUTF8"](str,ptr,len);return ptr}function stringsToPtr(strs){const len=strs.length;const ptr=Module["_malloc"](len*SIZE_I32);for(let i=0;i<len;i++){Module["setValue"](ptr+SIZE_I32*i,stringToPtr(strs[i]),"i32")}return ptr}function print(message){Module["logger"]({type:"stdout",message:message})}function printErr(message){if(!message.startsWith("Aborted(native code called abort())"))Module["logger"]({type:"stderr",message:message})}function exec(..._args){const args=[...Module["DEFAULT_ARGS"],..._args];try{Module["_ffmpeg"](args.length,stringsToPtr(args))}catch(e){if(!e.message.startsWith("Aborted")){throw e}}return Module["ret"]}function ffprobe(..._args){const args=[...Module["DEFAULT_ARGS_FFPROBE"],..._args];try{Module["_ffprobe"](args.length,stringsToPtr(args))}catch(e){if(!e.message.startsWith("Aborted")){throw e}}return Module["ret"]}function setLogger(logger){Module["logger"]=logger}function setTimeout(timeout){Module["timeout"]=timeout}function setProgress(handler){Module["progress"]=handler}function receiveProgress(progress,time){Module["progress"]({progress:progress,time:time})}function reset(){Module["ret"]=-1;Module["timeout"]=-1}function _locateFile(path,prefix){const mainScriptUrlOrBlob=Module["mainScriptUrlOrBlob"];if(mainScriptUrlOrBlob){const{wasmURL:wasmURL,workerURL:workerURL}=JSON.parse(atob(mainScriptUrlOrBlob.slice(mainScriptUrlOrBlob.lastIndexOf("#")+1)));if(path.endsWith(".wasm"))return wasmURL;if(path.endsWith(".worker.js"))return workerURL}return prefix+path}Module["stringToPtr"]=stringToPtr;Module["stringsToPtr"]=stringsToPtr;Module["print"]=print;Module["printErr"]=printErr;Module["locateFile"]=_locateFile;Module["exec"]=exec;Module["ffprobe"]=ffprobe;Module["setLogger"]=setLogger;Module["setTimeout"]=setTimeout;Module["setProgress"]=setProgress;Module["reset"]=reset;Module["receiveProgress"]=receiveProgress;var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=true;var ENVIRONMENT_IS_NODE=false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b);Module["HEAP64"]=HEAP64=new BigInt64Array(b);Module["HEAPU64"]=HEAPU64=new BigUint64Array(b)}var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();SOCKFS.root=FS.mount(SOCKFS,{},null);callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile="ffmpeg-core.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{if(!response["ok"]){throw"failed to load wasm binary file at '"+binaryFile+"'"}return response["arrayBuffer"]()}).catch(()=>getBinary(binaryFile))}}return Promise.resolve().then(()=>getBinary(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>{return WebAssembly.instantiate(binary,imports)}).then(instance=>{return instance}).then(receiver,reason=>{err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}else{return instantiateArrayBuffer(binaryFile,imports,callback)}}function createWasm(){var info={"a":wasmImports};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["ra"];updateMemoryViews();wasmTable=Module["asm"]["ua"];addOnInit(Module["asm"]["sa"]);removeRunDependency("wasm-instantiate");return exports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err("Module.instantiateWasm callback failed with error: "+e);readyPromiseReject(e)}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var ASM_CONSTS={6077464:$0=>{Module.ret=$0}};function send_progress(progress,time){Module.receiveProgress(progress,time)}function is_timeout(diff){if(Module.timeout===-1)return 0;else{return Module.timeout<=diff}}function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP64[ptr>>3];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`)}}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":HEAP64[ptr>>3]=BigInt(value);break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function ___assert_fail(condition,filename,line,func){abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw exceptionLast}var dlopenMissingError="To use dlopen, you need enable dynamic linking, see https://emscripten.org/docs/compiling/Dynamic-Linking.html";function ___dlsym(handle,symbol){abort(dlopenMissingError)}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function initRandomFill(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else abort("initRandomDevice")}function randomFill(view){return(randomFill=initRandomFill())(view)}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")}};function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.fsync(stream.tty)},fsync:function(stream){stream.tty.ops.fsync(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=stream.tty.ops.get_char(stream.tty)}catch(e){throw new FS.ErrnoError(29)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(6)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead},write:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.put_char){throw new FS.ErrnoError(60)}try{for(var i=0;i<length;i++){stream.tty.ops.put_char(stream.tty,buffer[offset+i])}}catch(e){throw new FS.ErrnoError(29)}if(length){stream.node.timestamp=Date.now()}return i}},default_tty_ops:{get_char:function(tty){if(!tty.input.length){var result=null;if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function zeroMemory(address,size){HEAPU8.fill(0,address,address+size);return address}function alignMemory(size,alignment){return Math.ceil(size/alignment)*alignment}function mmapAlloc(size){size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(!ptr)return 0;return zeroMemory(ptr,size)}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<CAPACITY_DOUBLING_MAX?2:1.125)>>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i<size;i++)buffer[offset+i]=contents[position+i]}return size},write:function(stream,buffer,offset,length,position,canOwn){if(buffer.buffer===HEAP8.buffer){canOwn=false}if(!length)return 0;var node=stream.node;node.timestamp=Date.now();if(buffer.subarray&&(!node.contents||node.contents.subarray)){if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length;return length}else if(node.usedBytes===0&&position===0){node.contents=buffer.slice(offset,offset+length);node.usedBytes=length;return length}else if(position+length<=node.usedBytes){node.contents.set(buffer.subarray(offset,offset+length),position);return length}}MEMFS.expandFileStorage(node,position+length);if(node.contents.subarray&&buffer.subarray){node.contents.set(buffer.subarray(offset,offset+length),position)}else{for(var i=0;i<length;i++){node.contents[position+i]=buffer[offset+i]}}node.usedBytes=Math.max(node.usedBytes,position+length);return length},llseek:function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(28)}return position},allocate:function(stream,offset,length){MEMFS.expandFileStorage(stream.node,offset+length);stream.node.usedBytes=Math.max(stream.node.usedBytes,offset+length)},mmap:function(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&contents.buffer===HEAP8.buffer){allocated=false;ptr=contents.byteOffset}else{if(position>0||position+length<contents.length){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}allocated=true;ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}HEAP8.set(contents,ptr)}return{ptr:ptr,allocated:allocated}},msync:function(stream,buffer,offset,length,mmapFlags){MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};function asyncLoad(url,onload,onerror,noRunDep){var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url,arrayBuffer=>{assert(arrayBuffer,`Loading data file "${url}" failed (no arrayBuffer).`);onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)}var preloadPlugins=Module["preloadPlugins"]||[];function FS_handledByPreloadPlugin(byteArray,fullname,finish,onerror){if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled}function FS_createPreloadedFile(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}}function FS_modeStringToFlags(str){var flagModes={"r":0,"r+":2,"w":512|64|1,"w+":512|64|2,"a":1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags}function FS_getMode(canRead,canWrite){var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode}var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:function(mount){assert(ENVIRONMENT_IS_WORKER);if(!WORKERFS.reader)WORKERFS.reader=new FileReaderSync;var root=WORKERFS.createNode(null,"/",WORKERFS.DIR_MODE,0);var createdParents={};function ensureParent(path){var parts=path.split("/");var parent=root;for(var i=0;i<parts.length-1;i++){var curr=parts.slice(0,i+1).join("/");if(!createdParents[curr]){createdParents[curr]=WORKERFS.createNode(parent,parts[i],WORKERFS.DIR_MODE,0)}parent=createdParents[curr]}return parent}function base(path){var parts=path.split("/");return parts[parts.length-1]}Array.prototype.forEach.call(mount.opts["files"]||[],function(file){WORKERFS.createNode(ensureParent(file.name),base(file.name),WORKERFS.FILE_MODE,0,file,file.lastModifiedDate)});(mount.opts["blobs"]||[]).forEach(function(obj){WORKERFS.createNode(ensureParent(obj["name"]),base(obj["name"]),WORKERFS.FILE_MODE,0,obj["data"])});(mount.opts["packages"]||[]).forEach(function(pack){pack["metadata"].files.forEach(function(file){var name=file.filename.substr(1);WORKERFS.createNode(ensureParent(name),base(name),WORKERFS.FILE_MODE,0,pack["blob"].slice(file.start,file.end))})});return root},createNode:function(parent,name,mode,dev,contents,mtime){var node=FS.createNode(parent,name,mode);node.mode=mode;node.node_ops=WORKERFS.node_ops;node.stream_ops=WORKERFS.stream_ops;node.timestamp=(mtime||new Date).getTime();assert(WORKERFS.FILE_MODE!==WORKERFS.DIR_MODE);if(mode===WORKERFS.FILE_MODE){node.size=contents.size;node.contents=contents}else{node.size=4096;node.contents={}}if(parent){parent.contents[name]=node}return node},node_ops:{getattr:function(node){return{dev:1,ino:node.id,mode:node.mode,nlink:1,uid:0,gid:0,rdev:undefined,size:node.size,atime:new Date(node.timestamp),mtime:new Date(node.timestamp),ctime:new Date(node.timestamp),blksize:4096,blocks:Math.ceil(node.size/4096)}},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}},lookup:function(parent,name){throw new FS.ErrnoError(44)},mknod:function(parent,name,mode,dev){throw new FS.ErrnoError(63)},rename:function(oldNode,newDir,newName){throw new FS.ErrnoError(63)},unlink:function(parent,name){throw new FS.ErrnoError(63)},rmdir:function(parent,name){throw new FS.ErrnoError(63)},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newName,oldPath){throw new FS.ErrnoError(63)}},stream_ops:{read:function(stream,buffer,offset,length,position){if(position>=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size},write:function(stream,buffer,offset,length,position){throw new FS.ErrnoError(29)},llseek:function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(28)}return position}}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i<parts.length;i++){var islast=i===parts.length-1;if(islast&&opts.parent){break}current=FS.lookupNode(current,parts[i]);current_path=PATH.join2(current_path,parts[i]);if(FS.isMountpoint(current)){if(!islast||islast&&opts.follow_mount){current=current.mounted.root}}if(!islast||opts.follow){var count=0;while(FS.isLink(current.mode)){var link=FS.readlink(current_path);current_path=PATH_FS.resolve(PATH.dirname(current_path),link);var lookup=FS.lookupPath(current_path,{recurse_count:opts.recurse_count+1});current=lookup.node;if(count++>40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i<name.length;i++){hash=(hash<<5)-hash+name.charCodeAt(i)|0}return(parentid+hash>>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:()=>{for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd=-1)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i<dirs.length;++i){if(!dirs[i])continue;d+="/"+dirs[i];try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev:(path,mode,dev)=>{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS_modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error(`Invalid encoding type "${opts.encoding}"`)}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.name="ErrnoError";this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack="<generic error, no stack>"})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS,"WORKERFS":WORKERFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i<FS.streams.length;i++){var stream=FS.streams[i];if(!stream){continue}FS.close(stream)}},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i<len;++i)arr[i]=data.charCodeAt(i);data=arr}FS.chmod(node,mode|146);var stream=FS.open(node,577);FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}return node},createDevice:(parent,name,input,output)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=input()}catch(e){throw new FS.ErrnoError(29)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(6)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead},write:(stream,buffer,offset,length,pos)=>{for(var i=0;i<length;i++){try{output(buffer[offset+i])}catch(e){throw new FS.ErrnoError(29)}}if(length){stream.node.timestamp=Date.now()}return i}});return FS.mkdev(path,mode,dev)},forceLoadFile:obj=>{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i<size;i++){buffer[offset+i]=contents[position+i]}}else{for(var i=0;i<size;i++){buffer[offset+i]=contents.get(position+i)}}return size}stream_ops.read=(stream,buffer,offset,length,position)=>{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAPU32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP64[buf+40>>3]=BigInt(stat.size);HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+56>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+64>>2]=atime%1e3*1e3;HEAP64[buf+72>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+80>>2]=mtime%1e3*1e3;HEAP64[buf+88>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+96>>2]=ctime%1e3*1e3;HEAP64[buf+104>>3]=BigInt(stat.ino);return 0},doMsync:function(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function ___syscall__newselect(nfds,readfds,writefds,exceptfds,timeout){try{var total=0;var srcReadLow=readfds?HEAP32[readfds>>2]:0,srcReadHigh=readfds?HEAP32[readfds+4>>2]:0;var srcWriteLow=writefds?HEAP32[writefds>>2]:0,srcWriteHigh=writefds?HEAP32[writefds+4>>2]:0;var srcExceptLow=exceptfds?HEAP32[exceptfds>>2]:0,srcExceptHigh=exceptfds?HEAP32[exceptfds+4>>2]:0;var dstReadLow=0,dstReadHigh=0;var dstWriteLow=0,dstWriteHigh=0;var dstExceptLow=0,dstExceptHigh=0;var allLow=(readfds?HEAP32[readfds>>2]:0)|(writefds?HEAP32[writefds>>2]:0)|(exceptfds?HEAP32[exceptfds>>2]:0);var allHigh=(readfds?HEAP32[readfds+4>>2]:0)|(writefds?HEAP32[writefds+4>>2]:0)|(exceptfds?HEAP32[exceptfds+4>>2]:0);var check=function(fd,low,high,val){return fd<32?low&val:high&val};for(var fd=0;fd<nfds;fd++){var mask=1<<fd%32;if(!check(fd,allLow,allHigh,mask)){continue}var stream=SYSCALLS.getStreamFromFD(fd);var flags=SYSCALLS.DEFAULT_POLLMASK;if(stream.stream_ops.poll){flags=stream.stream_ops.poll(stream)}if(flags&1&&check(fd,srcReadLow,srcReadHigh,mask)){fd<32?dstReadLow=dstReadLow|mask:dstReadHigh=dstReadHigh|mask;total++}if(flags&4&&check(fd,srcWriteLow,srcWriteHigh,mask)){fd<32?dstWriteLow=dstWriteLow|mask:dstWriteHigh=dstWriteHigh|mask;total++}if(flags&2&&check(fd,srcExceptLow,srcExceptHigh,mask)){fd<32?dstExceptLow=dstExceptLow|mask:dstExceptHigh=dstExceptHigh|mask;total++}}if(readfds){HEAP32[readfds>>2]=dstReadLow;HEAP32[readfds+4>>2]=dstReadHigh}if(writefds){HEAP32[writefds>>2]=dstWriteLow;HEAP32[writefds+4>>2]=dstWriteHigh}if(exceptfds){HEAP32[exceptfds>>2]=dstExceptLow;HEAP32[exceptfds+4>>2]=dstExceptHigh}return total}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var SOCKFS={mount:function(mount){Module["websocket"]=Module["websocket"]&&"object"===typeof Module["websocket"]?Module["websocket"]:{};Module["websocket"]._callbacks={};Module["websocket"]["on"]=function(event,callback){if("function"===typeof callback){this._callbacks[event]=callback}return this};Module["websocket"].emit=function(event,param){if("function"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}};return FS.createNode(null,"/",16384|511,0)},createSocket:function(family,type,protocol){type&=~526336;var streaming=type==1;if(streaming&&protocol&&protocol!=6){throw new FS.ErrnoError(66)}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:2,seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock},getSocket:function(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock},stream_ops:{poll:function(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)},ioctl:function(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)},read:function(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length},write:function(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)},close:function(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)}},nextname:function(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return"socket["+SOCKFS.nextname.current+++"]"},websocket_sock_ops:{createPeer:function(sock,addr,port){var ws;if(typeof addr=="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module["websocket"]&&"object"===typeof Module["websocket"];var url="ws:#".replace("#","//");if(runtimeConfig){if("string"===typeof Module["websocket"]["url"]){url=Module["websocket"]["url"]}}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}var subProtocols="binary";if(runtimeConfig){if("string"===typeof Module["websocket"]["subprotocol"]){subProtocols=Module["websocket"]["subprotocol"]}}var opts=undefined;if(subProtocols!=="null"){subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);opts=subProtocols}if(runtimeConfig&&null===Module["websocket"]["subprotocol"]){subProtocols="null";opts=undefined}var WebSocketConstructor;{WebSocketConstructor=WebSocket}ws=new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(23)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!="undefined"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer},getPeer:function(sock,addr,port){return sock.peers[addr+":"+port]},addPeer:function(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer},removePeer:function(sock,peer){delete sock.peers[peer.addr+":"+peer.port]},handlePeerEvents:function(sock,peer){var first=true;var handleOpen=function(){Module["websocket"].emit("open",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}};function handleMessage(data){if(typeof data=="string"){var encoder=new TextEncoder;data=encoder.encode(data)}else{assert(data.byteLength!==undefined);if(data.byteLength==0){return}data=new Uint8Array(data)}var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module["websocket"].emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",function(data,isBinary){if(!isBinary){return}handleMessage(new Uint8Array(data).buffer)});peer.socket.on("close",function(){Module["websocket"].emit("close",sock.stream.fd)});peer.socket.on("error",function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}else{peer.socket.onopen=handleOpen;peer.socket.onclose=function(){Module["websocket"].emit("close",sock.stream.fd)};peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}}},poll:function(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask},ioctl:function(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>2]=bytes;return 0;default:return 28}},close:function(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i<peers.length;i++){var peer=sock.peers[peers[i]];try{peer.socket.close()}catch(e){}SOCKFS.websocket_sock_ops.removePeer(sock,peer)}return 0},bind:function(sock,addr,port){if(typeof sock.saddr!="undefined"||typeof sock.sport!="undefined"){throw new FS.ErrnoError(28)}sock.saddr=addr;sock.sport=port;if(sock.type===2){if(sock.server){sock.server.close();sock.server=null}try{sock.sock_ops.listen(sock,0)}catch(e){if(!(e.name==="ErrnoError"))throw e;if(e.errno!==138)throw e}}},connect:function(sock,addr,port){if(sock.server){throw new FS.ErrnoError(138)}if(typeof sock.daddr!="undefined"&&typeof sock.dport!="undefined"){var dest=SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport);if(dest){if(dest.socket.readyState===dest.socket.CONNECTING){throw new FS.ErrnoError(7)}else{throw new FS.ErrnoError(30)}}}var peer=SOCKFS.websocket_sock_ops.createPeer(sock,addr,port);sock.daddr=peer.addr;sock.dport=peer.port;throw new FS.ErrnoError(26)},listen:function(sock,backlog){if(!ENVIRONMENT_IS_NODE){throw new FS.ErrnoError(138)}},accept:function(listensock){if(!listensock.server||!listensock.pending.length){throw new FS.ErrnoError(28)}var newsock=listensock.pending.shift();newsock.stream.flags=listensock.stream.flags;return newsock},getname:function(sock,peer){var addr,port;if(peer){if(sock.daddr===undefined||sock.dport===undefined){throw new FS.ErrnoError(53)}addr=sock.daddr;port=sock.dport}else{addr=sock.saddr||0;port=sock.sport||0}return{addr:addr,port:port}},sendmsg:function(sock,buffer,offset,length,addr,port){if(sock.type===2){if(addr===undefined||port===undefined){addr=sock.daddr;port=sock.dport}if(addr===undefined||port===undefined){throw new FS.ErrnoError(17)}}else{addr=sock.daddr;port=sock.dport}var dest=SOCKFS.websocket_sock_ops.getPeer(sock,addr,port);if(sock.type===1){if(!dest||dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){throw new FS.ErrnoError(53)}else if(dest.socket.readyState===dest.socket.CONNECTING){throw new FS.ErrnoError(6)}}if(ArrayBuffer.isView(buffer)){offset+=buffer.byteOffset;buffer=buffer.buffer}var data;data=buffer.slice(offset,offset+length);if(sock.type===2){if(!dest||dest.socket.readyState!==dest.socket.OPEN){if(!dest||dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){dest=SOCKFS.websocket_sock_ops.createPeer(sock,addr,port)}dest.dgram_send_queue.push(data);return length}}try{dest.socket.send(data);return length}catch(e){throw new FS.ErrnoError(28)}},recvmsg:function(sock,length){if(sock.type===1&&sock.server){throw new FS.ErrnoError(53)}var queued=sock.recv_queue.shift();if(!queued){if(sock.type===1){var dest=SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport);if(!dest){throw new FS.ErrnoError(53)}if(dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){return null}throw new FS.ErrnoError(6)}throw new FS.ErrnoError(6)}var queuedLength=queued.data.byteLength||queued.data.length;var queuedOffset=queued.data.byteOffset||0;var queuedBuffer=queued.data.buffer||queued.data;var bytesRead=Math.min(length,queuedLength);var res={buffer:new Uint8Array(queuedBuffer,queuedOffset,bytesRead),addr:queued.addr,port:queued.port};if(sock.type===1&&bytesRead<queuedLength){var bytesRemaining=queuedLength-bytesRead;queued.data=new Uint8Array(queuedBuffer,queuedOffset+bytesRead,bytesRemaining);sock.recv_queue.unshift(queued)}return res}}};function getSocketFromFD(fd){var socket=SOCKFS.getSocket(fd);if(!socket)throw new FS.ErrnoError(8);return socket}function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}function inetPton4(str){var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0}function jstoi_q(str){return parseInt(str)}function inetPton6(str){var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.startsWith("::")){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w<words.length;w++){if(typeof words[w]=="string"){if(words[w]==="Z"){for(z=0;z<8-words.length+1;z++){parts[w+z]=0}offset=z-1}else{parts[w+offset]=_htons(parseInt(words[w],16))}}else{parts[w+offset]=words[w]}}return[parts[1]<<16|parts[0],parts[3]<<16|parts[2],parts[5]<<16|parts[4],parts[7]<<16|parts[6]]}function writeSockaddr(sa,family,addr,port,addrlen){switch(family){case 2:addr=inetPton4(addr);zeroMemory(sa,16);if(addrlen){HEAP32[addrlen>>2]=16}HEAP16[sa>>1]=family;HEAP32[sa+4>>2]=addr;HEAP16[sa+2>>1]=_htons(port);break;case 10:addr=inetPton6(addr);zeroMemory(sa,28);if(addrlen){HEAP32[addrlen>>2]=28}HEAP32[sa>>2]=family;HEAP32[sa+8>>2]=addr[0];HEAP32[sa+12>>2]=addr[1];HEAP32[sa+16>>2]=addr[2];HEAP32[sa+20>>2]=addr[3];HEAP16[sa+2>>1]=_htons(port);break;default:return 5}return 0}var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name:function(name){var res=inetPton4(name);if(res!==null){return name}res=inetPton6(name);if(res!==null){return name}var addr;if(DNS.address_map.addrs[name]){addr=DNS.address_map.addrs[name]}else{var id=DNS.address_map.id++;assert(id<65535,"exceeded max address mappings of 65535");addr="172.29."+(id&255)+"."+(id&65280);DNS.address_map.names[addr]=name;DNS.address_map.addrs[name]=addr}return addr},lookup_addr:function(addr){if(DNS.address_map.names[addr]){return DNS.address_map.names[addr]}return null}};function ___syscall_accept4(fd,addr,addrlen,flags,d1,d2){try{var sock=getSocketFromFD(fd);var newsock=sock.sock_ops.accept(sock);if(addr){var errno=writeSockaddr(addr,newsock.family,DNS.lookup_name(newsock.daddr),newsock.dport,addrlen)}return newsock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function inetNtop4(addr){return(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255)}function inetNtop6(ints){var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=inetNtop4(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word<zstart+longest){if(word===zstart){str+=":";if(zstart===0)str+=":"}continue}}str+=Number(_ntohs(parts[word]&65535)).toString(16);str+=word<7?":":""}return str}function readSockaddr(sa,salen){var family=HEAP16[sa>>1];var port=_ntohs(HEAPU16[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:28}}addr=HEAP32[sa+4>>2];addr=inetNtop4(addr);break;case 10:if(salen!==28){return{errno:28}}addr=[HEAP32[sa+8>>2],HEAP32[sa+12>>2],HEAP32[sa+16>>2],HEAP32[sa+20>>2]];addr=inetNtop6(addr);break;default:return{errno:5}}return{family:family,addr:addr,port:port}}function getSocketAddress(addrp,addrlen,allowNull){if(allowNull&&addrp===0)return null;var info=readSockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}function ___syscall_bind(fd,addr,addrlen,d1,d2,d3){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.bind(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_connect(fd,addr,addrlen,d1,d2,d3){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.connect(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_faccessat(dirfd,path,amode,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fstat64(fd,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function ___syscall_getdents64(fd,dirp,count){try{var stream=SYSCALLS.getStreamFromFD(fd);if(!stream.getdents){stream.getdents=FS.readdir(stream.path)}var struct_size=280;var pos=0;var off=FS.llseek(stream,0,1);var idx=Math.floor(off/struct_size);while(idx<stream.getdents.length&&pos+struct_size<=count){var id;var type;var name=stream.getdents[idx];if(name==="."){id=stream.node.id;type=4}else if(name===".."){var lookup=FS.lookupPath(stream.path,{parent:true});id=lookup.node.id;type=4}else{var child=FS.lookupNode(stream.node,name);id=child.id;type=FS.isChrdev(child.mode)?2:FS.isDir(child.mode)?4:FS.isLink(child.mode)?10:8}HEAP64[dirp+pos>>3]=BigInt(id);HEAP64[dirp+pos+8>>3]=BigInt((idx+1)*struct_size);HEAP16[dirp+pos+16>>1]=280;HEAP8[dirp+pos+18>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size;idx+=1}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_getpeername(fd,addr,addrlen,d1,d2,d3){try{var sock=getSocketFromFD(fd);if(!sock.daddr){return-53}var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(sock.daddr),sock.dport,addrlen);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_getsockname(fd,addr,addrlen,d1,d2,d3){try{var sock=getSocketFromFD(fd);var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(sock.saddr||"0.0.0.0"),sock.sport,addrlen);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_getsockopt(fd,level,optname,optval,optlen,d1){try{var sock=getSocketFromFD(fd);if(level===1){if(optname===4){HEAP32[optval>>2]=sock.error;HEAP32[optlen>>2]=4;sock.error=null;return 0}}return-50}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_listen(fd,backlog){try{var sock=getSocketFromFD(fd);sock.sock_ops.listen(sock,backlog);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_lstat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_mkdirat(dirfd,path,mode){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_newfstatat(dirfd,path,buf,flags){try{path=SYSCALLS.getStr(path);var nofollow=flags&256;var allowEmpty=flags&4096;flags=flags&~6400;path=SYSCALLS.calculateAt(dirfd,path,allowEmpty);return SYSCALLS.doStat(nofollow?FS.lstat:FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_poll(fds,nfds,timeout){try{var nonzero=0;for(var i=0;i<nfds;i++){var pollfd=fds+8*i;var fd=HEAP32[pollfd>>2];var events=HEAP16[pollfd+4>>1];var mask=32;var stream=FS.getStream(fd);if(stream){mask=SYSCALLS.DEFAULT_POLLMASK;if(stream.stream_ops.poll){mask=stream.stream_ops.poll(stream)}}mask&=events|8|16;if(mask)nonzero++;HEAP16[pollfd+6>>1]=mask}return nonzero}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_recvfrom(fd,buf,len,flags,addr,addrlen){try{var sock=getSocketFromFD(fd);var msg=sock.sock_ops.recvmsg(sock,len);if(!msg)return 0;if(addr){var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(msg.addr),msg.port,addrlen)}HEAPU8.set(msg.buffer,buf);return msg.buffer.byteLength}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){try{oldpath=SYSCALLS.getStr(oldpath);newpath=SYSCALLS.getStr(newpath);oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_sendto(fd,message,length,flags,addr,addr_len){try{var sock=getSocketFromFD(fd);var dest=getSocketAddress(addr,addr_len,true);if(!dest){return FS.write(sock.stream,HEAP8,message,length)}return sock.sock_ops.sendmsg(sock,HEAP8,message,length,dest.addr,dest.port)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_socket(domain,type,protocol){try{var sock=SOCKFS.createSocket(domain,type,protocol);return sock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var nowIsMonotonic=true;function __emscripten_get_now_is_monotonic(){return nowIsMonotonic}function __emscripten_throw_longjmp(){throw Infinity}function readI53FromI64(ptr){return HEAPU32[ptr>>2]+HEAP32[ptr+4>>2]*4294967296}function __gmtime_js(time,tmPtr){var date=new Date(readI53FromI64(time)*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday}function isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];function ydayFromDate(date){var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday}function __localtime_js(time,tmPtr){var date=new Date(readI53FromI64(time)*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}function __mktime_js(tmPtr){var date=new Date(HEAP32[tmPtr+20>>2]+1900,HEAP32[tmPtr+16>>2],HEAP32[tmPtr+12>>2],HEAP32[tmPtr+8>>2],HEAP32[tmPtr+4>>2],HEAP32[tmPtr>>2],0);var dst=HEAP32[tmPtr+32>>2];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){HEAP32[tmPtr+32>>2]=Number(summerOffset!=winterOffset&&dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4)}HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getYear();return date.getTime()/1e3|0}function __mmap_js(len,prot,flags,fd,off,allocated,addr){try{var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,off,prot,flags);var ptr=res.ptr;HEAP32[allocated>>2]=res.allocated;HEAPU32[addr>>2]=ptr;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function __munmap_js(addr,len,prot,flags,fd,offset){try{var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}FS.munmap(stream)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function stringToNewUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret}function __tzset_js(timezone,daylight,tzname){var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=stringToNewUTF8(winterName);var summerNamePtr=stringToNewUTF8(summerName);if(summerOffset<winterOffset){HEAPU32[tzname>>2]=winterNamePtr;HEAPU32[tzname+4>>2]=summerNamePtr}else{HEAPU32[tzname>>2]=summerNamePtr;HEAPU32[tzname+4>>2]=winterNamePtr}}function _abort(){abort("")}Module["_abort"]=_abort;function _dlopen(handle){abort(dlopenMissingError)}var readEmAsmArgsArray=[];function readEmAsmArgs(sigPtr,buf){readEmAsmArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){buf+=ch!=105&buf;readEmAsmArgsArray.push(ch==105?HEAP32[buf]:(ch==106?HEAP64:HEAPF64)[buf++>>1]);++buf}return readEmAsmArgsArray}function runEmAsmFunction(code,sigPtr,argbuf){var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}function _emscripten_asm_const_int(code,sigPtr,argbuf){return runEmAsmFunction(code,sigPtr,argbuf)}function _emscripten_date_now(){return Date.now()}function getHeapMax(){return 2147483648}function _emscripten_get_heap_max(){return getHeapMax()}var _emscripten_get_now;_emscripten_get_now=()=>performance.now();function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function emscripten_realloc_buffer(size){var b=wasmMemory.buffer;try{wasmMemory.grow(size-b.byteLength+65535>>>16);updateMemoryViews();return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings}function stringToAscii(str,buffer){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}HEAP8[buffer>>0]=0}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _proc_exit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}function exitJS(status,implicit){EXITSTATUS=status;_proc_exit(status)}var _exit=exitJS;function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_fdstat_get(fd,pbuf){try{var rightsBase=0;var rightsInheriting=0;var flags=0;{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4}HEAP8[pbuf>>0]=type;HEAP16[pbuf+2>>1]=flags;HEAP64[pbuf+8>>3]=BigInt(rightsBase);HEAP64[pbuf+16>>3]=BigInt(rightsInheriting);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr<len)break;if(typeof offset!=="undefined"){offset+=curr}}return ret}function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doReadv(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var MAX_INT53=9007199254740992;var MIN_INT53=-9007199254740992;function bigintToI53Checked(num){return num<MIN_INT53||num>MAX_INT53?NaN:Number(num)}function _fd_seek(fd,offset,whence,newOffset){try{offset=bigintToI53Checked(offset);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>3]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!=="undefined"){offset+=curr}}return ret}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _getaddrinfo(node,service,hint,out){var addr=0;var port=0;var flags=0;var family=0;var type=0;var proto=0;var ai;function allocaddrinfo(family,type,proto,canon,addr,port){var sa,salen,ai;var errno;salen=family===10?28:16;addr=family===10?inetNtop6(addr):inetNtop4(addr);sa=_malloc(salen);errno=writeSockaddr(sa,family,addr,port);assert(!errno);ai=_malloc(32);HEAP32[ai+4>>2]=family;HEAP32[ai+8>>2]=type;HEAP32[ai+12>>2]=proto;HEAPU32[ai+24>>2]=canon;HEAPU32[ai+20>>2]=sa;if(family===10){HEAP32[ai+16>>2]=28}else{HEAP32[ai+16>>2]=16}HEAP32[ai+28>>2]=0;return ai}if(hint){flags=HEAP32[hint>>2];family=HEAP32[hint+4>>2];type=HEAP32[hint+8>>2];proto=HEAP32[hint+12>>2]}if(type&&!proto){proto=type===2?17:6}if(!type&&proto){type=proto===17?2:1}if(proto===0){proto=6}if(type===0){type=1}if(!node&&!service){return-2}if(flags&~(1|2|4|1024|8|16|32)){return-1}if(hint!==0&&HEAP32[hint>>2]&2&&!node){return-1}if(flags&32){return-2}if(type!==0&&type!==1&&type!==2){return-7}if(family!==0&&family!==2&&family!==10){return-6}if(service){service=UTF8ToString(service);port=parseInt(service,10);if(isNaN(port)){if(flags&1024){return-2}return-8}}if(!node){if(family===0){family=2}if((flags&1)===0){if(family===2){addr=_htonl(2130706433)}else{addr=[0,0,0,1]}}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0}node=UTF8ToString(node);addr=inetPton4(node);if(addr!==null){if(family===0||family===2){family=2}else if(family===10&&flags&8){addr=[0,0,_htonl(65535),addr];family=10}else{return-2}}else{addr=inetPton6(node);if(addr!==null){if(family===0||family===10){family=10}else{return-2}}}if(addr!=null){ai=allocaddrinfo(family,type,proto,node,addr,port);HEAPU32[out>>2]=ai;return 0}if(flags&4){return-2}node=DNS.lookup_name(node);addr=inetPton4(node);if(family===0){family=2}else if(family===10){addr=[0,0,_htonl(65535),addr]}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0}function _getnameinfo(sa,salen,node,nodelen,serv,servlen,flags){var info=readSockaddr(sa,salen);if(info.errno){return-6}var port=info.port;var addr=info.addr;var overflowed=false;if(node&&nodelen){var lookup;if(flags&1||!(lookup=DNS.lookup_addr(addr))){if(flags&8){return-2}}else{addr=lookup}var numBytesWrittenExclNull=stringToUTF8(addr,node,nodelen);if(numBytesWrittenExclNull+1>=nodelen){overflowed=true}}if(serv&&servlen){port=""+port;var numBytesWrittenExclNull=stringToUTF8(port,serv,servlen);if(numBytesWrittenExclNull+1>=servlen){overflowed=true}}if(overflowed){return-12}return 0}function arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length<digits){str=character[0]+str}return str}function leadingNulls(value,digits){return leadingSomething(value,digits,"0")}function compareByDay(date1,date2){function sgn(value){return value<0?-1:value>0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}return thisDate.getFullYear()}return thisDate.getFullYear()-1}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+arraySum(isLeapYear(date.tm_year+1900)?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}return"PM"},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();var wasmImports={"b":___assert_fail,"f":___cxa_throw,"ka":___dlsym,"R":___syscall__newselect,"L":___syscall_accept4,"K":___syscall_bind,"J":___syscall_connect,"la":___syscall_faccessat,"g":___syscall_fcntl64,"ha":___syscall_fstat64,"U":___syscall_getdents64,"I":___syscall_getpeername,"H":___syscall_getsockname,"G":___syscall_getsockopt,"y":___syscall_ioctl,"F":___syscall_listen,"ea":___syscall_lstat64,"$":___syscall_mkdirat,"fa":___syscall_newfstatat,"w":___syscall_openat,"V":___syscall_poll,"E":___syscall_recvfrom,"T":___syscall_renameat,"S":___syscall_rmdir,"D":___syscall_sendto,"v":___syscall_socket,"ga":___syscall_stat64,"O":___syscall_unlinkat,"ia":__emscripten_get_now_is_monotonic,"M":__emscripten_throw_longjmp,"Y":__gmtime_js,"Z":__localtime_js,"_":__mktime_js,"W":__mmap_js,"X":__munmap_js,"P":__tzset_js,"a":_abort,"t":_dlopen,"oa":_emscripten_asm_const_int,"m":_emscripten_date_now,"Q":_emscripten_get_heap_max,"p":_emscripten_get_now,"ja":_emscripten_memcpy_big,"N":_emscripten_resize_heap,"ca":_environ_get,"da":_environ_sizes_get,"l":_exit,"n":_fd_close,"ba":_fd_fdstat_get,"x":_fd_read,"aa":_fd_seek,"q":_fd_write,"k":_getaddrinfo,"i":_getnameinfo,"pa":invoke_i,"na":invoke_ii,"c":invoke_iii,"o":invoke_iiii,"s":invoke_iiiii,"z":invoke_iiiiii,"r":invoke_iiiiiiiii,"B":invoke_iiiijj,"qa":invoke_iij,"h":invoke_vi,"j":invoke_vii,"d":invoke_viiii,"ma":invoke_viiiiii,"A":invoke_viiiiiiii,"C":is_timeout,"u":send_progress,"e":_strftime};var asm=createWasm();var ___wasm_call_ctors=function(){return(___wasm_call_ctors=Module["asm"]["sa"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["ta"]).apply(null,arguments)};var ___errno_location=function(){return(___errno_location=Module["asm"]["va"]).apply(null,arguments)};var _ntohs=function(){return(_ntohs=Module["asm"]["wa"]).apply(null,arguments)};var _htons=function(){return(_htons=Module["asm"]["xa"]).apply(null,arguments)};var _ffmpeg=Module["_ffmpeg"]=function(){return(_ffmpeg=Module["_ffmpeg"]=Module["asm"]["ya"]).apply(null,arguments)};var _ffprobe=Module["_ffprobe"]=function(){return(_ffprobe=Module["_ffprobe"]=Module["asm"]["za"]).apply(null,arguments)};var _htonl=function(){return(_htonl=Module["asm"]["Aa"]).apply(null,arguments)};var _emscripten_builtin_memalign=function(){return(_emscripten_builtin_memalign=Module["asm"]["Ba"]).apply(null,arguments)};var _setThrew=function(){return(_setThrew=Module["asm"]["Ca"]).apply(null,arguments)};var stackSave=function(){return(stackSave=Module["asm"]["Da"]).apply(null,arguments)};var stackRestore=function(){return(stackRestore=Module["asm"]["Ea"]).apply(null,arguments)};var ___cxa_is_pointer_type=function(){return(___cxa_is_pointer_type=Module["asm"]["Fa"]).apply(null,arguments)};var _ff_h264_cabac_tables=Module["_ff_h264_cabac_tables"]=1546732;var ___start_em_js=Module["___start_em_js"]=6077485;var ___stop_em_js=Module["___stop_em_js"]=6077662;function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiijj(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iij(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_i(index){var sp=stackSave();try{return getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}Module["setValue"]=setValue;Module["getValue"]=getValue;Module["UTF8ToString"]=UTF8ToString;Module["stringToUTF8"]=stringToUTF8;Module["lengthBytesUTF8"]=lengthBytesUTF8;Module["FS"]=FS;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); - + var _scriptDir = + typeof document !== "undefined" && document.currentScript + ? document.currentScript.src + : undefined; - return createFFmpegCore.ready -} + return (createFFmpegCore = {}) => { + var Module = typeof createFFmpegCore != "undefined" ? createFFmpegCore : {}; // Ensure that createFFmpegCore is defined and available.var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});const NULL=0;const SIZE_I32=Uint32Array.BYTES_PER_ELEMENT;const DEFAULT_ARGS=["./ffmpeg","-nostdin","-y"];const DEFAULT_ARGS_FFPROBE=["./ffprobe"];Module["NULL"]=NULL;Module["SIZE_I32"]=SIZE_I32;Module["DEFAULT_ARGS"]=DEFAULT_ARGS;Module["DEFAULT_ARGS_FFPROBE"]=DEFAULT_ARGS_FFPROBE;Module["ret"]=-1;Module["timeout"]=-1;Module["logger"]=()=>{};Module["progress"]=()=>{};function stringToPtr(str){const len=Module["lengthBytesUTF8"](str)+1;const ptr=Module["_malloc"](len);Module["stringToUTF8"](str,ptr,len);return ptr}function stringsToPtr(strs){const len=strs.length;const ptr=Module["_malloc"](len*SIZE_I32);for(let i=0;i<len;i++){Module["setValue"](ptr+SIZE_I32*i,stringToPtr(strs[i]),"i32")}return ptr}function print(message){Module["logger"]({type:"stdout",message:message})}function printErr(message){if(!message.startsWith("Aborted(native code called abort())"))Module["logger"]({type:"stderr",message:message})}function exec(..._args){const args=[...Module["DEFAULT_ARGS"],..._args];try{Module["_ffmpeg"](args.length,stringsToPtr(args))}catch(e){if(!e.message.startsWith("Aborted")){throw e}}return Module["ret"]}function ffprobe(..._args){const args=[...Module["DEFAULT_ARGS_FFPROBE"],..._args];try{Module["_ffprobe"](args.length,stringsToPtr(args))}catch(e){if(!e.message.startsWith("Aborted")){throw e}}return Module["ret"]}function setLogger(logger){Module["logger"]=logger}function setTimeout(timeout){Module["timeout"]=timeout}function setProgress(handler){Module["progress"]=handler}function receiveProgress(progress,time){Module["progress"]({progress:progress,time:time})}function reset(){Module["ret"]=-1;Module["timeout"]=-1}function _locateFile(path,prefix){const mainScriptUrlOrBlob=Module["mainScriptUrlOrBlob"];if(mainScriptUrlOrBlob){const{wasmURL:wasmURL,workerURL:workerURL}=JSON.parse(atob(mainScriptUrlOrBlob.slice(mainScriptUrlOrBlob.lastIndexOf("#")+1)));if(path.endsWith(".wasm"))return wasmURL;if(path.endsWith(".worker.js"))return workerURL}return prefix+path}Module["stringToPtr"]=stringToPtr;Module["stringsToPtr"]=stringsToPtr;Module["print"]=print;Module["printErr"]=printErr;Module["locateFile"]=_locateFile;Module["exec"]=exec;Module["ffprobe"]=ffprobe;Module["setLogger"]=setLogger;Module["setTimeout"]=setTimeout;Module["setProgress"]=setProgress;Module["reset"]=reset;Module["receiveProgress"]=receiveProgress;var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=true;var ENVIRONMENT_IS_NODE=false;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b);Module["HEAP64"]=HEAP64=new BigInt64Array(b);Module["HEAPU64"]=HEAPU64=new BigUint64Array(b)}var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();SOCKFS.root=FS.mount(SOCKFS,{},null);callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}var wasmBinaryFile;wasmBinaryFile="ffmpeg-core.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{if(!response["ok"]){throw"failed to load wasm binary file at '"+binaryFile+"'"}return response["arrayBuffer"]()}).catch(()=>getBinary(binaryFile))}}return Promise.resolve().then(()=>getBinary(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>{return WebAssembly.instantiate(binary,imports)}).then(instance=>{return instance}).then(receiver,reason=>{err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}else{return instantiateArrayBuffer(binaryFile,imports,callback)}}function createWasm(){var info={"a":wasmImports};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["ra"];updateMemoryViews();wasmTable=Module["asm"]["ua"];addOnInit(Module["asm"]["sa"]);removeRunDependency("wasm-instantiate");return exports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err("Module.instantiateWasm callback failed with error: "+e);readyPromiseReject(e)}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var ASM_CONSTS={6077464:$0=>{Module.ret=$0}};function send_progress(progress,time){Module.receiveProgress(progress,time)}function is_timeout(diff){if(Module.timeout===-1)return 0;else{return Module.timeout<=diff}}function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP64[ptr>>3];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`)}}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":HEAP64[ptr>>3]=BigInt(value);break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function ___assert_fail(condition,filename,line,func){abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24;this.set_type=function(type){HEAPU32[this.ptr+4>>2]=type};this.get_type=function(){return HEAPU32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAPU32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAPU32[this.ptr+8>>2]};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)};this.set_adjusted_ptr=function(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr};this.get_adjusted_ptr=function(){return HEAPU32[this.ptr+16>>2]};this.get_exception_ptr=function(){var isPointer=___cxa_is_pointer_type(this.get_type());if(isPointer){return HEAPU32[this.excPtr>>2]}var adjusted=this.get_adjusted_ptr();if(adjusted!==0)return adjusted;return this.excPtr}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw exceptionLast}var dlopenMissingError="To use dlopen, you need enable dynamic linking, see https://emscripten.org/docs/compiling/Dynamic-Linking.html";function ___dlsym(handle,symbol){abort(dlopenMissingError)}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function initRandomFill(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else abort("initRandomDevice")}function randomFill(view){return(randomFill=initRandomFill())(view)}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")}};function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.fsync(stream.tty)},fsync:function(stream){stream.tty.ops.fsync(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=stream.tty.ops.get_char(stream.tty)}catch(e){throw new FS.ErrnoError(29)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(6)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead},write:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.put_char){throw new FS.ErrnoError(60)}try{for(var i=0;i<length;i++){stream.tty.ops.put_char(stream.tty,buffer[offset+i])}}catch(e){throw new FS.ErrnoError(29)}if(length){stream.node.timestamp=Date.now()}return i}},default_tty_ops:{get_char:function(tty){if(!tty.input.length){var result=null;if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function zeroMemory(address,size){HEAPU8.fill(0,address,address+size);return address}function alignMemory(size,alignment){return Math.ceil(size/alignment)*alignment}function mmapAlloc(size){size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(!ptr)return 0;return zeroMemory(ptr,size)}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<CAPACITY_DOUBLING_MAX?2:1.125)>>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i<size;i++)buffer[offset+i]=contents[position+i]}return size},write:function(stream,buffer,offset,length,position,canOwn){if(buffer.buffer===HEAP8.buffer){canOwn=false}if(!length)return 0;var node=stream.node;node.timestamp=Date.now();if(buffer.subarray&&(!node.contents||node.contents.subarray)){if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length;return length}else if(node.usedBytes===0&&position===0){node.contents=buffer.slice(offset,offset+length);node.usedBytes=length;return length}else if(position+length<=node.usedBytes){node.contents.set(buffer.subarray(offset,offset+length),position);return length}}MEMFS.expandFileStorage(node,position+length);if(node.contents.subarray&&buffer.subarray){node.contents.set(buffer.subarray(offset,offset+length),position)}else{for(var i=0;i<length;i++){node.contents[position+i]=buffer[offset+i]}}node.usedBytes=Math.max(node.usedBytes,position+length);return length},llseek:function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(28)}return position},allocate:function(stream,offset,length){MEMFS.expandFileStorage(stream.node,offset+length);stream.node.usedBytes=Math.max(stream.node.usedBytes,offset+length)},mmap:function(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&contents.buffer===HEAP8.buffer){allocated=false;ptr=contents.byteOffset}else{if(position>0||position+length<contents.length){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}allocated=true;ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}HEAP8.set(contents,ptr)}return{ptr:ptr,allocated:allocated}},msync:function(stream,buffer,offset,length,mmapFlags){MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};function asyncLoad(url,onload,onerror,noRunDep){var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url,arrayBuffer=>{assert(arrayBuffer,`Loading data file "${url}" failed (no arrayBuffer).`);onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)}var preloadPlugins=Module["preloadPlugins"]||[];function FS_handledByPreloadPlugin(byteArray,fullname,finish,onerror){if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled}function FS_createPreloadedFile(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}}function FS_modeStringToFlags(str){var flagModes={"r":0,"r+":2,"w":512|64|1,"w+":512|64|2,"a":1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags}function FS_getMode(canRead,canWrite){var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode}var WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:function(mount){assert(ENVIRONMENT_IS_WORKER);if(!WORKERFS.reader)WORKERFS.reader=new FileReaderSync;var root=WORKERFS.createNode(null,"/",WORKERFS.DIR_MODE,0);var createdParents={};function ensureParent(path){var parts=path.split("/");var parent=root;for(var i=0;i<parts.length-1;i++){var curr=parts.slice(0,i+1).join("/");if(!createdParents[curr]){createdParents[curr]=WORKERFS.createNode(parent,parts[i],WORKERFS.DIR_MODE,0)}parent=createdParents[curr]}return parent}function base(path){var parts=path.split("/");return parts[parts.length-1]}Array.prototype.forEach.call(mount.opts["files"]||[],function(file){WORKERFS.createNode(ensureParent(file.name),base(file.name),WORKERFS.FILE_MODE,0,file,file.lastModifiedDate)});(mount.opts["blobs"]||[]).forEach(function(obj){WORKERFS.createNode(ensureParent(obj["name"]),base(obj["name"]),WORKERFS.FILE_MODE,0,obj["data"])});(mount.opts["packages"]||[]).forEach(function(pack){pack["metadata"].files.forEach(function(file){var name=file.filename.substr(1);WORKERFS.createNode(ensureParent(name),base(name),WORKERFS.FILE_MODE,0,pack["blob"].slice(file.start,file.end))})});return root},createNode:function(parent,name,mode,dev,contents,mtime){var node=FS.createNode(parent,name,mode);node.mode=mode;node.node_ops=WORKERFS.node_ops;node.stream_ops=WORKERFS.stream_ops;node.timestamp=(mtime||new Date).getTime();assert(WORKERFS.FILE_MODE!==WORKERFS.DIR_MODE);if(mode===WORKERFS.FILE_MODE){node.size=contents.size;node.contents=contents}else{node.size=4096;node.contents={}}if(parent){parent.contents[name]=node}return node},node_ops:{getattr:function(node){return{dev:1,ino:node.id,mode:node.mode,nlink:1,uid:0,gid:0,rdev:undefined,size:node.size,atime:new Date(node.timestamp),mtime:new Date(node.timestamp),ctime:new Date(node.timestamp),blksize:4096,blocks:Math.ceil(node.size/4096)}},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}},lookup:function(parent,name){throw new FS.ErrnoError(44)},mknod:function(parent,name,mode,dev){throw new FS.ErrnoError(63)},rename:function(oldNode,newDir,newName){throw new FS.ErrnoError(63)},unlink:function(parent,name){throw new FS.ErrnoError(63)},rmdir:function(parent,name){throw new FS.ErrnoError(63)},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newName,oldPath){throw new FS.ErrnoError(63)}},stream_ops:{read:function(stream,buffer,offset,length,position){if(position>=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size},write:function(stream,buffer,offset,length,position){throw new FS.ErrnoError(29)},llseek:function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(28)}return position}}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i<parts.length;i++){var islast=i===parts.length-1;if(islast&&opts.parent){break}current=FS.lookupNode(current,parts[i]);current_path=PATH.join2(current_path,parts[i]);if(FS.isMountpoint(current)){if(!islast||islast&&opts.follow_mount){current=current.mounted.root}}if(!islast||opts.follow){var count=0;while(FS.isLink(current.mode)){var link=FS.readlink(current_path);current_path=PATH_FS.resolve(PATH.dirname(current_path),link);var lookup=FS.lookupPath(current_path,{recurse_count:opts.recurse_count+1});current=lookup.node;if(count++>40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i<name.length;i++){hash=(hash<<5)-hash+name.charCodeAt(i)|0}return(parentid+hash>>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:()=>{for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd=-1)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i<dirs.length;++i){if(!dirs[i])continue;d+="/"+dirs[i];try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev:(path,mode,dev)=>{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS_modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error(`Invalid encoding type "${opts.encoding}"`)}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.name="ErrnoError";this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack="<generic error, no stack>"})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS,"WORKERFS":WORKERFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i<FS.streams.length;i++){var stream=FS.streams[i];if(!stream){continue}FS.close(stream)}},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i<len;++i)arr[i]=data.charCodeAt(i);data=arr}FS.chmod(node,mode|146);var stream=FS.open(node,577);FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}return node},createDevice:(parent,name,input,output)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=input()}catch(e){throw new FS.ErrnoError(29)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(6)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead},write:(stream,buffer,offset,length,pos)=>{for(var i=0;i<length;i++){try{output(buffer[offset+i])}catch(e){throw new FS.ErrnoError(29)}}if(length){stream.node.timestamp=Date.now()}return i}});return FS.mkdev(path,mode,dev)},forceLoadFile:obj=>{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i<size;i++){buffer[offset+i]=contents[position+i]}}else{for(var i=0;i<size;i++){buffer[offset+i]=contents.get(position+i)}}return size}stream_ops.read=(stream,buffer,offset,length,position)=>{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAPU32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP64[buf+40>>3]=BigInt(stat.size);HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+56>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+64>>2]=atime%1e3*1e3;HEAP64[buf+72>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+80>>2]=mtime%1e3*1e3;HEAP64[buf+88>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+96>>2]=ctime%1e3*1e3;HEAP64[buf+104>>3]=BigInt(stat.ino);return 0},doMsync:function(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function ___syscall__newselect(nfds,readfds,writefds,exceptfds,timeout){try{var total=0;var srcReadLow=readfds?HEAP32[readfds>>2]:0,srcReadHigh=readfds?HEAP32[readfds+4>>2]:0;var srcWriteLow=writefds?HEAP32[writefds>>2]:0,srcWriteHigh=writefds?HEAP32[writefds+4>>2]:0;var srcExceptLow=exceptfds?HEAP32[exceptfds>>2]:0,srcExceptHigh=exceptfds?HEAP32[exceptfds+4>>2]:0;var dstReadLow=0,dstReadHigh=0;var dstWriteLow=0,dstWriteHigh=0;var dstExceptLow=0,dstExceptHigh=0;var allLow=(readfds?HEAP32[readfds>>2]:0)|(writefds?HEAP32[writefds>>2]:0)|(exceptfds?HEAP32[exceptfds>>2]:0);var allHigh=(readfds?HEAP32[readfds+4>>2]:0)|(writefds?HEAP32[writefds+4>>2]:0)|(exceptfds?HEAP32[exceptfds+4>>2]:0);var check=function(fd,low,high,val){return fd<32?low&val:high&val};for(var fd=0;fd<nfds;fd++){var mask=1<<fd%32;if(!check(fd,allLow,allHigh,mask)){continue}var stream=SYSCALLS.getStreamFromFD(fd);var flags=SYSCALLS.DEFAULT_POLLMASK;if(stream.stream_ops.poll){flags=stream.stream_ops.poll(stream)}if(flags&1&&check(fd,srcReadLow,srcReadHigh,mask)){fd<32?dstReadLow=dstReadLow|mask:dstReadHigh=dstReadHigh|mask;total++}if(flags&4&&check(fd,srcWriteLow,srcWriteHigh,mask)){fd<32?dstWriteLow=dstWriteLow|mask:dstWriteHigh=dstWriteHigh|mask;total++}if(flags&2&&check(fd,srcExceptLow,srcExceptHigh,mask)){fd<32?dstExceptLow=dstExceptLow|mask:dstExceptHigh=dstExceptHigh|mask;total++}}if(readfds){HEAP32[readfds>>2]=dstReadLow;HEAP32[readfds+4>>2]=dstReadHigh}if(writefds){HEAP32[writefds>>2]=dstWriteLow;HEAP32[writefds+4>>2]=dstWriteHigh}if(exceptfds){HEAP32[exceptfds>>2]=dstExceptLow;HEAP32[exceptfds+4>>2]=dstExceptHigh}return total}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var SOCKFS={mount:function(mount){Module["websocket"]=Module["websocket"]&&"object"===typeof Module["websocket"]?Module["websocket"]:{};Module["websocket"]._callbacks={};Module["websocket"]["on"]=function(event,callback){if("function"===typeof callback){this._callbacks[event]=callback}return this};Module["websocket"].emit=function(event,param){if("function"===typeof this._callbacks[event]){this._callbacks[event].call(this,param)}};return FS.createNode(null,"/",16384|511,0)},createSocket:function(family,type,protocol){type&=~526336;var streaming=type==1;if(streaming&&protocol&&protocol!=6){throw new FS.ErrnoError(66)}var sock={family:family,type:type,protocol:protocol,server:null,error:null,peers:{},pending:[],recv_queue:[],sock_ops:SOCKFS.websocket_sock_ops};var name=SOCKFS.nextname();var node=FS.createNode(SOCKFS.root,name,49152,0);node.sock=sock;var stream=FS.createStream({path:name,node:node,flags:2,seekable:false,stream_ops:SOCKFS.stream_ops});sock.stream=stream;return sock},getSocket:function(fd){var stream=FS.getStream(fd);if(!stream||!FS.isSocket(stream.node.mode)){return null}return stream.node.sock},stream_ops:{poll:function(stream){var sock=stream.node.sock;return sock.sock_ops.poll(sock)},ioctl:function(stream,request,varargs){var sock=stream.node.sock;return sock.sock_ops.ioctl(sock,request,varargs)},read:function(stream,buffer,offset,length,position){var sock=stream.node.sock;var msg=sock.sock_ops.recvmsg(sock,length);if(!msg){return 0}buffer.set(msg.buffer,offset);return msg.buffer.length},write:function(stream,buffer,offset,length,position){var sock=stream.node.sock;return sock.sock_ops.sendmsg(sock,buffer,offset,length)},close:function(stream){var sock=stream.node.sock;sock.sock_ops.close(sock)}},nextname:function(){if(!SOCKFS.nextname.current){SOCKFS.nextname.current=0}return"socket["+SOCKFS.nextname.current+++"]"},websocket_sock_ops:{createPeer:function(sock,addr,port){var ws;if(typeof addr=="object"){ws=addr;addr=null;port=null}if(ws){if(ws._socket){addr=ws._socket.remoteAddress;port=ws._socket.remotePort}else{var result=/ws[s]?:\/\/([^:]+):(\d+)/.exec(ws.url);if(!result){throw new Error("WebSocket URL must be in the format ws(s)://address:port")}addr=result[1];port=parseInt(result[2],10)}}else{try{var runtimeConfig=Module["websocket"]&&"object"===typeof Module["websocket"];var url="ws:#".replace("#","//");if(runtimeConfig){if("string"===typeof Module["websocket"]["url"]){url=Module["websocket"]["url"]}}if(url==="ws://"||url==="wss://"){var parts=addr.split("/");url=url+parts[0]+":"+port+"/"+parts.slice(1).join("/")}var subProtocols="binary";if(runtimeConfig){if("string"===typeof Module["websocket"]["subprotocol"]){subProtocols=Module["websocket"]["subprotocol"]}}var opts=undefined;if(subProtocols!=="null"){subProtocols=subProtocols.replace(/^ +| +$/g,"").split(/ *, */);opts=subProtocols}if(runtimeConfig&&null===Module["websocket"]["subprotocol"]){subProtocols="null";opts=undefined}var WebSocketConstructor;{WebSocketConstructor=WebSocket}ws=new WebSocketConstructor(url,opts);ws.binaryType="arraybuffer"}catch(e){throw new FS.ErrnoError(23)}}var peer={addr:addr,port:port,socket:ws,dgram_send_queue:[]};SOCKFS.websocket_sock_ops.addPeer(sock,peer);SOCKFS.websocket_sock_ops.handlePeerEvents(sock,peer);if(sock.type===2&&typeof sock.sport!="undefined"){peer.dgram_send_queue.push(new Uint8Array([255,255,255,255,"p".charCodeAt(0),"o".charCodeAt(0),"r".charCodeAt(0),"t".charCodeAt(0),(sock.sport&65280)>>8,sock.sport&255]))}return peer},getPeer:function(sock,addr,port){return sock.peers[addr+":"+port]},addPeer:function(sock,peer){sock.peers[peer.addr+":"+peer.port]=peer},removePeer:function(sock,peer){delete sock.peers[peer.addr+":"+peer.port]},handlePeerEvents:function(sock,peer){var first=true;var handleOpen=function(){Module["websocket"].emit("open",sock.stream.fd);try{var queued=peer.dgram_send_queue.shift();while(queued){peer.socket.send(queued);queued=peer.dgram_send_queue.shift()}}catch(e){peer.socket.close()}};function handleMessage(data){if(typeof data=="string"){var encoder=new TextEncoder;data=encoder.encode(data)}else{assert(data.byteLength!==undefined);if(data.byteLength==0){return}data=new Uint8Array(data)}var wasfirst=first;first=false;if(wasfirst&&data.length===10&&data[0]===255&&data[1]===255&&data[2]===255&&data[3]===255&&data[4]==="p".charCodeAt(0)&&data[5]==="o".charCodeAt(0)&&data[6]==="r".charCodeAt(0)&&data[7]==="t".charCodeAt(0)){var newport=data[8]<<8|data[9];SOCKFS.websocket_sock_ops.removePeer(sock,peer);peer.port=newport;SOCKFS.websocket_sock_ops.addPeer(sock,peer);return}sock.recv_queue.push({addr:peer.addr,port:peer.port,data:data});Module["websocket"].emit("message",sock.stream.fd)}if(ENVIRONMENT_IS_NODE){peer.socket.on("open",handleOpen);peer.socket.on("message",function(data,isBinary){if(!isBinary){return}handleMessage(new Uint8Array(data).buffer)});peer.socket.on("close",function(){Module["websocket"].emit("close",sock.stream.fd)});peer.socket.on("error",function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])})}else{peer.socket.onopen=handleOpen;peer.socket.onclose=function(){Module["websocket"].emit("close",sock.stream.fd)};peer.socket.onmessage=function peer_socket_onmessage(event){handleMessage(event.data)};peer.socket.onerror=function(error){sock.error=14;Module["websocket"].emit("error",[sock.stream.fd,sock.error,"ECONNREFUSED: Connection refused"])}}},poll:function(sock){if(sock.type===1&&sock.server){return sock.pending.length?64|1:0}var mask=0;var dest=sock.type===1?SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport):null;if(sock.recv_queue.length||!dest||dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=64|1}if(!dest||dest&&dest.socket.readyState===dest.socket.OPEN){mask|=4}if(dest&&dest.socket.readyState===dest.socket.CLOSING||dest&&dest.socket.readyState===dest.socket.CLOSED){mask|=16}return mask},ioctl:function(sock,request,arg){switch(request){case 21531:var bytes=0;if(sock.recv_queue.length){bytes=sock.recv_queue[0].data.length}HEAP32[arg>>2]=bytes;return 0;default:return 28}},close:function(sock){if(sock.server){try{sock.server.close()}catch(e){}sock.server=null}var peers=Object.keys(sock.peers);for(var i=0;i<peers.length;i++){var peer=sock.peers[peers[i]];try{peer.socket.close()}catch(e){}SOCKFS.websocket_sock_ops.removePeer(sock,peer)}return 0},bind:function(sock,addr,port){if(typeof sock.saddr!="undefined"||typeof sock.sport!="undefined"){throw new FS.ErrnoError(28)}sock.saddr=addr;sock.sport=port;if(sock.type===2){if(sock.server){sock.server.close();sock.server=null}try{sock.sock_ops.listen(sock,0)}catch(e){if(!(e.name==="ErrnoError"))throw e;if(e.errno!==138)throw e}}},connect:function(sock,addr,port){if(sock.server){throw new FS.ErrnoError(138)}if(typeof sock.daddr!="undefined"&&typeof sock.dport!="undefined"){var dest=SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport);if(dest){if(dest.socket.readyState===dest.socket.CONNECTING){throw new FS.ErrnoError(7)}else{throw new FS.ErrnoError(30)}}}var peer=SOCKFS.websocket_sock_ops.createPeer(sock,addr,port);sock.daddr=peer.addr;sock.dport=peer.port;throw new FS.ErrnoError(26)},listen:function(sock,backlog){if(!ENVIRONMENT_IS_NODE){throw new FS.ErrnoError(138)}},accept:function(listensock){if(!listensock.server||!listensock.pending.length){throw new FS.ErrnoError(28)}var newsock=listensock.pending.shift();newsock.stream.flags=listensock.stream.flags;return newsock},getname:function(sock,peer){var addr,port;if(peer){if(sock.daddr===undefined||sock.dport===undefined){throw new FS.ErrnoError(53)}addr=sock.daddr;port=sock.dport}else{addr=sock.saddr||0;port=sock.sport||0}return{addr:addr,port:port}},sendmsg:function(sock,buffer,offset,length,addr,port){if(sock.type===2){if(addr===undefined||port===undefined){addr=sock.daddr;port=sock.dport}if(addr===undefined||port===undefined){throw new FS.ErrnoError(17)}}else{addr=sock.daddr;port=sock.dport}var dest=SOCKFS.websocket_sock_ops.getPeer(sock,addr,port);if(sock.type===1){if(!dest||dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){throw new FS.ErrnoError(53)}else if(dest.socket.readyState===dest.socket.CONNECTING){throw new FS.ErrnoError(6)}}if(ArrayBuffer.isView(buffer)){offset+=buffer.byteOffset;buffer=buffer.buffer}var data;data=buffer.slice(offset,offset+length);if(sock.type===2){if(!dest||dest.socket.readyState!==dest.socket.OPEN){if(!dest||dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){dest=SOCKFS.websocket_sock_ops.createPeer(sock,addr,port)}dest.dgram_send_queue.push(data);return length}}try{dest.socket.send(data);return length}catch(e){throw new FS.ErrnoError(28)}},recvmsg:function(sock,length){if(sock.type===1&&sock.server){throw new FS.ErrnoError(53)}var queued=sock.recv_queue.shift();if(!queued){if(sock.type===1){var dest=SOCKFS.websocket_sock_ops.getPeer(sock,sock.daddr,sock.dport);if(!dest){throw new FS.ErrnoError(53)}if(dest.socket.readyState===dest.socket.CLOSING||dest.socket.readyState===dest.socket.CLOSED){return null}throw new FS.ErrnoError(6)}throw new FS.ErrnoError(6)}var queuedLength=queued.data.byteLength||queued.data.length;var queuedOffset=queued.data.byteOffset||0;var queuedBuffer=queued.data.buffer||queued.data;var bytesRead=Math.min(length,queuedLength);var res={buffer:new Uint8Array(queuedBuffer,queuedOffset,bytesRead),addr:queued.addr,port:queued.port};if(sock.type===1&&bytesRead<queuedLength){var bytesRemaining=queuedLength-bytesRead;queued.data=new Uint8Array(queuedBuffer,queuedOffset+bytesRead,bytesRemaining);sock.recv_queue.unshift(queued)}return res}}};function getSocketFromFD(fd){var socket=SOCKFS.getSocket(fd);if(!socket)throw new FS.ErrnoError(8);return socket}function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}function inetPton4(str){var b=str.split(".");for(var i=0;i<4;i++){var tmp=Number(b[i]);if(isNaN(tmp))return null;b[i]=tmp}return(b[0]|b[1]<<8|b[2]<<16|b[3]<<24)>>>0}function jstoi_q(str){return parseInt(str)}function inetPton6(str){var words;var w,offset,z;var valid6regx=/^((?=.*::)(?!.*::.+::)(::)?([\dA-F]{1,4}:(:|\b)|){5}|([\dA-F]{1,4}:){6})((([\dA-F]{1,4}((?!\3)::|:\b|$))|(?!\2\3)){2}|(((2[0-4]|1\d|[1-9])?\d|25[0-5])\.?\b){4})$/i;var parts=[];if(!valid6regx.test(str)){return null}if(str==="::"){return[0,0,0,0,0,0,0,0]}if(str.startsWith("::")){str=str.replace("::","Z:")}else{str=str.replace("::",":Z:")}if(str.indexOf(".")>0){str=str.replace(new RegExp("[.]","g"),":");words=str.split(":");words[words.length-4]=jstoi_q(words[words.length-4])+jstoi_q(words[words.length-3])*256;words[words.length-3]=jstoi_q(words[words.length-2])+jstoi_q(words[words.length-1])*256;words=words.slice(0,words.length-2)}else{words=str.split(":")}offset=0;z=0;for(w=0;w<words.length;w++){if(typeof words[w]=="string"){if(words[w]==="Z"){for(z=0;z<8-words.length+1;z++){parts[w+z]=0}offset=z-1}else{parts[w+offset]=_htons(parseInt(words[w],16))}}else{parts[w+offset]=words[w]}}return[parts[1]<<16|parts[0],parts[3]<<16|parts[2],parts[5]<<16|parts[4],parts[7]<<16|parts[6]]}function writeSockaddr(sa,family,addr,port,addrlen){switch(family){case 2:addr=inetPton4(addr);zeroMemory(sa,16);if(addrlen){HEAP32[addrlen>>2]=16}HEAP16[sa>>1]=family;HEAP32[sa+4>>2]=addr;HEAP16[sa+2>>1]=_htons(port);break;case 10:addr=inetPton6(addr);zeroMemory(sa,28);if(addrlen){HEAP32[addrlen>>2]=28}HEAP32[sa>>2]=family;HEAP32[sa+8>>2]=addr[0];HEAP32[sa+12>>2]=addr[1];HEAP32[sa+16>>2]=addr[2];HEAP32[sa+20>>2]=addr[3];HEAP16[sa+2>>1]=_htons(port);break;default:return 5}return 0}var DNS={address_map:{id:1,addrs:{},names:{}},lookup_name:function(name){var res=inetPton4(name);if(res!==null){return name}res=inetPton6(name);if(res!==null){return name}var addr;if(DNS.address_map.addrs[name]){addr=DNS.address_map.addrs[name]}else{var id=DNS.address_map.id++;assert(id<65535,"exceeded max address mappings of 65535");addr="172.29."+(id&255)+"."+(id&65280);DNS.address_map.names[addr]=name;DNS.address_map.addrs[name]=addr}return addr},lookup_addr:function(addr){if(DNS.address_map.names[addr]){return DNS.address_map.names[addr]}return null}};function ___syscall_accept4(fd,addr,addrlen,flags,d1,d2){try{var sock=getSocketFromFD(fd);var newsock=sock.sock_ops.accept(sock);if(addr){var errno=writeSockaddr(addr,newsock.family,DNS.lookup_name(newsock.daddr),newsock.dport,addrlen)}return newsock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function inetNtop4(addr){return(addr&255)+"."+(addr>>8&255)+"."+(addr>>16&255)+"."+(addr>>24&255)}function inetNtop6(ints){var str="";var word=0;var longest=0;var lastzero=0;var zstart=0;var len=0;var i=0;var parts=[ints[0]&65535,ints[0]>>16,ints[1]&65535,ints[1]>>16,ints[2]&65535,ints[2]>>16,ints[3]&65535,ints[3]>>16];var hasipv4=true;var v4part="";for(i=0;i<5;i++){if(parts[i]!==0){hasipv4=false;break}}if(hasipv4){v4part=inetNtop4(parts[6]|parts[7]<<16);if(parts[5]===-1){str="::ffff:";str+=v4part;return str}if(parts[5]===0){str="::";if(v4part==="0.0.0.0")v4part="";if(v4part==="0.0.0.1")v4part="1";str+=v4part;return str}}for(word=0;word<8;word++){if(parts[word]===0){if(word-lastzero>1){len=0}lastzero=word;len++}if(len>longest){longest=len;zstart=word-longest+1}}for(word=0;word<8;word++){if(longest>1){if(parts[word]===0&&word>=zstart&&word<zstart+longest){if(word===zstart){str+=":";if(zstart===0)str+=":"}continue}}str+=Number(_ntohs(parts[word]&65535)).toString(16);str+=word<7?":":""}return str}function readSockaddr(sa,salen){var family=HEAP16[sa>>1];var port=_ntohs(HEAPU16[sa+2>>1]);var addr;switch(family){case 2:if(salen!==16){return{errno:28}}addr=HEAP32[sa+4>>2];addr=inetNtop4(addr);break;case 10:if(salen!==28){return{errno:28}}addr=[HEAP32[sa+8>>2],HEAP32[sa+12>>2],HEAP32[sa+16>>2],HEAP32[sa+20>>2]];addr=inetNtop6(addr);break;default:return{errno:5}}return{family:family,addr:addr,port:port}}function getSocketAddress(addrp,addrlen,allowNull){if(allowNull&&addrp===0)return null;var info=readSockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}function ___syscall_bind(fd,addr,addrlen,d1,d2,d3){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.bind(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_connect(fd,addr,addrlen,d1,d2,d3){try{var sock=getSocketFromFD(fd);var info=getSocketAddress(addr,addrlen);sock.sock_ops.connect(sock,info.addr,info.port);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_faccessat(dirfd,path,amode,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fstat64(fd,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function ___syscall_getdents64(fd,dirp,count){try{var stream=SYSCALLS.getStreamFromFD(fd);if(!stream.getdents){stream.getdents=FS.readdir(stream.path)}var struct_size=280;var pos=0;var off=FS.llseek(stream,0,1);var idx=Math.floor(off/struct_size);while(idx<stream.getdents.length&&pos+struct_size<=count){var id;var type;var name=stream.getdents[idx];if(name==="."){id=stream.node.id;type=4}else if(name===".."){var lookup=FS.lookupPath(stream.path,{parent:true});id=lookup.node.id;type=4}else{var child=FS.lookupNode(stream.node,name);id=child.id;type=FS.isChrdev(child.mode)?2:FS.isDir(child.mode)?4:FS.isLink(child.mode)?10:8}HEAP64[dirp+pos>>3]=BigInt(id);HEAP64[dirp+pos+8>>3]=BigInt((idx+1)*struct_size);HEAP16[dirp+pos+16>>1]=280;HEAP8[dirp+pos+18>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size;idx+=1}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_getpeername(fd,addr,addrlen,d1,d2,d3){try{var sock=getSocketFromFD(fd);if(!sock.daddr){return-53}var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(sock.daddr),sock.dport,addrlen);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_getsockname(fd,addr,addrlen,d1,d2,d3){try{var sock=getSocketFromFD(fd);var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(sock.saddr||"0.0.0.0"),sock.sport,addrlen);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_getsockopt(fd,level,optname,optval,optlen,d1){try{var sock=getSocketFromFD(fd);if(level===1){if(optname===4){HEAP32[optval>>2]=sock.error;HEAP32[optlen>>2]=4;sock.error=null;return 0}}return-50}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_listen(fd,backlog){try{var sock=getSocketFromFD(fd);sock.sock_ops.listen(sock,backlog);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_lstat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_mkdirat(dirfd,path,mode){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_newfstatat(dirfd,path,buf,flags){try{path=SYSCALLS.getStr(path);var nofollow=flags&256;var allowEmpty=flags&4096;flags=flags&~6400;path=SYSCALLS.calculateAt(dirfd,path,allowEmpty);return SYSCALLS.doStat(nofollow?FS.lstat:FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_poll(fds,nfds,timeout){try{var nonzero=0;for(var i=0;i<nfds;i++){var pollfd=fds+8*i;var fd=HEAP32[pollfd>>2];var events=HEAP16[pollfd+4>>1];var mask=32;var stream=FS.getStream(fd);if(stream){mask=SYSCALLS.DEFAULT_POLLMASK;if(stream.stream_ops.poll){mask=stream.stream_ops.poll(stream)}}mask&=events|8|16;if(mask)nonzero++;HEAP16[pollfd+6>>1]=mask}return nonzero}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_recvfrom(fd,buf,len,flags,addr,addrlen){try{var sock=getSocketFromFD(fd);var msg=sock.sock_ops.recvmsg(sock,len);if(!msg)return 0;if(addr){var errno=writeSockaddr(addr,sock.family,DNS.lookup_name(msg.addr),msg.port,addrlen)}HEAPU8.set(msg.buffer,buf);return msg.buffer.byteLength}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_renameat(olddirfd,oldpath,newdirfd,newpath){try{oldpath=SYSCALLS.getStr(oldpath);newpath=SYSCALLS.getStr(newpath);oldpath=SYSCALLS.calculateAt(olddirfd,oldpath);newpath=SYSCALLS.calculateAt(newdirfd,newpath);FS.rename(oldpath,newpath);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_sendto(fd,message,length,flags,addr,addr_len){try{var sock=getSocketFromFD(fd);var dest=getSocketAddress(addr,addr_len,true);if(!dest){return FS.write(sock.stream,HEAP8,message,length)}return sock.sock_ops.sendmsg(sock,HEAP8,message,length,dest.addr,dest.port)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_socket(domain,type,protocol){try{var sock=SOCKFS.createSocket(domain,type,protocol);return sock.stream.fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var nowIsMonotonic=true;function __emscripten_get_now_is_monotonic(){return nowIsMonotonic}function __emscripten_throw_longjmp(){throw Infinity}function readI53FromI64(ptr){return HEAPU32[ptr>>2]+HEAP32[ptr+4>>2]*4294967296}function __gmtime_js(time,tmPtr){var date=new Date(readI53FromI64(time)*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday}function isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];function ydayFromDate(date){var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday}function __localtime_js(time,tmPtr){var date=new Date(readI53FromI64(time)*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}function __mktime_js(tmPtr){var date=new Date(HEAP32[tmPtr+20>>2]+1900,HEAP32[tmPtr+16>>2],HEAP32[tmPtr+12>>2],HEAP32[tmPtr+8>>2],HEAP32[tmPtr+4>>2],HEAP32[tmPtr>>2],0);var dst=HEAP32[tmPtr+32>>2];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){HEAP32[tmPtr+32>>2]=Number(summerOffset!=winterOffset&&dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4)}HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getYear();return date.getTime()/1e3|0}function __mmap_js(len,prot,flags,fd,off,allocated,addr){try{var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,off,prot,flags);var ptr=res.ptr;HEAP32[allocated>>2]=res.allocated;HEAPU32[addr>>2]=ptr;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function __munmap_js(addr,len,prot,flags,fd,offset){try{var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}FS.munmap(stream)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function stringToNewUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret}function __tzset_js(timezone,daylight,tzname){var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=stringToNewUTF8(winterName);var summerNamePtr=stringToNewUTF8(summerName);if(summerOffset<winterOffset){HEAPU32[tzname>>2]=winterNamePtr;HEAPU32[tzname+4>>2]=summerNamePtr}else{HEAPU32[tzname>>2]=summerNamePtr;HEAPU32[tzname+4>>2]=winterNamePtr}}function _abort(){abort("")}Module["_abort"]=_abort;function _dlopen(handle){abort(dlopenMissingError)}var readEmAsmArgsArray=[];function readEmAsmArgs(sigPtr,buf){readEmAsmArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){buf+=ch!=105&buf;readEmAsmArgsArray.push(ch==105?HEAP32[buf]:(ch==106?HEAP64:HEAPF64)[buf++>>1]);++buf}return readEmAsmArgsArray}function runEmAsmFunction(code,sigPtr,argbuf){var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}function _emscripten_asm_const_int(code,sigPtr,argbuf){return runEmAsmFunction(code,sigPtr,argbuf)}function _emscripten_date_now(){return Date.now()}function getHeapMax(){return 2147483648}function _emscripten_get_heap_max(){return getHeapMax()}var _emscripten_get_now;_emscripten_get_now=()=>performance.now();function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function emscripten_realloc_buffer(size){var b=wasmMemory.buffer;try{wasmMemory.grow(size-b.byteLength+65535>>>16);updateMemoryViews();return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings}function stringToAscii(str,buffer){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}HEAP8[buffer>>0]=0}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _proc_exit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}function exitJS(status,implicit){EXITSTATUS=status;_proc_exit(status)}var _exit=exitJS;function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_fdstat_get(fd,pbuf){try{var rightsBase=0;var rightsInheriting=0;var flags=0;{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4}HEAP8[pbuf>>0]=type;HEAP16[pbuf+2>>1]=flags;HEAP64[pbuf+8>>3]=BigInt(rightsBase);HEAP64[pbuf+16>>3]=BigInt(rightsInheriting);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr<len)break;if(typeof offset!=="undefined"){offset+=curr}}return ret}function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doReadv(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var MAX_INT53=9007199254740992;var MIN_INT53=-9007199254740992;function bigintToI53Checked(num){return num<MIN_INT53||num>MAX_INT53?NaN:Number(num)}function _fd_seek(fd,offset,whence,newOffset){try{offset=bigintToI53Checked(offset);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>3]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!=="undefined"){offset+=curr}}return ret}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _getaddrinfo(node,service,hint,out){var addr=0;var port=0;var flags=0;var family=0;var type=0;var proto=0;var ai;function allocaddrinfo(family,type,proto,canon,addr,port){var sa,salen,ai;var errno;salen=family===10?28:16;addr=family===10?inetNtop6(addr):inetNtop4(addr);sa=_malloc(salen);errno=writeSockaddr(sa,family,addr,port);assert(!errno);ai=_malloc(32);HEAP32[ai+4>>2]=family;HEAP32[ai+8>>2]=type;HEAP32[ai+12>>2]=proto;HEAPU32[ai+24>>2]=canon;HEAPU32[ai+20>>2]=sa;if(family===10){HEAP32[ai+16>>2]=28}else{HEAP32[ai+16>>2]=16}HEAP32[ai+28>>2]=0;return ai}if(hint){flags=HEAP32[hint>>2];family=HEAP32[hint+4>>2];type=HEAP32[hint+8>>2];proto=HEAP32[hint+12>>2]}if(type&&!proto){proto=type===2?17:6}if(!type&&proto){type=proto===17?2:1}if(proto===0){proto=6}if(type===0){type=1}if(!node&&!service){return-2}if(flags&~(1|2|4|1024|8|16|32)){return-1}if(hint!==0&&HEAP32[hint>>2]&2&&!node){return-1}if(flags&32){return-2}if(type!==0&&type!==1&&type!==2){return-7}if(family!==0&&family!==2&&family!==10){return-6}if(service){service=UTF8ToString(service);port=parseInt(service,10);if(isNaN(port)){if(flags&1024){return-2}return-8}}if(!node){if(family===0){family=2}if((flags&1)===0){if(family===2){addr=_htonl(2130706433)}else{addr=[0,0,0,1]}}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0}node=UTF8ToString(node);addr=inetPton4(node);if(addr!==null){if(family===0||family===2){family=2}else if(family===10&&flags&8){addr=[0,0,_htonl(65535),addr];family=10}else{return-2}}else{addr=inetPton6(node);if(addr!==null){if(family===0||family===10){family=10}else{return-2}}}if(addr!=null){ai=allocaddrinfo(family,type,proto,node,addr,port);HEAPU32[out>>2]=ai;return 0}if(flags&4){return-2}node=DNS.lookup_name(node);addr=inetPton4(node);if(family===0){family=2}else if(family===10){addr=[0,0,_htonl(65535),addr]}ai=allocaddrinfo(family,type,proto,null,addr,port);HEAPU32[out>>2]=ai;return 0}function _getnameinfo(sa,salen,node,nodelen,serv,servlen,flags){var info=readSockaddr(sa,salen);if(info.errno){return-6}var port=info.port;var addr=info.addr;var overflowed=false;if(node&&nodelen){var lookup;if(flags&1||!(lookup=DNS.lookup_addr(addr))){if(flags&8){return-2}}else{addr=lookup}var numBytesWrittenExclNull=stringToUTF8(addr,node,nodelen);if(numBytesWrittenExclNull+1>=nodelen){overflowed=true}}if(serv&&servlen){port=""+port;var numBytesWrittenExclNull=stringToUTF8(port,serv,servlen);if(numBytesWrittenExclNull+1>=servlen){overflowed=true}}if(overflowed){return-12}return 0}function arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length<digits){str=character[0]+str}return str}function leadingNulls(value,digits){return leadingSomething(value,digits,"0")}function compareByDay(date1,date2){function sgn(value){return value<0?-1:value>0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}return thisDate.getFullYear()}return thisDate.getFullYear()-1}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+arraySum(isLeapYear(date.tm_year+1900)?MONTH_DAYS_LEAP:MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}return"PM"},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();var wasmImports={"b":___assert_fail,"f":___cxa_throw,"ka":___dlsym,"R":___syscall__newselect,"L":___syscall_accept4,"K":___syscall_bind,"J":___syscall_connect,"la":___syscall_faccessat,"g":___syscall_fcntl64,"ha":___syscall_fstat64,"U":___syscall_getdents64,"I":___syscall_getpeername,"H":___syscall_getsockname,"G":___syscall_getsockopt,"y":___syscall_ioctl,"F":___syscall_listen,"ea":___syscall_lstat64,"$":___syscall_mkdirat,"fa":___syscall_newfstatat,"w":___syscall_openat,"V":___syscall_poll,"E":___syscall_recvfrom,"T":___syscall_renameat,"S":___syscall_rmdir,"D":___syscall_sendto,"v":___syscall_socket,"ga":___syscall_stat64,"O":___syscall_unlinkat,"ia":__emscripten_get_now_is_monotonic,"M":__emscripten_throw_longjmp,"Y":__gmtime_js,"Z":__localtime_js,"_":__mktime_js,"W":__mmap_js,"X":__munmap_js,"P":__tzset_js,"a":_abort,"t":_dlopen,"oa":_emscripten_asm_const_int,"m":_emscripten_date_now,"Q":_emscripten_get_heap_max,"p":_emscripten_get_now,"ja":_emscripten_memcpy_big,"N":_emscripten_resize_heap,"ca":_environ_get,"da":_environ_sizes_get,"l":_exit,"n":_fd_close,"ba":_fd_fdstat_get,"x":_fd_read,"aa":_fd_seek,"q":_fd_write,"k":_getaddrinfo,"i":_getnameinfo,"pa":invoke_i,"na":invoke_ii,"c":invoke_iii,"o":invoke_iiii,"s":invoke_iiiii,"z":invoke_iiiiii,"r":invoke_iiiiiiiii,"B":invoke_iiiijj,"qa":invoke_iij,"h":invoke_vi,"j":invoke_vii,"d":invoke_viiii,"ma":invoke_viiiiii,"A":invoke_viiiiiiii,"C":is_timeout,"u":send_progress,"e":_strftime};var asm=createWasm();var ___wasm_call_ctors=function(){return(___wasm_call_ctors=Module["asm"]["sa"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["ta"]).apply(null,arguments)};var ___errno_location=function(){return(___errno_location=Module["asm"]["va"]).apply(null,arguments)};var _ntohs=function(){return(_ntohs=Module["asm"]["wa"]).apply(null,arguments)};var _htons=function(){return(_htons=Module["asm"]["xa"]).apply(null,arguments)};var _ffmpeg=Module["_ffmpeg"]=function(){return(_ffmpeg=Module["_ffmpeg"]=Module["asm"]["ya"]).apply(null,arguments)};var _ffprobe=Module["_ffprobe"]=function(){return(_ffprobe=Module["_ffprobe"]=Module["asm"]["za"]).apply(null,arguments)};var _htonl=function(){return(_htonl=Module["asm"]["Aa"]).apply(null,arguments)};var _emscripten_builtin_memalign=function(){return(_emscripten_builtin_memalign=Module["asm"]["Ba"]).apply(null,arguments)};var _setThrew=function(){return(_setThrew=Module["asm"]["Ca"]).apply(null,arguments)};var stackSave=function(){return(stackSave=Module["asm"]["Da"]).apply(null,arguments)};var stackRestore=function(){return(stackRestore=Module["asm"]["Ea"]).apply(null,arguments)};var ___cxa_is_pointer_type=function(){return(___cxa_is_pointer_type=Module["asm"]["Fa"]).apply(null,arguments)};var _ff_h264_cabac_tables=Module["_ff_h264_cabac_tables"]=1546732;var ___start_em_js=Module["___start_em_js"]=6077485;var ___stop_em_js=Module["___stop_em_js"]=6077662;function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vii(index,a1,a2){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiijj(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_vi(index,a1){var sp=stackSave();try{getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiii(index,a1,a2,a3,a4){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiii(index,a1,a2,a3){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iij(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_i(index){var sp=stackSave();try{return getWasmTableEntry(index)()}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiiiiii(index,a1,a2,a3,a4,a5,a6,a7,a8){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiiii(index,a1,a2,a3,a4,a5){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4,a5)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_viiiiii(index,a1,a2,a3,a4,a5,a6){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}Module["setValue"]=setValue;Module["getValue"]=getValue;Module["UTF8ToString"]=UTF8ToString;Module["stringToUTF8"]=stringToUTF8;Module["lengthBytesUTF8"]=lengthBytesUTF8;Module["FS"]=FS;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); -); + return createFFmpegCore.ready; + }; })(); -if (typeof exports === 'object' && typeof module === 'object') +if (typeof exports === "object" && typeof module === "object") module.exports = createFFmpegCore; -else if (typeof define === 'function' && define['amd']) - define([], function() { return createFFmpegCore; }); -else if (typeof exports === 'object') +else if (typeof define === "function" && define["amd"]) + define([], () => createFFmpegCore); +else if (typeof exports === "object") exports["createFFmpegCore"] = createFFmpegCore; diff --git a/apps/web/public/manifest.json b/apps/web/public/manifest.json index fcbfad59..d4a41dc0 100644 --- a/apps/web/public/manifest.json +++ b/apps/web/public/manifest.json @@ -1,44 +1,44 @@ { - "name": "OpenCut", - "description": "A simple but powerful video editor that gets the job done. In your browser.", - "display": "standalone", - "start_url": "/", - "icons": [ - { - "src": "/icons/android-icon-36x36.png", - "sizes": "36x36", - "type": "image\/png", - "density": "0.75" - }, - { - "src": "/icons/android-icon-48x48.png", - "sizes": "48x48", - "type": "image\/png", - "density": "1.0" - }, - { - "src": "/icons/android-icon-72x72.png", - "sizes": "72x72", - "type": "image\/png", - "density": "1.5" - }, - { - "src": "/icons/android-icon-96x96.png", - "sizes": "96x96", - "type": "image\/png", - "density": "2.0" - }, - { - "src": "/icons/android-icon-144x144.png", - "sizes": "144x144", - "type": "image\/png", - "density": "3.0" - }, - { - "src": "/icons/android-icon-192x192.png", - "sizes": "192x192", - "type": "image\/png", - "density": "4.0" - } - ] -}
\ No newline at end of file + "name": "OpenCut", + "description": "A simple but powerful video editor that gets the job done. In your browser.", + "display": "standalone", + "start_url": "/", + "icons": [ + { + "src": "/icons/android-icon-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": "0.75" + }, + { + "src": "/icons/android-icon-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": "1.0" + }, + { + "src": "/icons/android-icon-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": "1.5" + }, + { + "src": "/icons/android-icon-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": "2.0" + }, + { + "src": "/icons/android-icon-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": "3.0" + }, + { + "src": "/icons/android-icon-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": "4.0" + } + ] +} diff --git a/apps/web/src/app/api/auth/[...all]/route.ts b/apps/web/src/app/api/auth/[...all]/route.ts index 55510dcb..5deef204 100644 --- a/apps/web/src/app/api/auth/[...all]/route.ts +++ b/apps/web/src/app/api/auth/[...all]/route.ts @@ -1,4 +1,4 @@ -import { auth } from "@opencut/auth";
-import { toNextJsHandler } from "better-auth/next-js";
-
-export const { POST, GET } = toNextJsHandler(auth);
\ No newline at end of file +import { auth } from "@opencut/auth"; +import { toNextJsHandler } from "better-auth/next-js"; + +export const { POST, GET } = toNextJsHandler(auth); diff --git a/apps/web/src/app/api/waitlist/route.ts b/apps/web/src/app/api/waitlist/route.ts index e5c9fd94..9f00f221 100644 --- a/apps/web/src/app/api/waitlist/route.ts +++ b/apps/web/src/app/api/waitlist/route.ts @@ -1,83 +1,105 @@ -import { NextRequest, NextResponse } from "next/server";
-import { db, eq, waitlist } from "@opencut/db";
-import { checkBotId } from "botid/server";
-import { nanoid } from "nanoid";
-import { waitlistRateLimit } from "@/lib/rate-limit";
-import { z } from "zod";
-import { env } from "@/env";
-import { cookies } from "next/headers";
-import crypto from "crypto";
-
-const waitlistSchema = z.object({
- email: z.string().email("Invalid email format").min(1, "Email is required"),
-});
-
-const CSRF_TOKEN_NAME = "waitlist-csrf";
-const TOKEN_EXPIRY = 60 * 60 * 1000;
-
-async function validateCSRFToken(request: NextRequest): Promise<boolean> {
- const clientToken = request.headers.get("x-csrf-token");
- if (!clientToken) return false;
-
- const cookieStore = await cookies();
- const cookieValue = cookieStore.get(CSRF_TOKEN_NAME)?.value;
- if (!cookieValue) return false;
-
- const [token, timestamp, signature] = cookieValue.split(":");
- if (!token || !timestamp || !signature) return false;
-
- if (clientToken !== token) return false;
-
- const now = Date.now();
- const tokenTime = parseInt(timestamp);
- if (now - tokenTime > TOKEN_EXPIRY) return false;
-
- const expectedSignature = crypto.createHmac("sha256", env.BETTER_AUTH_SECRET).update(`${token}:${timestamp}`).digest("hex");
-
- return signature === expectedSignature;
-}
-
-export async function POST(request: NextRequest) {
- const verification = await checkBotId();
-
- if (verification.isBot) {
- return NextResponse.json({ error: "Access denied" }, { status: 403 });
- }
-
- const identifier = request.headers.get("x-forwarded-for") ?? "127.0.0.1";
- const { success } = await waitlistRateLimit.limit(identifier);
-
- if (!success) {
- return NextResponse.json({ error: "Too many requests. Please try again later." }, { status: 429 });
- }
- const isValidToken = await validateCSRFToken(request);
- if (!isValidToken) {
- return NextResponse.json({ error: "Invalid security token" }, { status: 403 });
- }
-
- try {
- const body = await request.json();
- const { email } = waitlistSchema.parse(body);
-
- const existingEmail = await db.select().from(waitlist).where(eq(waitlist.email, email.toLowerCase())).limit(1);
-
- if (existingEmail.length > 0) {
- return NextResponse.json({ error: "Email already registered" }, { status: 409 });
- }
-
- await db.insert(waitlist).values({
- id: nanoid(),
- email: email.toLowerCase(),
- });
-
- return NextResponse.json({ message: "Successfully joined waitlist!" }, { status: 201 });
- } catch (error) {
- if (error instanceof z.ZodError) {
- const firstError = error.errors[0];
- return NextResponse.json({ error: firstError.message }, { status: 400 });
- }
-
- console.error("Waitlist signup error:", error);
- return NextResponse.json({ error: "Internal server error" }, { status: 500 });
- }
-}
+import { NextRequest, NextResponse } from "next/server"; +import { db, eq, waitlist } from "@opencut/db"; +import { checkBotId } from "botid/server"; +import { nanoid } from "nanoid"; +import { waitlistRateLimit } from "@/lib/rate-limit"; +import { z } from "zod"; +import { env } from "@/env"; +import { cookies } from "next/headers"; +import crypto from "crypto"; + +const waitlistSchema = z.object({ + email: z.string().email("Invalid email format").min(1, "Email is required"), +}); + +const CSRF_TOKEN_NAME = "waitlist-csrf"; +const TOKEN_EXPIRY = 60 * 60 * 1000; + +async function validateCSRFToken(request: NextRequest): Promise<boolean> { + const clientToken = request.headers.get("x-csrf-token"); + if (!clientToken) return false; + + const cookieStore = await cookies(); + const cookieValue = cookieStore.get(CSRF_TOKEN_NAME)?.value; + if (!cookieValue) return false; + + const [token, timestamp, signature] = cookieValue.split(":"); + if (!token || !timestamp || !signature) return false; + + if (clientToken !== token) return false; + + const now = Date.now(); + const tokenTime = parseInt(timestamp); + if (now - tokenTime > TOKEN_EXPIRY) return false; + + const expectedSignature = crypto + .createHmac("sha256", env.BETTER_AUTH_SECRET) + .update(`${token}:${timestamp}`) + .digest("hex"); + + return signature === expectedSignature; +} + +export async function POST(request: NextRequest) { + const verification = await checkBotId(); + + if (verification.isBot) { + return NextResponse.json({ error: "Access denied" }, { status: 403 }); + } + + const identifier = request.headers.get("x-forwarded-for") ?? "127.0.0.1"; + const { success } = await waitlistRateLimit.limit(identifier); + + if (!success) { + return NextResponse.json( + { error: "Too many requests. Please try again later." }, + { status: 429 } + ); + } + const isValidToken = await validateCSRFToken(request); + if (!isValidToken) { + return NextResponse.json( + { error: "Invalid security token" }, + { status: 403 } + ); + } + + try { + const body = await request.json(); + const { email } = waitlistSchema.parse(body); + + const existingEmail = await db + .select() + .from(waitlist) + .where(eq(waitlist.email, email.toLowerCase())) + .limit(1); + + if (existingEmail.length > 0) { + return NextResponse.json( + { error: "Email already registered" }, + { status: 409 } + ); + } + + await db.insert(waitlist).values({ + id: nanoid(), + email: email.toLowerCase(), + }); + + return NextResponse.json( + { message: "Successfully joined waitlist!" }, + { status: 201 } + ); + } catch (error) { + if (error instanceof z.ZodError) { + const firstError = error.errors[0]; + return NextResponse.json({ error: firstError.message }, { status: 400 }); + } + + console.error("Waitlist signup error:", error); + return NextResponse.json( + { error: "Internal server error" }, + { status: 500 } + ); + } +} diff --git a/apps/web/src/app/api/waitlist/token/route.ts b/apps/web/src/app/api/waitlist/token/route.ts index 4c7695fa..fc2ff32c 100644 --- a/apps/web/src/app/api/waitlist/token/route.ts +++ b/apps/web/src/app/api/waitlist/token/route.ts @@ -5,7 +5,10 @@ import { env } from "@/env"; const CSRF_TOKEN_NAME = "waitlist-csrf"; const TOKEN_EXPIRY = 60 * 60 * 1000; -const allowedHosts = env.NODE_ENV === "development" ? ["localhost:3000", "127.0.0.1:3000"] : ["opencut.app", "www.opencut.app"]; +const allowedHosts = + env.NODE_ENV === "development" + ? ["localhost:3000", "127.0.0.1:3000"] + : ["opencut.app", "www.opencut.app"]; export async function GET(request: NextRequest) { const referer = request.headers.get("referer"); @@ -14,11 +17,20 @@ export async function GET(request: NextRequest) { if (referer) { const refererUrl = new URL(referer); - if (!allowedHosts.some((allowed) => refererUrl.host === allowed || refererUrl.host.endsWith(allowed))) { + if ( + !allowedHosts.some( + (allowed) => + refererUrl.host === allowed || refererUrl.host.endsWith(allowed) + ) + ) { return NextResponse.json({ error: "Forbidden" }, { status: 403 }); } } else if (host) { - if (!allowedHosts.some((allowed) => host === allowed || host.endsWith(allowed))) { + if ( + !allowedHosts.some( + (allowed) => host === allowed || host.endsWith(allowed) + ) + ) { return NextResponse.json({ error: "Forbidden" }, { status: 403 }); } } else { @@ -31,7 +43,10 @@ export async function GET(request: NextRequest) { const token = crypto.randomBytes(32).toString("hex"); const timestamp = Date.now(); - const signature = crypto.createHmac("sha256", env.BETTER_AUTH_SECRET).update(`${token}:${timestamp}`).digest("hex"); + const signature = crypto + .createHmac("sha256", env.BETTER_AUTH_SECRET) + .update(`${token}:${timestamp}`) + .digest("hex"); const cookieStore = await cookies(); cookieStore.set(CSRF_TOKEN_NAME, `${token}:${timestamp}:${signature}`, { diff --git a/apps/web/src/app/contributors/page.tsx b/apps/web/src/app/contributors/page.tsx index 5613f1f9..6a524866 100644 --- a/apps/web/src/app/contributors/page.tsx +++ b/apps/web/src/app/contributors/page.tsx @@ -1,277 +1,277 @@ -import { Metadata } from "next";
-import { Header } from "@/components/header";
-import { Card, CardContent } from "@/components/ui/card";
-import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
-import { Button } from "@/components/ui/button";
-import { ExternalLink } from "lucide-react";
-import Link from "next/link";
-import { GithubIcon } from "@/components/icons";
-import { Badge } from "@/components/ui/badge";
-
-export const metadata: Metadata = {
- title: "Contributors - OpenCut",
- description:
- "Meet the amazing people who contribute to OpenCut, the free and open-source video editor.",
- openGraph: {
- title: "Contributors - OpenCut",
- description:
- "Meet the amazing people who contribute to OpenCut, the free and open-source video editor.",
- type: "website",
- },
-};
-
-interface Contributor {
- id: number;
- login: string;
- avatar_url: string;
- html_url: string;
- contributions: number;
- type: string;
-}
-
-async function getContributors(): Promise<Contributor[]> {
- try {
- const response = await fetch(
- "https://api.github.com/repos/OpenCut-app/OpenCut/contributors?per_page=100",
- {
- headers: {
- Accept: "application/vnd.github.v3+json",
- "User-Agent": "OpenCut-Web-App",
- },
- next: { revalidate: 600 }, // 10 minutes
- }
- );
-
- if (!response.ok) {
- console.error("Failed to fetch contributors");
- return [];
- }
-
- const contributors = (await response.json()) as Contributor[];
-
- const filteredContributors = contributors.filter(
- (contributor: Contributor) => contributor.type === "User"
- );
-
- return filteredContributors;
- } catch (error) {
- console.error("Error fetching contributors:", error);
- return [];
- }
-}
-
-export default async function ContributorsPage() {
- const contributors = await getContributors();
- const topContributors = contributors.slice(0, 2);
- const otherContributors = contributors.slice(2);
-
- return (
- <div className="min-h-screen bg-background">
- <Header />
-
- <main className="relative">
- <div className="absolute inset-0 overflow-hidden pointer-events-none">
- <div className="absolute -top-40 -right-40 w-96 h-96 bg-gradient-to-br from-muted/20 to-transparent rounded-full blur-3xl" />
- <div className="absolute top-1/2 -left-40 w-80 h-80 bg-gradient-to-tr from-muted/10 to-transparent rounded-full blur-3xl" />
- </div>
-
- <div className="relative container mx-auto px-4 py-16">
- <div className="max-w-6xl mx-auto">
- <div className="text-center mb-20">
- <Link
- href={"https://github.com/OpenCut-app/OpenCut"}
- target="_blank"
- >
- <Badge variant="secondary" className="gap-2 mb-6">
- <GithubIcon className="h-3 w-3" />
- Open Source
- </Badge>
- </Link>
- <h1 className="text-5xl md:text-6xl font-bold tracking-tight mb-6">
- Contributors
- </h1>
- <p className="text-xl text-muted-foreground mb-8 max-w-2xl mx-auto leading-relaxed">
- Meet the amazing developers who are building the future of video
- editing
- </p>
-
- <div className="flex items-center justify-center gap-8 text-sm">
- <div className="flex items-center gap-2">
- <div className="w-2 h-2 bg-foreground rounded-full" />
- <span className="font-medium">{contributors.length}</span>
- <span className="text-muted-foreground">contributors</span>
- </div>
- <div className="flex items-center gap-2">
- <div className="w-2 h-2 bg-foreground rounded-full" />
- <span className="font-medium">
- {contributors.reduce((sum, c) => sum + c.contributions, 0)}
- </span>
- <span className="text-muted-foreground">contributions</span>
- </div>
- </div>
- </div>
-
- {topContributors.length > 0 && (
- <div className="mb-20">
- <div className="text-center mb-12">
- <h2 className="text-2xl font-semibold mb-2">
- Top Contributors
- </h2>
- <p className="text-muted-foreground">
- Leading the way in contributions
- </p>
- </div>
-
- <div className="flex flex-col md:flex-row gap-6 justify-center max-w-4xl mx-auto">
- {topContributors.map((contributor, index) => (
- <Link
- key={contributor.id}
- href={contributor.html_url}
- target="_blank"
- rel="noopener noreferrer"
- className="group block flex-1"
- >
- <div className="relative mx-auto max-w-md">
- <div className="absolute inset-0 bg-gradient-to-r from-muted/50 to-muted/30 rounded-2xl blur group-hover:blur-md transition-all duration-300" />
- <Card className="relative bg-background/80 backdrop-blur-sm border-2 group-hover:border-muted-foreground/20 transition-all duration-300 group-hover:shadow-xl">
- <CardContent className="p-8 text-center">
- <div className="relative mb-6">
- <Avatar className="h-24 w-24 mx-auto ring-4 ring-background shadow-2xl">
- <AvatarImage
- src={contributor.avatar_url}
- alt={`${contributor.login}'s avatar`}
- />
- <AvatarFallback className="text-lg font-semibold">
- {contributor.login.charAt(0).toUpperCase()}
- </AvatarFallback>
- </Avatar>
- </div>
- <h3 className="text-xl font-semibold mb-2 group-hover:text-foreground/80 transition-colors">
- {contributor.login}
- </h3>
- <div className="flex items-center justify-center gap-2 text-muted-foreground">
- <span className="font-medium text-foreground">
- {contributor.contributions}
- </span>
- <span>contributions</span>
- </div>
- </CardContent>
- </Card>
- </div>
- </Link>
- ))}
- </div>
- </div>
- )}
-
- {otherContributors.length > 0 && (
- <div>
- <div className="text-center mb-12">
- <h2 className="text-2xl font-semibold mb-2">
- All Contributors
- </h2>
- <p className="text-muted-foreground">
- Everyone who makes OpenCut better
- </p>
- </div>
-
- <div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 gap-6">
- {otherContributors.map((contributor, index) => (
- <Link
- key={contributor.id}
- href={contributor.html_url}
- target="_blank"
- rel="noopener noreferrer"
- className="group block"
- style={{
- animationDelay: `${index * 50}ms`,
- }}
- >
- <div className="text-center p-2 rounded-xl transition-all duration-300 hover:opacity-50">
- <Avatar className="h-16 w-16 mx-auto mb-3">
- <AvatarImage
- src={contributor.avatar_url}
- alt={`${contributor.login}'s avatar`}
- />
- <AvatarFallback className="font-medium">
- {contributor.login.charAt(0).toUpperCase()}
- </AvatarFallback>
- </Avatar>
- <h3 className="font-medium text-sm truncate group-hover:text-foreground transition-colors mb-1">
- {contributor.login}
- </h3>
- <p className="text-xs text-muted-foreground">
- {contributor.contributions}
- </p>
- </div>
- </Link>
- ))}
- </div>
- </div>
- )}
-
- {contributors.length === 0 && (
- <div className="text-center py-20">
- <div className="w-20 h-20 mx-auto mb-6 rounded-full bg-muted/50 flex items-center justify-center">
- <GithubIcon className="h-8 w-8 text-muted-foreground" />
- </div>
- <h3 className="text-xl font-medium mb-3">
- No contributors found
- </h3>
- <p className="text-muted-foreground mb-8 max-w-md mx-auto">
- Unable to load contributors at the moment. Check back later or
- view on GitHub.
- </p>
- <Link
- href="https://github.com/OpenCut-app/OpenCut/graphs/contributors"
- target="_blank"
- rel="noopener noreferrer"
- >
- <Button variant="outline" className="gap-2">
- <GithubIcon className="h-4 w-4" />
- View on GitHub
- <ExternalLink className="h-4 w-4" />
- </Button>
- </Link>
- </div>
- )}
-
- <div className="mt-32 text-center">
- <div className="max-w-2xl mx-auto">
- <h2 className="text-3xl font-bold mb-4">Join the community</h2>
- <p className="text-lg text-muted-foreground mb-10 leading-relaxed">
- OpenCut is built by developers like you. Every contribution,
- no matter how small, helps make video editing more accessible
- for everyone.
- </p>
-
- <div className="flex flex-col sm:flex-row gap-4 justify-center">
- <Link
- href="https://github.com/OpenCut-app/OpenCut/blob/main/.github/CONTRIBUTING.md"
- target="_blank"
- rel="noopener noreferrer"
- >
- <Button size="lg" className="gap-2 group">
- <GithubIcon className="h-4 w-4 group-hover:scale-110 transition-transform" />
- Start Contributing
- </Button>
- </Link>
- <Link
- href="https://github.com/OpenCut-app/OpenCut/issues"
- target="_blank"
- rel="noopener noreferrer"
- >
- <Button variant="outline" size="lg" className="gap-2 group">
- Browse Issues
- <ExternalLink className="h-4 w-4 group-hover:scale-110 transition-transform" />
- </Button>
- </Link>
- </div>
- </div>
- </div>
- </div>
- </div>
- </main>
- </div>
- );
-}
+import { Metadata } from "next"; +import { Header } from "@/components/header"; +import { Card, CardContent } from "@/components/ui/card"; +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Button } from "@/components/ui/button"; +import { ExternalLink } from "lucide-react"; +import Link from "next/link"; +import { GithubIcon } from "@/components/icons"; +import { Badge } from "@/components/ui/badge"; + +export const metadata: Metadata = { + title: "Contributors - OpenCut", + description: + "Meet the amazing people who contribute to OpenCut, the free and open-source video editor.", + openGraph: { + title: "Contributors - OpenCut", + description: + "Meet the amazing people who contribute to OpenCut, the free and open-source video editor.", + type: "website", + }, +}; + +interface Contributor { + id: number; + login: string; + avatar_url: string; + html_url: string; + contributions: number; + type: string; +} + +async function getContributors(): Promise<Contributor[]> { + try { + const response = await fetch( + "https://api.github.com/repos/OpenCut-app/OpenCut/contributors?per_page=100", + { + headers: { + Accept: "application/vnd.github.v3+json", + "User-Agent": "OpenCut-Web-App", + }, + next: { revalidate: 600 }, // 10 minutes + } + ); + + if (!response.ok) { + console.error("Failed to fetch contributors"); + return []; + } + + const contributors = (await response.json()) as Contributor[]; + + const filteredContributors = contributors.filter( + (contributor: Contributor) => contributor.type === "User" + ); + + return filteredContributors; + } catch (error) { + console.error("Error fetching contributors:", error); + return []; + } +} + +export default async function ContributorsPage() { + const contributors = await getContributors(); + const topContributors = contributors.slice(0, 2); + const otherContributors = contributors.slice(2); + + return ( + <div className="min-h-screen bg-background"> + <Header /> + + <main className="relative"> + <div className="absolute inset-0 overflow-hidden pointer-events-none"> + <div className="absolute -top-40 -right-40 w-96 h-96 bg-gradient-to-br from-muted/20 to-transparent rounded-full blur-3xl" /> + <div className="absolute top-1/2 -left-40 w-80 h-80 bg-gradient-to-tr from-muted/10 to-transparent rounded-full blur-3xl" /> + </div> + + <div className="relative container mx-auto px-4 py-16"> + <div className="max-w-6xl mx-auto"> + <div className="text-center mb-20"> + <Link + href={"https://github.com/OpenCut-app/OpenCut"} + target="_blank" + > + <Badge variant="secondary" className="gap-2 mb-6"> + <GithubIcon className="h-3 w-3" /> + Open Source + </Badge> + </Link> + <h1 className="text-5xl md:text-6xl font-bold tracking-tight mb-6"> + Contributors + </h1> + <p className="text-xl text-muted-foreground mb-8 max-w-2xl mx-auto leading-relaxed"> + Meet the amazing developers who are building the future of video + editing + </p> + + <div className="flex items-center justify-center gap-8 text-sm"> + <div className="flex items-center gap-2"> + <div className="w-2 h-2 bg-foreground rounded-full" /> + <span className="font-medium">{contributors.length}</span> + <span className="text-muted-foreground">contributors</span> + </div> + <div className="flex items-center gap-2"> + <div className="w-2 h-2 bg-foreground rounded-full" /> + <span className="font-medium"> + {contributors.reduce((sum, c) => sum + c.contributions, 0)} + </span> + <span className="text-muted-foreground">contributions</span> + </div> + </div> + </div> + + {topContributors.length > 0 && ( + <div className="mb-20"> + <div className="text-center mb-12"> + <h2 className="text-2xl font-semibold mb-2"> + Top Contributors + </h2> + <p className="text-muted-foreground"> + Leading the way in contributions + </p> + </div> + + <div className="flex flex-col md:flex-row gap-6 justify-center max-w-4xl mx-auto"> + {topContributors.map((contributor, index) => ( + <Link + key={contributor.id} + href={contributor.html_url} + target="_blank" + rel="noopener noreferrer" + className="group block flex-1" + > + <div className="relative mx-auto max-w-md"> + <div className="absolute inset-0 bg-gradient-to-r from-muted/50 to-muted/30 rounded-2xl blur group-hover:blur-md transition-all duration-300" /> + <Card className="relative bg-background/80 backdrop-blur-sm border-2 group-hover:border-muted-foreground/20 transition-all duration-300 group-hover:shadow-xl"> + <CardContent className="p-8 text-center"> + <div className="relative mb-6"> + <Avatar className="h-24 w-24 mx-auto ring-4 ring-background shadow-2xl"> + <AvatarImage + src={contributor.avatar_url} + alt={`${contributor.login}'s avatar`} + /> + <AvatarFallback className="text-lg font-semibold"> + {contributor.login.charAt(0).toUpperCase()} + </AvatarFallback> + </Avatar> + </div> + <h3 className="text-xl font-semibold mb-2 group-hover:text-foreground/80 transition-colors"> + {contributor.login} + </h3> + <div className="flex items-center justify-center gap-2 text-muted-foreground"> + <span className="font-medium text-foreground"> + {contributor.contributions} + </span> + <span>contributions</span> + </div> + </CardContent> + </Card> + </div> + </Link> + ))} + </div> + </div> + )} + + {otherContributors.length > 0 && ( + <div> + <div className="text-center mb-12"> + <h2 className="text-2xl font-semibold mb-2"> + All Contributors + </h2> + <p className="text-muted-foreground"> + Everyone who makes OpenCut better + </p> + </div> + + <div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 gap-6"> + {otherContributors.map((contributor, index) => ( + <Link + key={contributor.id} + href={contributor.html_url} + target="_blank" + rel="noopener noreferrer" + className="group block" + style={{ + animationDelay: `${index * 50}ms`, + }} + > + <div className="text-center p-2 rounded-xl transition-all duration-300 hover:opacity-50"> + <Avatar className="h-16 w-16 mx-auto mb-3"> + <AvatarImage + src={contributor.avatar_url} + alt={`${contributor.login}'s avatar`} + /> + <AvatarFallback className="font-medium"> + {contributor.login.charAt(0).toUpperCase()} + </AvatarFallback> + </Avatar> + <h3 className="font-medium text-sm truncate group-hover:text-foreground transition-colors mb-1"> + {contributor.login} + </h3> + <p className="text-xs text-muted-foreground"> + {contributor.contributions} + </p> + </div> + </Link> + ))} + </div> + </div> + )} + + {contributors.length === 0 && ( + <div className="text-center py-20"> + <div className="w-20 h-20 mx-auto mb-6 rounded-full bg-muted/50 flex items-center justify-center"> + <GithubIcon className="h-8 w-8 text-muted-foreground" /> + </div> + <h3 className="text-xl font-medium mb-3"> + No contributors found + </h3> + <p className="text-muted-foreground mb-8 max-w-md mx-auto"> + Unable to load contributors at the moment. Check back later or + view on GitHub. + </p> + <Link + href="https://github.com/OpenCut-app/OpenCut/graphs/contributors" + target="_blank" + rel="noopener noreferrer" + > + <Button variant="outline" className="gap-2"> + <GithubIcon className="h-4 w-4" /> + View on GitHub + <ExternalLink className="h-4 w-4" /> + </Button> + </Link> + </div> + )} + + <div className="mt-32 text-center"> + <div className="max-w-2xl mx-auto"> + <h2 className="text-3xl font-bold mb-4">Join the community</h2> + <p className="text-lg text-muted-foreground mb-10 leading-relaxed"> + OpenCut is built by developers like you. Every contribution, + no matter how small, helps make video editing more accessible + for everyone. + </p> + + <div className="flex flex-col sm:flex-row gap-4 justify-center"> + <Link + href="https://github.com/OpenCut-app/OpenCut/blob/main/.github/CONTRIBUTING.md" + target="_blank" + rel="noopener noreferrer" + > + <Button size="lg" className="gap-2 group"> + <GithubIcon className="h-4 w-4 group-hover:scale-110 transition-transform" /> + Start Contributing + </Button> + </Link> + <Link + href="https://github.com/OpenCut-app/OpenCut/issues" + target="_blank" + rel="noopener noreferrer" + > + <Button variant="outline" size="lg" className="gap-2 group"> + Browse Issues + <ExternalLink className="h-4 w-4 group-hover:scale-110 transition-transform" /> + </Button> + </Link> + </div> + </div> + </div> + </div> + </div> + </main> + </div> + ); +} diff --git a/apps/web/src/app/metadata.ts b/apps/web/src/app/metadata.ts index 6f9e6023..0608974d 100644 --- a/apps/web/src/app/metadata.ts +++ b/apps/web/src/app/metadata.ts @@ -1,37 +1,32 @@ -import { Metadata } from "next"; - -const title = "OpenCut"; -const description = - "A simple but powerful video editor that gets the job done. In your browser."; -const openGraphImageUrl = "https://opencut.app/open-graph/default.jpg"; -const twitterImageUrl = "/open-graph/default.jpg"; +import type { Metadata } from "next"; +import { SITE_INFO, SITE_URL } from "@/constants/site"; export const baseMetaData: Metadata = { - metadataBase: new URL("https://opencut.app"), - title: title, - description: description, + metadataBase: new URL(SITE_URL), + title: SITE_INFO.title, + description: SITE_INFO.description, openGraph: { - title: title, - description: description, - url: "https://opencut.app", - siteName: "OpenCut", + title: SITE_INFO.title, + description: SITE_INFO.description, + url: SITE_URL, + siteName: SITE_INFO.title, locale: "en_US", type: "website", images: [ { - url: openGraphImageUrl, + url: SITE_INFO.openGraphImage, width: 1200, height: 630, - alt: "OpenCut", + alt: "OpenCut Wordmark", }, ], }, twitter: { card: "summary_large_image", - title: title, - description: description, + title: SITE_INFO.title, + description: SITE_INFO.description, creator: "@opencutapp", - images: [twitterImageUrl], + images: [SITE_INFO.twitterImage], }, pinterest: { richPin: false, @@ -82,7 +77,7 @@ export const baseMetaData: Metadata = { }, appleWebApp: { capable: true, - title: title, + title: SITE_INFO.title, }, manifest: "/manifest.json", other: { diff --git a/apps/web/src/app/page.tsx b/apps/web/src/app/page.tsx index 74961549..818884ed 100644 --- a/apps/web/src/app/page.tsx +++ b/apps/web/src/app/page.tsx @@ -1,6 +1,14 @@ import { Hero } from "@/components/landing/hero"; import { Header } from "@/components/header"; import { Footer } from "@/components/footer"; +import type { Metadata } from "next"; +import { SITE_URL } from "@/constants/site"; + +export const metadata: Metadata = { + alternates: { + canonical: SITE_URL, + }, +}; export default async function Home() { return ( diff --git a/apps/web/src/app/privacy/page.tsx b/apps/web/src/app/privacy/page.tsx index 42dd0f9a..b7d700b5 100644 --- a/apps/web/src/app/privacy/page.tsx +++ b/apps/web/src/app/privacy/page.tsx @@ -1,253 +1,253 @@ -import { Metadata } from "next";
-import { Card, CardContent } from "@/components/ui/card";
-import { Badge } from "@/components/ui/badge";
-import { GithubIcon } from "@/components/icons";
-import Link from "next/link";
-import { Footer } from "@/components/footer";
-import { Header } from "@/components/header";
-
-export const metadata: Metadata = {
- title: "Privacy Policy - OpenCut",
- description:
- "Learn how OpenCut handles your data and privacy. Our commitment to protecting your information while you edit videos.",
- openGraph: {
- title: "Privacy Policy - OpenCut",
- description:
- "Learn how OpenCut handles your data and privacy. Our commitment to protecting your information while you edit videos.",
- type: "website",
- },
-};
-
-export default function PrivacyPage() {
- return (
- <div className="min-h-screen bg-background">
- <Header />
- <main className="relative">
- <div className="absolute inset-0 overflow-hidden pointer-events-none">
- <div className="absolute -top-40 -right-40 w-96 h-96 bg-gradient-to-br from-muted/20 to-transparent rounded-full blur-3xl" />
- <div className="absolute top-1/2 -left-40 w-80 h-80 bg-gradient-to-tr from-muted/10 to-transparent rounded-full blur-3xl" />
- </div>
- <div className="relative container mx-auto px-4 py-16">
- <div className="max-w-4xl mx-auto">
- <div className="text-center mb-10">
- <Link
- href="https://github.com/OpenCut-app/OpenCut"
- target="_blank"
- >
- <Badge variant="secondary" className="gap-2 mb-6">
- <GithubIcon className="h-3 w-3" />
- Open Source
- </Badge>
- </Link>
- <h1 className="text-5xl md:text-6xl font-bold tracking-tight mb-6">
- Privacy Policy
- </h1>
- <p className="text-xl text-muted-foreground mb-8 max-w-2xl mx-auto leading-relaxed">
- Learn how we handle your data and privacy. Contact us if you
- have any questions.
- </p>
- </div>
- <Card className="bg-background/80 backdrop-blur-sm border-2 border-muted/30">
- <CardContent className="p-8 text-base leading-relaxed space-y-8">
- <section>
- <h2 className="text-2xl font-semibold mb-4">
- Your Videos Stay Private
- </h2>
- <p className="mb-4">
- <strong>
- OpenCut processes all videos locally on your device.
- </strong>{" "}
- We never upload, store, or have access to your video files.
- Your content remains completely private and under your
- control at all times.
- </p>
- <p>
- All video editing, rendering, and processing happens in your
- browser using WebAssembly and local storage. No video data
- is transmitted to our servers.
- </p>
- </section>
-
- <section>
- <h2 className="text-2xl font-semibold mb-4">
- Account Information
- </h2>
- <p className="mb-4">
- When you create an account, we only collect:
- </p>
- <ul className="list-disc pl-6 mb-4 space-y-2">
- <li>Email address (for account access)</li>
- <li>
- Profile information from Google OAuth (if you choose to
- sign in with Google)
- </li>
- </ul>
- <p className="mb-4">
- <strong>
- We do NOT store your projects on our servers.
- </strong>{" "}
- All project data, including names, thumbnails, and creation
- dates, is stored locally in your browser using IndexedDB.
- </p>
- <p>
- We use{" "}
- <a
- href="https://www.better-auth.com"
- target="_blank"
- rel="noopener"
- className="text-primary hover:underline"
- >
- Better Auth
- </a>{" "}
- for secure authentication and follow industry-standard
- security practices.
- </p>
- </section>
-
- <section>
- <h2 className="text-2xl font-semibold mb-4">Analytics</h2>
- <p className="mb-4">
- We use{" "}
- <a
- href="https://www.databuddy.cc"
- target="_blank"
- rel="noopener"
- className="text-primary hover:underline"
- >
- Databuddy
- </a>{" "}
- for completely anonymized and non-invasive analytics to
- understand how people use OpenCut.
- </p>
- <p>
- This helps us improve the editor, but we never collect
- personal information, track individual users, or store any
- data that could identify you.
- </p>
- </section>
-
- <section>
- <h2 className="text-2xl font-semibold mb-4">
- Local Storage & Cookies
- </h2>
- <p className="mb-4">
- We use browser local storage and IndexedDB to:
- </p>
- <ul className="list-disc pl-6 mb-4 space-y-2">
- <li>Save your projects locally on your device</li>
- <li>Remember your editor preferences and settings</li>
- <li>Keep you logged in across browser sessions</li>
- </ul>
- <p>
- All data stays on your device and can be cleared at any time
- through your browser settings.
- </p>
- </section>
-
- <section>
- <h2 className="text-2xl font-semibold mb-4">
- Third-Party Services
- </h2>
- <p className="mb-4">
- OpenCut integrates with these services:
- </p>
- <ul className="list-disc pl-6 mb-4 space-y-2">
- <li>
- <strong>Google OAuth:</strong> For optional Google sign-in
- (governed by Google's privacy policy)
- </li>
- <li>
- <strong>Vercel:</strong> For hosting and content delivery
- </li>
- <li>
- <strong>Databuddy:</strong> For anonymized analytics
- </li>
- </ul>
- </section>
-
- <section>
- <h2 className="text-2xl font-semibold mb-4">Your Rights</h2>
- <p className="mb-4">
- You have complete control over your data:
- </p>
- <ul className="list-disc pl-6 mb-4 space-y-2">
- <li>
- Delete your account and all associated data at any time
- </li>
- <li>Export your project data</li>
- <li>Clear local storage to remove all saved projects</li>
- <li>Contact us with any privacy concerns</li>
- </ul>
- </section>
-
- <section>
- <h2 className="text-2xl font-semibold mb-4">
- Open Source Transparency
- </h2>
- <p className="mb-4">
- OpenCut is completely open source. You can review our code,
- see exactly how we handle data, and even self-host the
- application if you prefer.
- </p>
- <p>
- View our source code on{" "}
- <a
- href="https://github.com/OpenCut-app/OpenCut"
- target="_blank"
- rel="noopener"
- className="text-primary hover:underline"
- >
- GitHub
- </a>
- .
- </p>
- </section>
-
- <section>
- <h2 className="text-2xl font-semibold mb-4">Contact Us</h2>
- <p className="mb-4">
- Questions about this privacy policy or how we handle your
- data?
- </p>
- <p>
- Open an issue on our{" "}
- <a
- href="https://github.com/OpenCut-app/OpenCut/issues"
- target="_blank"
- rel="noopener"
- className="text-primary hover:underline"
- >
- GitHub repository
- </a>
- , email us at{" "}
- <a
- href="mailto:oss@opencut.app"
- className="text-primary hover:underline"
- >
- oss@opencut.app
- </a>
- , or reach out on{" "}
- <a
- href="https://x.com/opencutapp"
- target="_blank"
- rel="noopener"
- className="text-primary hover:underline"
- >
- X (Twitter)
- </a>
- .
- </p>
- </section>
-
- <p className="text-sm text-muted-foreground mt-8 pt-8 border-t border-muted/20">
- Last updated: July 14, 2025
- </p>
- </CardContent>
- </Card>
- </div>
- </div>
- </main>
- <Footer />
- </div>
- );
-}
+import { Metadata } from "next"; +import { Card, CardContent } from "@/components/ui/card"; +import { Badge } from "@/components/ui/badge"; +import { GithubIcon } from "@/components/icons"; +import Link from "next/link"; +import { Footer } from "@/components/footer"; +import { Header } from "@/components/header"; + +export const metadata: Metadata = { + title: "Privacy Policy - OpenCut", + description: + "Learn how OpenCut handles your data and privacy. Our commitment to protecting your information while you edit videos.", + openGraph: { + title: "Privacy Policy - OpenCut", + description: + "Learn how OpenCut handles your data and privacy. Our commitment to protecting your information while you edit videos.", + type: "website", + }, +}; + +export default function PrivacyPage() { + return ( + <div className="min-h-screen bg-background"> + <Header /> + <main className="relative"> + <div className="absolute inset-0 overflow-hidden pointer-events-none"> + <div className="absolute -top-40 -right-40 w-96 h-96 bg-gradient-to-br from-muted/20 to-transparent rounded-full blur-3xl" /> + <div className="absolute top-1/2 -left-40 w-80 h-80 bg-gradient-to-tr from-muted/10 to-transparent rounded-full blur-3xl" /> + </div> + <div className="relative container mx-auto px-4 py-16"> + <div className="max-w-4xl mx-auto"> + <div className="text-center mb-10"> + <Link + href="https://github.com/OpenCut-app/OpenCut" + target="_blank" + > + <Badge variant="secondary" className="gap-2 mb-6"> + <GithubIcon className="h-3 w-3" /> + Open Source + </Badge> + </Link> + <h1 className="text-5xl md:text-6xl font-bold tracking-tight mb-6"> + Privacy Policy + </h1> + <p className="text-xl text-muted-foreground mb-8 max-w-2xl mx-auto leading-relaxed"> + Learn how we handle your data and privacy. Contact us if you + have any questions. + </p> + </div> + <Card className="bg-background/80 backdrop-blur-sm border-2 border-muted/30"> + <CardContent className="p-8 text-base leading-relaxed space-y-8"> + <section> + <h2 className="text-2xl font-semibold mb-4"> + Your Videos Stay Private + </h2> + <p className="mb-4"> + <strong> + OpenCut processes all videos locally on your device. + </strong>{" "} + We never upload, store, or have access to your video files. + Your content remains completely private and under your + control at all times. + </p> + <p> + All video editing, rendering, and processing happens in your + browser using WebAssembly and local storage. No video data + is transmitted to our servers. + </p> + </section> + + <section> + <h2 className="text-2xl font-semibold mb-4"> + Account Information + </h2> + <p className="mb-4"> + When you create an account, we only collect: + </p> + <ul className="list-disc pl-6 mb-4 space-y-2"> + <li>Email address (for account access)</li> + <li> + Profile information from Google OAuth (if you choose to + sign in with Google) + </li> + </ul> + <p className="mb-4"> + <strong> + We do NOT store your projects on our servers. + </strong>{" "} + All project data, including names, thumbnails, and creation + dates, is stored locally in your browser using IndexedDB. + </p> + <p> + We use{" "} + <a + href="https://www.better-auth.com" + target="_blank" + rel="noopener" + className="text-primary hover:underline" + > + Better Auth + </a>{" "} + for secure authentication and follow industry-standard + security practices. + </p> + </section> + + <section> + <h2 className="text-2xl font-semibold mb-4">Analytics</h2> + <p className="mb-4"> + We use{" "} + <a + href="https://www.databuddy.cc" + target="_blank" + rel="noopener" + className="text-primary hover:underline" + > + Databuddy + </a>{" "} + for completely anonymized and non-invasive analytics to + understand how people use OpenCut. + </p> + <p> + This helps us improve the editor, but we never collect + personal information, track individual users, or store any + data that could identify you. + </p> + </section> + + <section> + <h2 className="text-2xl font-semibold mb-4"> + Local Storage & Cookies + </h2> + <p className="mb-4"> + We use browser local storage and IndexedDB to: + </p> + <ul className="list-disc pl-6 mb-4 space-y-2"> + <li>Save your projects locally on your device</li> + <li>Remember your editor preferences and settings</li> + <li>Keep you logged in across browser sessions</li> + </ul> + <p> + All data stays on your device and can be cleared at any time + through your browser settings. + </p> + </section> + + <section> + <h2 className="text-2xl font-semibold mb-4"> + Third-Party Services + </h2> + <p className="mb-4"> + OpenCut integrates with these services: + </p> + <ul className="list-disc pl-6 mb-4 space-y-2"> + <li> + <strong>Google OAuth:</strong> For optional Google sign-in + (governed by Google's privacy policy) + </li> + <li> + <strong>Vercel:</strong> For hosting and content delivery + </li> + <li> + <strong>Databuddy:</strong> For anonymized analytics + </li> + </ul> + </section> + + <section> + <h2 className="text-2xl font-semibold mb-4">Your Rights</h2> + <p className="mb-4"> + You have complete control over your data: + </p> + <ul className="list-disc pl-6 mb-4 space-y-2"> + <li> + Delete your account and all associated data at any time + </li> + <li>Export your project data</li> + <li>Clear local storage to remove all saved projects</li> + <li>Contact us with any privacy concerns</li> + </ul> + </section> + + <section> + <h2 className="text-2xl font-semibold mb-4"> + Open Source Transparency + </h2> + <p className="mb-4"> + OpenCut is completely open source. You can review our code, + see exactly how we handle data, and even self-host the + application if you prefer. + </p> + <p> + View our source code on{" "} + <a + href="https://github.com/OpenCut-app/OpenCut" + target="_blank" + rel="noopener" + className="text-primary hover:underline" + > + GitHub + </a> + . + </p> + </section> + + <section> + <h2 className="text-2xl font-semibold mb-4">Contact Us</h2> + <p className="mb-4"> + Questions about this privacy policy or how we handle your + data? + </p> + <p> + Open an issue on our{" "} + <a + href="https://github.com/OpenCut-app/OpenCut/issues" + target="_blank" + rel="noopener" + className="text-primary hover:underline" + > + GitHub repository + </a> + , email us at{" "} + <a + href="mailto:oss@opencut.app" + className="text-primary hover:underline" + > + oss@opencut.app + </a> + , or reach out on{" "} + <a + href="https://x.com/opencutapp" + target="_blank" + rel="noopener" + className="text-primary hover:underline" + > + X (Twitter) + </a> + . + </p> + </section> + + <p className="text-sm text-muted-foreground mt-8 pt-8 border-t border-muted/20"> + Last updated: July 14, 2025 + </p> + </CardContent> + </Card> + </div> + </div> + </main> + <Footer /> + </div> + ); +} diff --git a/apps/web/src/app/roadmap/page.tsx b/apps/web/src/app/roadmap/page.tsx index c62dce3a..5c003cf0 100644 --- a/apps/web/src/app/roadmap/page.tsx +++ b/apps/web/src/app/roadmap/page.tsx @@ -1,247 +1,247 @@ -import { Metadata } from "next";
-import { Badge } from "@/components/ui/badge";
-import { GithubIcon } from "@/components/icons";
-import Link from "next/link";
-import { Footer } from "@/components/footer";
-import { Header } from "@/components/header";
-import ReactMarkdown from "react-markdown";
-import { cn } from "@/lib/utils";
-
-const roadmapItems: {
- title: string;
- description: string;
- status: {
- text: string;
- type: "complete" | "pending" | "default" | "info";
- };
-}[] = [
- {
- title: "Start",
- description:
- "This is where it all started. Repository created, initial project structure, and the vision for a free, open-source video editor. [Check out the first tweet](https://x.com/mazeincoding/status/1936706642512388188) to see where it started.",
- status: {
- text: "Completed",
- type: "complete",
- },
- },
- {
- title: "Core UI",
- description:
- "Built the foundation - main layout, header, sidebar, timeline container, and basic component structure. Not all functionality yet, but the UI framework that everything else builds on.",
- status: {
- text: "Completed",
- type: "complete",
- },
- },
- {
- title: "Basic Functionality",
- description:
- "The heart of any video editor. Timeline zoom in/out, making clips longer/shorter, dragging elements around, selection, playhead scrubbing. **This part has to be fucking perfect** because it's what users interact with 99% of the time.",
- status: {
- text: "In Progress",
- type: "pending",
- },
- },
- {
- title: "Export/Preview Logic",
- description:
- "The foundation that enables everything else. Real-time preview, video rendering, export functionality. Once this works, we can add effects, filters, transitions - basically everything that makes a video editor powerful.",
- status: {
- text: "In Progress",
- type: "pending",
- },
- },
- {
- title: "Text",
- description:
- "After media, text is the next most important thing. Font selection with custom font imports, text stroke, colors. All the text essential text properties.",
- status: {
- text: "Not Started",
- type: "default",
- },
- },
- {
- title: "Effects",
- description:
- "Adding visual effects to both text and media. Blur, brightness, contrast, saturation, filters, and all the creative tools that make videos pop. This is where the magic happens.",
- status: {
- text: "Not Started",
- type: "default",
- },
- },
- {
- title: "Transitions",
- description:
- "Smooth transitions between clips. Fade in/out, slide, zoom, dissolve, and custom transition effects.",
- status: {
- text: "Not Started",
- type: "default",
- },
- },
- {
- title: "Refine from Here",
- description:
- "Once we nail the above, we have a **solid foundation** to build anything. Advanced features, performance optimizations, mobile support, desktop app.",
- status: {
- text: "Future",
- type: "info",
- },
- },
-];
-
-export const metadata: Metadata = {
- title: "Roadmap - OpenCut",
- description:
- "See what's coming next for OpenCut - the free, open-source video editor that respects your privacy.",
- openGraph: {
- title: "OpenCut Roadmap - What's Coming Next",
- description:
- "See what's coming next for OpenCut - the free, open-source video editor that respects your privacy.",
- type: "website",
- images: [
- {
- url: "/open-graph/roadmap.jpg",
- width: 1200,
- height: 630,
- alt: "OpenCut Roadmap",
- },
- ],
- },
- twitter: {
- card: "summary_large_image",
- title: "OpenCut Roadmap - What's Coming Next",
- description:
- "See what's coming next for OpenCut - the free, open-source video editor that respects your privacy.",
- images: ["/open-graph/roadmap.jpg"],
- },
-};
-
-export default function RoadmapPage() {
- return (
- <div className="min-h-screen bg-background">
- <Header />
- <main className="relative">
- <div className="absolute inset-0 overflow-hidden pointer-events-none">
- <div className="absolute -top-40 -right-40 w-96 h-96 bg-gradient-to-br from-muted/20 to-transparent rounded-full blur-3xl" />
- <div className="absolute top-1/2 -left-40 w-80 h-80 bg-gradient-to-tr from-muted/10 to-transparent rounded-full blur-3xl" />
- </div>
- <div className="relative container mx-auto px-4 py-16">
- <div className="max-w-4xl mx-auto">
- <div className="text-center mb-10">
- <Link
- href="https://github.com/OpenCut-app/OpenCut"
- target="_blank"
- >
- <Badge variant="secondary" className="gap-2 mb-6">
- <GithubIcon className="h-3 w-3" />
- Open Source
- </Badge>
- </Link>
- <h1 className="text-5xl md:text-6xl font-bold tracking-tight mb-6">
- Roadmap
- </h1>
- <p className="text-xl text-muted-foreground mb-8 max-w-2xl mx-auto leading-relaxed">
- What's coming next for OpenCut (last updated: July 14, 2025)
- </p>
- </div>
- <div className="space-y-6">
- {roadmapItems.map((item, index) => (
- <div key={index} className="relative">
- <div className="flex items-start gap-2">
- <span className="text-lg font-medium text-muted-foreground select-none leading-[1.5]">
- {index + 1}.
- </span>
- <div className="flex-1 pt-[2px]">
- <div className="flex items-center gap-2 mb-2">
- <h3 className="font-medium text-lg">{item.title}</h3>
- <Badge
- className={cn("shadow-none", {
- "!bg-green-500 text-white":
- item.status.type === "complete",
- "!bg-yellow-500 text-white":
- item.status.type === "pending",
- "!bg-blue-500 text-white":
- item.status.type === "info",
- "!bg-foreground/10 text-accent-foreground":
- item.status.type === "default",
- })}
- >
- {item.status.text}
- </Badge>
- </div>
- <div className="text-foreground/70 leading-relaxed">
- <ReactMarkdown
- components={{
- a: ({ className, children, ...props }) => (
- <a
- className={cn(
- "text-primary hover:underline",
- className
- )}
- target="_blank"
- rel="noopener noreferrer"
- {...props}
- >
- {children}
- </a>
- ),
- strong: ({ children }) => (
- <strong className="font-semibold text-foreground">
- {children}
- </strong>
- ),
- }}
- >
- {item.description}
- </ReactMarkdown>
- </div>
- </div>
- </div>
- </div>
- ))}
- </div>
-
- <div className="mt-12 pt-8 border-t border-muted/20">
- <div className="text-center space-y-4">
- <h3 className="text-xl font-semibold">Want to Help?</h3>
- <p className="text-muted-foreground max-w-2xl mx-auto">
- OpenCut is open source and built by the community. Every
- contribution, no matter how small, helps us build the best
- free video editor possible.
- </p>
- <div className="flex flex-col sm:flex-row gap-4 justify-center mt-6">
- <Link
- href="https://github.com/OpenCut-app/OpenCut/blob/main/.github/CONTRIBUTING.md"
- target="_blank"
- rel="noopener noreferrer"
- >
- <Badge
- variant="outline"
- className="text-sm px-4 py-2 hover:bg-muted/50 transition-colors"
- >
- <GithubIcon className="h-4 w-4 mr-2" />
- Start Contributing
- </Badge>
- </Link>
- <Link
- href="https://github.com/OpenCut-app/OpenCut/issues"
- target="_blank"
- rel="noopener noreferrer"
- >
- <Badge
- variant="outline"
- className="text-sm px-4 py-2 hover:bg-muted/50 transition-colors"
- >
- Report Issues
- </Badge>
- </Link>
- </div>
- </div>
- </div>
- </div>
- </div>
- </main>
- <Footer />
- </div>
- );
-}
+import { Metadata } from "next"; +import { Badge } from "@/components/ui/badge"; +import { GithubIcon } from "@/components/icons"; +import Link from "next/link"; +import { Footer } from "@/components/footer"; +import { Header } from "@/components/header"; +import ReactMarkdown from "react-markdown"; +import { cn } from "@/lib/utils"; + +const roadmapItems: { + title: string; + description: string; + status: { + text: string; + type: "complete" | "pending" | "default" | "info"; + }; +}[] = [ + { + title: "Start", + description: + "This is where it all started. Repository created, initial project structure, and the vision for a free, open-source video editor. [Check out the first tweet](https://x.com/mazeincoding/status/1936706642512388188) to see where it started.", + status: { + text: "Completed", + type: "complete", + }, + }, + { + title: "Core UI", + description: + "Built the foundation - main layout, header, sidebar, timeline container, and basic component structure. Not all functionality yet, but the UI framework that everything else builds on.", + status: { + text: "Completed", + type: "complete", + }, + }, + { + title: "Basic Functionality", + description: + "The heart of any video editor. Timeline zoom in/out, making clips longer/shorter, dragging elements around, selection, playhead scrubbing. **This part has to be fucking perfect** because it's what users interact with 99% of the time.", + status: { + text: "In Progress", + type: "pending", + }, + }, + { + title: "Export/Preview Logic", + description: + "The foundation that enables everything else. Real-time preview, video rendering, export functionality. Once this works, we can add effects, filters, transitions - basically everything that makes a video editor powerful.", + status: { + text: "In Progress", + type: "pending", + }, + }, + { + title: "Text", + description: + "After media, text is the next most important thing. Font selection with custom font imports, text stroke, colors. All the text essential text properties.", + status: { + text: "Not Started", + type: "default", + }, + }, + { + title: "Effects", + description: + "Adding visual effects to both text and media. Blur, brightness, contrast, saturation, filters, and all the creative tools that make videos pop. This is where the magic happens.", + status: { + text: "Not Started", + type: "default", + }, + }, + { + title: "Transitions", + description: + "Smooth transitions between clips. Fade in/out, slide, zoom, dissolve, and custom transition effects.", + status: { + text: "Not Started", + type: "default", + }, + }, + { + title: "Refine from Here", + description: + "Once we nail the above, we have a **solid foundation** to build anything. Advanced features, performance optimizations, mobile support, desktop app.", + status: { + text: "Future", + type: "info", + }, + }, +]; + +export const metadata: Metadata = { + title: "Roadmap - OpenCut", + description: + "See what's coming next for OpenCut - the free, open-source video editor that respects your privacy.", + openGraph: { + title: "OpenCut Roadmap - What's Coming Next", + description: + "See what's coming next for OpenCut - the free, open-source video editor that respects your privacy.", + type: "website", + images: [ + { + url: "/open-graph/roadmap.jpg", + width: 1200, + height: 630, + alt: "OpenCut Roadmap", + }, + ], + }, + twitter: { + card: "summary_large_image", + title: "OpenCut Roadmap - What's Coming Next", + description: + "See what's coming next for OpenCut - the free, open-source video editor that respects your privacy.", + images: ["/open-graph/roadmap.jpg"], + }, +}; + +export default function RoadmapPage() { + return ( + <div className="min-h-screen bg-background"> + <Header /> + <main className="relative"> + <div className="absolute inset-0 overflow-hidden pointer-events-none"> + <div className="absolute -top-40 -right-40 w-96 h-96 bg-gradient-to-br from-muted/20 to-transparent rounded-full blur-3xl" /> + <div className="absolute top-1/2 -left-40 w-80 h-80 bg-gradient-to-tr from-muted/10 to-transparent rounded-full blur-3xl" /> + </div> + <div className="relative container mx-auto px-4 py-16"> + <div className="max-w-4xl mx-auto"> + <div className="text-center mb-10"> + <Link + href="https://github.com/OpenCut-app/OpenCut" + target="_blank" + > + <Badge variant="secondary" className="gap-2 mb-6"> + <GithubIcon className="h-3 w-3" /> + Open Source + </Badge> + </Link> + <h1 className="text-5xl md:text-6xl font-bold tracking-tight mb-6"> + Roadmap + </h1> + <p className="text-xl text-muted-foreground mb-8 max-w-2xl mx-auto leading-relaxed"> + What's coming next for OpenCut (last updated: July 14, 2025) + </p> + </div> + <div className="space-y-6"> + {roadmapItems.map((item, index) => ( + <div key={index} className="relative"> + <div className="flex items-start gap-2"> + <span className="text-lg font-medium text-muted-foreground select-none leading-[1.5]"> + {index + 1}. + </span> + <div className="flex-1 pt-[2px]"> + <div className="flex items-center gap-2 mb-2"> + <h3 className="font-medium text-lg">{item.title}</h3> + <Badge + className={cn("shadow-none", { + "!bg-green-500 text-white": + item.status.type === "complete", + "!bg-yellow-500 text-white": + item.status.type === "pending", + "!bg-blue-500 text-white": + item.status.type === "info", + "!bg-foreground/10 text-accent-foreground": + item.status.type === "default", + })} + > + {item.status.text} + </Badge> + </div> + <div className="text-foreground/70 leading-relaxed"> + <ReactMarkdown + components={{ + a: ({ className, children, ...props }) => ( + <a + className={cn( + "text-primary hover:underline", + className + )} + target="_blank" + rel="noopener noreferrer" + {...props} + > + {children} + </a> + ), + strong: ({ children }) => ( + <strong className="font-semibold text-foreground"> + {children} + </strong> + ), + }} + > + {item.description} + </ReactMarkdown> + </div> + </div> + </div> + </div> + ))} + </div> + + <div className="mt-12 pt-8 border-t border-muted/20"> + <div className="text-center space-y-4"> + <h3 className="text-xl font-semibold">Want to Help?</h3> + <p className="text-muted-foreground max-w-2xl mx-auto"> + OpenCut is open source and built by the community. Every + contribution, no matter how small, helps us build the best + free video editor possible. + </p> + <div className="flex flex-col sm:flex-row gap-4 justify-center mt-6"> + <Link + href="https://github.com/OpenCut-app/OpenCut/blob/main/.github/CONTRIBUTING.md" + target="_blank" + rel="noopener noreferrer" + > + <Badge + variant="outline" + className="text-sm px-4 py-2 hover:bg-muted/50 transition-colors" + > + <GithubIcon className="h-4 w-4 mr-2" /> + Start Contributing + </Badge> + </Link> + <Link + href="https://github.com/OpenCut-app/OpenCut/issues" + target="_blank" + rel="noopener noreferrer" + > + <Badge + variant="outline" + className="text-sm px-4 py-2 hover:bg-muted/50 transition-colors" + > + Report Issues + </Badge> + </Link> + </div> + </div> + </div> + </div> + </div> + </main> + <Footer /> + </div> + ); +} diff --git a/apps/web/src/app/robots.ts b/apps/web/src/app/robots.ts new file mode 100644 index 00000000..ad6c31c8 --- /dev/null +++ b/apps/web/src/app/robots.ts @@ -0,0 +1,13 @@ +import type { MetadataRoute } from "next"; +import { SITE_URL } from "@/constants/site"; + +export default function robots(): MetadataRoute.Robots { + return { + rules: { + userAgent: "*", + allow: "/", + disallow: ["/_next/", "/projects/", "/editor/"], + }, + sitemap: `${SITE_URL}/sitemap.xml`, + }; +} diff --git a/apps/web/src/app/rss.xml/route.ts b/apps/web/src/app/rss.xml/route.ts new file mode 100644 index 00000000..ab645655 --- /dev/null +++ b/apps/web/src/app/rss.xml/route.ts @@ -0,0 +1,46 @@ +import { Feed } from "feed"; +import { getPosts } from "@/lib/blog-query"; +import { SITE_INFO, SITE_URL } from "@/constants/site"; + +export async function GET() { + try { + const { posts } = await getPosts(); + + const feed = new Feed({ + title: `${SITE_INFO.title} Blog`, + description: SITE_INFO.description, + id: `${SITE_URL}`, + link: `${SITE_URL}/blog/`, + language: "en", + image: `${SITE_INFO.openGraphImage}`, + favicon: `${SITE_INFO.favicon}`, + copyright: `All rights reserved ${new Date().getFullYear()}, ${ + SITE_INFO.title + }`, + }); + + for (const post of posts) { + feed.addItem({ + title: post.title, + id: `${SITE_URL}/blog/${post.slug}`, + link: `${SITE_URL}/blog/${post.slug}`, + description: post.description, + author: post.authors.map((author) => ({ + name: author.name, + })), + date: new Date(post.publishedAt), + image: post.coverImage || SITE_INFO.openGraphImage, + }); + } + + return new Response(feed.rss2(), { + headers: { + "Content-Type": "text/xml", + "Cache-Control": "public, max-age=86400, stale-while-revalidate", + }, + }); + } catch (error) { + console.error("Error generating RSS feed", error); + return new Response("Internal Server Error", { status: 500 }); + } +} diff --git a/apps/web/src/app/sitemap.ts b/apps/web/src/app/sitemap.ts new file mode 100644 index 00000000..81a5ebf4 --- /dev/null +++ b/apps/web/src/app/sitemap.ts @@ -0,0 +1,61 @@ +import { SITE_URL } from "@/constants/site"; +import { getPosts } from "@/lib/blog-query"; +import type { MetadataRoute } from "next"; + +export default async function sitemap(): Promise<MetadataRoute.Sitemap> { + const data = await getPosts(); + + const postPages: MetadataRoute.Sitemap = + data?.posts?.map((post) => ({ + url: `${SITE_URL}/blog/${post.slug}`, + lastModified: new Date(post.publishedAt), + changeFrequency: "weekly", + priority: 0.8, + })) ?? []; + + return [ + { + url: SITE_URL, + lastModified: new Date(), + changeFrequency: "weekly", + priority: 1, + }, + { + url: `${SITE_URL}/contributors`, + lastModified: new Date(), + changeFrequency: "daily", + priority: 0.5, + }, + { + url: `${SITE_URL}/roadmap`, + lastModified: new Date(), + changeFrequency: "weekly", + priority: 1, + }, + { + url: `${SITE_URL}/privacy`, + lastModified: new Date(), + changeFrequency: "monthly", + priority: 0.5, + }, + { + url: `${SITE_URL}/terms`, + lastModified: new Date(), + changeFrequency: "monthly", + priority: 0.5, + }, + { + url: `${SITE_URL}/why-not-capcut`, + lastModified: new Date(), + changeFrequency: "yearly", + priority: 1, + }, + { + url: `${SITE_URL}/blog`, + lastModified: new Date(), + changeFrequency: "weekly", + priority: 1, + }, + ...postPages, + ]; +} diff --git a/apps/web/src/app/terms/page.tsx b/apps/web/src/app/terms/page.tsx index c56e8fc1..7d1fda7f 100644 --- a/apps/web/src/app/terms/page.tsx +++ b/apps/web/src/app/terms/page.tsx @@ -1,317 +1,317 @@ -import { Metadata } from "next";
-import { Card, CardContent } from "@/components/ui/card";
-import { Badge } from "@/components/ui/badge";
-import { GithubIcon } from "@/components/icons";
-import Link from "next/link";
-import { Footer } from "@/components/footer";
-import { Header } from "@/components/header";
-
-export const metadata: Metadata = {
- title: "Terms of Service - OpenCut",
- description:
- "OpenCut's Terms of Service. Fair, transparent terms for our free and open-source video editor.",
- openGraph: {
- title: "Terms of Service - OpenCut",
- description:
- "OpenCut's Terms of Service. Fair, transparent terms for our free and open-source video editor.",
- type: "website",
- },
-};
-
-export default function TermsPage() {
- return (
- <div className="min-h-screen bg-background">
- <Header />
- <main className="relative">
- <div className="absolute inset-0 overflow-hidden pointer-events-none">
- <div className="absolute -top-40 -right-40 w-96 h-96 bg-gradient-to-br from-muted/20 to-transparent rounded-full blur-3xl" />
- <div className="absolute top-1/2 -left-40 w-80 h-80 bg-gradient-to-tr from-muted/10 to-transparent rounded-full blur-3xl" />
- </div>
- <div className="relative container mx-auto px-4 py-16">
- <div className="max-w-4xl mx-auto">
- <div className="text-center mb-10">
- <Link
- href="https://github.com/OpenCut-app/OpenCut"
- target="_blank"
- >
- <Badge variant="secondary" className="gap-2 mb-6">
- <GithubIcon className="h-3 w-3" />
- Open Source
- </Badge>
- </Link>
- <h1 className="text-5xl md:text-6xl font-bold tracking-tight mb-6">
- Terms of Service
- </h1>
- <p className="text-xl text-muted-foreground mb-8 max-w-2xl mx-auto leading-relaxed">
- Fair and transparent terms for our free, open-source video
- editor.
- </p>
- </div>
- <Card className="bg-background/80 backdrop-blur-sm border-2 border-muted/30">
- <CardContent className="p-8 text-base leading-relaxed space-y-8">
- <section>
- <h2 className="text-2xl font-semibold mb-4">
- Welcome to OpenCut
- </h2>
- <p className="mb-4">
- OpenCut is a free, open-source video editor that runs in
- your browser. By using our service, you agree to these
- terms. We've designed these terms to be fair and protect
- both you and our project.
- </p>
- <p>
- <strong>Key principle:</strong> Your content stays on your
- device. We never claim ownership of your videos or projects.
- </p>
- </section>
-
- <section>
- <h2 className="text-2xl font-semibold mb-4">
- Your Content, Your Rights
- </h2>
- <p className="mb-4">
- <strong>You own everything you create.</strong> OpenCut
- processes your videos locally on your device, so we never
- have access to your content. We make no claims to ownership,
- licensing, or rights over your videos, projects, or any
- content you create using OpenCut.
- </p>
- <ul className="list-disc pl-6 mb-4 space-y-2">
- <li>
- Your videos remain completely private and under your
- control
- </li>
- <li>
- You retain all intellectual property rights to your
- content
- </li>
- <li>
- You can export and use your content however you choose
- </li>
- <li>
- No watermarks, no licensing restrictions from OpenCut
- </li>
- </ul>
- </section>
-
- <section>
- <h2 className="text-2xl font-semibold mb-4">
- How You Can Use OpenCut
- </h2>
- <p className="mb-4">
- OpenCut is free for personal and commercial use. You can:
- </p>
- <ul className="list-disc pl-6 mb-4 space-y-2">
- <li>
- Create videos for personal, educational, or commercial
- purposes
- </li>
- <li>Use OpenCut for client work and paid projects</li>
- <li>Share and distribute videos created with OpenCut</li>
- <li>
- Modify and distribute the OpenCut software (under MIT
- license)
- </li>
- </ul>
- <p>
- <strong>What we ask:</strong> Don't use OpenCut for illegal
- activities, harassment, or creating harmful content. Be
- respectful of others and follow applicable laws.
- </p>
- </section>
-
- <section>
- <h2 className="text-2xl font-semibold mb-4">
- Account and Service
- </h2>
- <p className="mb-4">
- To use certain features, you may create an account:
- </p>
- <ul className="list-disc pl-6 mb-4 space-y-2">
- <li>Provide accurate information when signing up</li>
- <li>
- Keep your account secure and don't share credentials
- </li>
- <li>You're responsible for activity under your account</li>
- <li>You can delete your account at any time</li>
- </ul>
- <p>
- OpenCut is provided "as is" without warranties. While we
- strive for reliability, we can't guarantee uninterrupted
- service.
- </p>
- </section>
-
- <section>
- <h2 className="text-2xl font-semibold mb-4">
- Open Source Benefits
- </h2>
- <p className="mb-4">
- Because OpenCut is open source, you have additional rights:
- </p>
- <ul className="list-disc pl-6 mb-4 space-y-2">
- <li>
- Review our code to see exactly how we handle your data
- </li>
- <li>Self-host OpenCut on your own servers</li>
- <li>Modify the software to suit your needs</li>
- <li>Contribute improvements back to the community</li>
- </ul>
- <p>
- View our source code and license on{" "}
- <a
- href="https://github.com/OpenCut-app/OpenCut"
- target="_blank"
- rel="noopener"
- className="text-primary hover:underline"
- >
- GitHub
- </a>
- .
- </p>
- </section>
-
- <section>
- <h2 className="text-2xl font-semibold mb-4">
- Third-Party Content
- </h2>
- <p className="mb-4">
- When using OpenCut, make sure you have the right to use any
- content you import:
- </p>
- <ul className="list-disc pl-6 mb-4 space-y-2">
- <li>
- Only upload content you own or have permission to use
- </li>
- <li>
- Respect copyright, trademarks, and other intellectual
- property
- </li>
- <li>
- Don't use copyrighted music, images, or videos without
- permission
- </li>
- <li>
- You're responsible for any claims related to your content
- </li>
- </ul>
- </section>
-
- <section>
- <h2 className="text-2xl font-semibold mb-4">
- Limitations and Liability
- </h2>
- <p className="mb-4">
- OpenCut is provided free of charge. To the extent permitted
- by law:
- </p>
- <ul className="list-disc pl-6 mb-4 space-y-2">
- <li>We're not liable for any loss of data or content</li>
- <li>
- Projects are stored in your browser and may be lost if you
- clear browser data
- </li>
- <li>We're not responsible for how you use the service</li>
- <li>
- Our liability is limited to the maximum extent allowed by
- law
- </li>
- </ul>
- <p>
- Since your content stays on your device, we have no way to
- recover lost projects. Consider exporting important videos
- when finished editing.
- </p>
- </section>
-
- <section>
- <h2 className="text-2xl font-semibold mb-4">
- Service Changes
- </h2>
- <p className="mb-4">We may update OpenCut and these terms:</p>
- <ul className="list-disc pl-6 mb-4 space-y-2">
- <li>
- We'll notify you of significant changes to these terms
- </li>
- <li>Continued use means you accept any updates</li>
- <li>
- You can always self-host an older version if you prefer
- </li>
- <li>
- Major changes will be discussed with the community on
- GitHub
- </li>
- </ul>
- </section>
-
- <section>
- <h2 className="text-2xl font-semibold mb-4">Termination</h2>
- <p className="mb-4">
- You can stop using OpenCut at any time:
- </p>
- <ul className="list-disc pl-6 mb-4 space-y-2">
- <li>Delete your account through your profile settings</li>
- <li>Clear your browser data to remove local projects</li>
- <li>
- Your content remains yours even if you stop using OpenCut
- </li>
- <li>
- We may suspend accounts for violations of these terms
- </li>
- </ul>
- </section>
-
- <section>
- <h2 className="text-2xl font-semibold mb-4">
- Contact and Disputes
- </h2>
- <p className="mb-4">
- Questions about these terms or need to report an issue?
- </p>
- <p className="mb-4">
- Contact us through our{" "}
- <a
- href="https://github.com/OpenCut-app/OpenCut/issues"
- target="_blank"
- rel="noopener"
- className="text-primary hover:underline"
- >
- GitHub repository
- </a>
- , email us at{" "}
- <a
- href="mailto:oss@opencut.app"
- className="text-primary hover:underline"
- >
- oss@opencut.app
- </a>
- , or reach out on{" "}
- <a
- href="https://x.com/opencutapp"
- target="_blank"
- rel="noopener"
- className="text-primary hover:underline"
- >
- X (Twitter)
- </a>
- .
- </p>
- <p>
- These terms are governed by applicable law in your
- jurisdiction. We prefer to resolve disputes through friendly
- discussion in our open-source community.
- </p>
- </section>
-
- <p className="text-sm text-muted-foreground mt-8 pt-8 border-t border-muted/20">
- Last updated: July 14, 2025
- </p>
- </CardContent>
- </Card>
- </div>
- </div>
- </main>
- <Footer />
- </div>
- );
-}
+import { Metadata } from "next"; +import { Card, CardContent } from "@/components/ui/card"; +import { Badge } from "@/components/ui/badge"; +import { GithubIcon } from "@/components/icons"; +import Link from "next/link"; +import { Footer } from "@/components/footer"; +import { Header } from "@/components/header"; + +export const metadata: Metadata = { + title: "Terms of Service - OpenCut", + description: + "OpenCut's Terms of Service. Fair, transparent terms for our free and open-source video editor.", + openGraph: { + title: "Terms of Service - OpenCut", + description: + "OpenCut's Terms of Service. Fair, transparent terms for our free and open-source video editor.", + type: "website", + }, +}; + +export default function TermsPage() { + return ( + <div className="min-h-screen bg-background"> + <Header /> + <main className="relative"> + <div className="absolute inset-0 overflow-hidden pointer-events-none"> + <div className="absolute -top-40 -right-40 w-96 h-96 bg-gradient-to-br from-muted/20 to-transparent rounded-full blur-3xl" /> + <div className="absolute top-1/2 -left-40 w-80 h-80 bg-gradient-to-tr from-muted/10 to-transparent rounded-full blur-3xl" /> + </div> + <div className="relative container mx-auto px-4 py-16"> + <div className="max-w-4xl mx-auto"> + <div className="text-center mb-10"> + <Link + href="https://github.com/OpenCut-app/OpenCut" + target="_blank" + > + <Badge variant="secondary" className="gap-2 mb-6"> + <GithubIcon className="h-3 w-3" /> + Open Source + </Badge> + </Link> + <h1 className="text-5xl md:text-6xl font-bold tracking-tight mb-6"> + Terms of Service + </h1> + <p className="text-xl text-muted-foreground mb-8 max-w-2xl mx-auto leading-relaxed"> + Fair and transparent terms for our free, open-source video + editor. + </p> + </div> + <Card className="bg-background/80 backdrop-blur-sm border-2 border-muted/30"> + <CardContent className="p-8 text-base leading-relaxed space-y-8"> + <section> + <h2 className="text-2xl font-semibold mb-4"> + Welcome to OpenCut + </h2> + <p className="mb-4"> + OpenCut is a free, open-source video editor that runs in + your browser. By using our service, you agree to these + terms. We've designed these terms to be fair and protect + both you and our project. + </p> + <p> + <strong>Key principle:</strong> Your content stays on your + device. We never claim ownership of your videos or projects. + </p> + </section> + + <section> + <h2 className="text-2xl font-semibold mb-4"> + Your Content, Your Rights + </h2> + <p className="mb-4"> + <strong>You own everything you create.</strong> OpenCut + processes your videos locally on your device, so we never + have access to your content. We make no claims to ownership, + licensing, or rights over your videos, projects, or any + content you create using OpenCut. + </p> + <ul className="list-disc pl-6 mb-4 space-y-2"> + <li> + Your videos remain completely private and under your + control + </li> + <li> + You retain all intellectual property rights to your + content + </li> + <li> + You can export and use your content however you choose + </li> + <li> + No watermarks, no licensing restrictions from OpenCut + </li> + </ul> + </section> + + <section> + <h2 className="text-2xl font-semibold mb-4"> + How You Can Use OpenCut + </h2> + <p className="mb-4"> + OpenCut is free for personal and commercial use. You can: + </p> + <ul className="list-disc pl-6 mb-4 space-y-2"> + <li> + Create videos for personal, educational, or commercial + purposes + </li> + <li>Use OpenCut for client work and paid projects</li> + <li>Share and distribute videos created with OpenCut</li> + <li> + Modify and distribute the OpenCut software (under MIT + license) + </li> + </ul> + <p> + <strong>What we ask:</strong> Don't use OpenCut for illegal + activities, harassment, or creating harmful content. Be + respectful of others and follow applicable laws. + </p> + </section> + + <section> + <h2 className="text-2xl font-semibold mb-4"> + Account and Service + </h2> + <p className="mb-4"> + To use certain features, you may create an account: + </p> + <ul className="list-disc pl-6 mb-4 space-y-2"> + <li>Provide accurate information when signing up</li> + <li> + Keep your account secure and don't share credentials + </li> + <li>You're responsible for activity under your account</li> + <li>You can delete your account at any time</li> + </ul> + <p> + OpenCut is provided "as is" without warranties. While we + strive for reliability, we can't guarantee uninterrupted + service. + </p> + </section> + + <section> + <h2 className="text-2xl font-semibold mb-4"> + Open Source Benefits + </h2> + <p className="mb-4"> + Because OpenCut is open source, you have additional rights: + </p> + <ul className="list-disc pl-6 mb-4 space-y-2"> + <li> + Review our code to see exactly how we handle your data + </li> + <li>Self-host OpenCut on your own servers</li> + <li>Modify the software to suit your needs</li> + <li>Contribute improvements back to the community</li> + </ul> + <p> + View our source code and license on{" "} + <a + href="https://github.com/OpenCut-app/OpenCut" + target="_blank" + rel="noopener" + className="text-primary hover:underline" + > + GitHub + </a> + . + </p> + </section> + + <section> + <h2 className="text-2xl font-semibold mb-4"> + Third-Party Content + </h2> + <p className="mb-4"> + When using OpenCut, make sure you have the right to use any + content you import: + </p> + <ul className="list-disc pl-6 mb-4 space-y-2"> + <li> + Only upload content you own or have permission to use + </li> + <li> + Respect copyright, trademarks, and other intellectual + property + </li> + <li> + Don't use copyrighted music, images, or videos without + permission + </li> + <li> + You're responsible for any claims related to your content + </li> + </ul> + </section> + + <section> + <h2 className="text-2xl font-semibold mb-4"> + Limitations and Liability + </h2> + <p className="mb-4"> + OpenCut is provided free of charge. To the extent permitted + by law: + </p> + <ul className="list-disc pl-6 mb-4 space-y-2"> + <li>We're not liable for any loss of data or content</li> + <li> + Projects are stored in your browser and may be lost if you + clear browser data + </li> + <li>We're not responsible for how you use the service</li> + <li> + Our liability is limited to the maximum extent allowed by + law + </li> + </ul> + <p> + Since your content stays on your device, we have no way to + recover lost projects. Consider exporting important videos + when finished editing. + </p> + </section> + + <section> + <h2 className="text-2xl font-semibold mb-4"> + Service Changes + </h2> + <p className="mb-4">We may update OpenCut and these terms:</p> + <ul className="list-disc pl-6 mb-4 space-y-2"> + <li> + We'll notify you of significant changes to these terms + </li> + <li>Continued use means you accept any updates</li> + <li> + You can always self-host an older version if you prefer + </li> + <li> + Major changes will be discussed with the community on + GitHub + </li> + </ul> + </section> + + <section> + <h2 className="text-2xl font-semibold mb-4">Termination</h2> + <p className="mb-4"> + You can stop using OpenCut at any time: + </p> + <ul className="list-disc pl-6 mb-4 space-y-2"> + <li>Delete your account through your profile settings</li> + <li>Clear your browser data to remove local projects</li> + <li> + Your content remains yours even if you stop using OpenCut + </li> + <li> + We may suspend accounts for violations of these terms + </li> + </ul> + </section> + + <section> + <h2 className="text-2xl font-semibold mb-4"> + Contact and Disputes + </h2> + <p className="mb-4"> + Questions about these terms or need to report an issue? + </p> + <p className="mb-4"> + Contact us through our{" "} + <a + href="https://github.com/OpenCut-app/OpenCut/issues" + target="_blank" + rel="noopener" + className="text-primary hover:underline" + > + GitHub repository + </a> + , email us at{" "} + <a + href="mailto:oss@opencut.app" + className="text-primary hover:underline" + > + oss@opencut.app + </a> + , or reach out on{" "} + <a + href="https://x.com/opencutapp" + target="_blank" + rel="noopener" + className="text-primary hover:underline" + > + X (Twitter) + </a> + . + </p> + <p> + These terms are governed by applicable law in your + jurisdiction. We prefer to resolve disputes through friendly + discussion in our open-source community. + </p> + </section> + + <p className="text-sm text-muted-foreground mt-8 pt-8 border-t border-muted/20"> + Last updated: July 14, 2025 + </p> + </CardContent> + </Card> + </div> + </div> + </main> + <Footer /> + </div> + ); +} diff --git a/apps/web/src/app/why-not-capcut/page.tsx b/apps/web/src/app/why-not-capcut/page.tsx index 56b3d27a..7fe6df66 100644 --- a/apps/web/src/app/why-not-capcut/page.tsx +++ b/apps/web/src/app/why-not-capcut/page.tsx @@ -1,191 +1,191 @@ -import { Header } from "@/components/header";
-
-export default function WhyNotCapcut() {
- return (
- <div className="min-h-screen bg-background px-5">
- <Header />
-
- <main className="relative mt-12">
- <div className="absolute inset-0 overflow-hidden pointer-events-none">
- <div className="absolute -top-40 -right-40 w-96 h-96 bg-gradient-to-br from-muted/20 to-transparent rounded-full blur-3xl" />
- <div className="absolute top-1/2 -left-40 w-80 h-80 bg-gradient-to-tr from-muted/10 to-transparent rounded-full blur-3xl" />
- </div>
-
- <div className="relative container mx-auto px-4 py-16">
- <div className="max-w-6xl mx-auto">
- <div className="text-center mb-20">
- <h1 className="text-5xl md:text-6xl font-bold tracking-tight mb-6">
- Fuck CapCut
- </h1>
- <p className="text-xl text-muted-foreground mb-8 max-w-2xl mx-auto leading-relaxed">
- Roasting time, so get ready motherfucker.
- </p>
- </div>
-
- <div className="max-w-4xl mx-auto space-y-12">
- <div>
- <h2 className="text-3xl font-bold mb-6">
- Seriously, what the fuck else do you want?
- </h2>
- <p className="text-lg mb-6">
- You probably use CapCut and think your video editing is
- special. You think your fucking TikTok with 47 transitions and
- 12 different fonts is going to get you some viral fame. You
- think loading up every goddamn effect in their library makes
- your content better. Wrong, motherfucker. Let me describe what
- CapCut actually gives you:
- </p>
- <ul className="text-lg space-y-2 mb-6 list-disc list-inside">
- <li>A paywall every time you breathe</li>
- <li>Terms of service that steal your shit</li>
- <li>
- More "Get Pro" dialogs than a Windows 95 error message
- </li>
- <li>
- Features that disappear behind paywalls while you're fucking
- using them
- </li>
- <li>Bugs disguised as "premium features"</li>
- </ul>
- <p className="text-lg mb-6">
- <strong>Well guess what, motherfucker:</strong>
- </p>
- <p className="text-lg mb-6">
- You. Are. Getting. Scammed. Look at this shit. It's a fucking
- video editor. Why the fuck do you need to pay $20/month just
- to remove a goddamn watermark? You spent hours editing your
- video and they slap their logo on it like they fucking made
- it.
- </p>
- </div>
-
- <div>
- <h2 className="text-3xl font-bold mb-6">
- The "Get Pro" dialog is everywhere
- </h2>
- <p className="text-lg mb-6">
- This motherfucking dialog pops up more than ads on a pirated
- movie site. Want to add a transition? Get Pro. Want to export
- without their watermark? Get Pro. Want to use more than 2
- fonts? Get fucking Pro, peasant.
- </p>
- <p className="text-lg mb-6">
- Did you seriously think you could edit a video without seeing
- this dialog 47 times? You click one button and BAM - there it
- is again, asking for your credit card like a desperate ex
- asking for money.
- </p>
- </div>
-
- <div>
- <h2 className="text-3xl font-bold mb-6">
- Everything costs money now
- </h2>
- <p className="text-lg mb-6">
- You dumbass. You thought CapCut was free, but no. Free means
- they let you open the app. Everything else costs money. Basic
- shake effect? That'll be $20/month. A decent transition that isn't
- "fade"? Pay up, motherfucker.
- </p>
- <p className="text-lg mb-6">
- Here's my favorite piece of bullshit: You import an MP3 file -
- you know, AUDIO - and try to export. "Sorry, can't export
- because you're using our premium extract audio feature!"
- </p>
- <p className="text-lg mb-6">
- <strong>
- My MP3 was already fucking audio, you absolute morons.
- </strong>
- </p>
- <p className="text-lg mb-6">
- But wait, there's more! If you drag that same MP3 to their
- media panel first, then to the timeline, it magically works.
- This isn't a bug, it's a fucking scam disguised as software
- engineering.
- </p>
- </div>
-
- <div>
- <h2 className="text-3xl font-bold mb-6">
- Their Terms of Service are insane
- </h2>
- <p className="text-lg mb-6">
- Look at this shit. You upload your content and they basically
- say "thanks for the free content, we own it now, but if Disney
- sues anyone, that's your problem."
- </p>
- <p className="text-lg mb-6">
- <strong>CapCut's Terms of Service:</strong> We get full rights
- to use, modify, distribute, and monetize everything you upload
- - permanently and without paying you shit. But you're still
- responsible if anything goes wrong.
- </p>
- <p className="text-lg mb-6">
- Translation: "We'll make money off your viral video, you
- handle the lawsuits." Brilliant legal strategy, you fucks.
- </p>
- </div>
-
- <div>
- <h2 className="text-3xl font-bold mb-6">
- The editor is actually good
- </h2>
- <p className="text-lg mb-6">
- Here's the thing that makes me want to punch my monitor: the
- actual video editor is fucking good. It's intuitive, powerful,
- and anyone can figure it out. When it's not begging for money
- every 30 seconds, it actually works well.
- </p>
- <p className="text-lg mb-6">
- Which makes everything else so much worse. They built
- something people want to use, then turned it into a digital
- slot machine. Every click might trigger a payment request.
- </p>
- </div>
-
- <div>
- <h2 className="text-3xl font-bold mb-6">
- This is a video editor. Look at it. You've never seen one
- before.
- </h2>
- <p className="text-lg mb-6">
- Like the person who's never used software that doesn't
- constantly beg for money, you have no fucking idea what a
- video editor should be. All you've ever seen are predatory
- apps disguised as creative tools.
- </p>
- <p className="text-lg mb-6">
- A real video editor lets you edit videos. It doesn't steal
- your content. It doesn't pop up payment dialogs every 5
- seconds. It doesn't charge you separately for basic features
- that should be free.
- </p>
- </div>
-
- <div>
- <h2 className="text-3xl font-bold mb-6">
- Yes, this is fucking satire, you fuck
- </h2>
- <p className="text-lg mb-6">
- I'm not actually saying all video editors should be basic as
- shit. What I'm saying is that all the problems we have with
- video editing apps are{" "}
- <strong>ones they create themselves</strong>. Video editors
- aren't broken by default - they edit videos, export them, and
- let you use basic features without constantly begging for
- money. CapCut breaks them. They turn them into payment
- processors with video editing as a side feature.
- </p>
- <p className="text-lg">
- <em>"Good software gets out of your way."</em>
- <br />- Some smart motherfucker who definitely wasn't working
- at CapCut
- </p>
- </div>
- </div>
- </div>
- </div>
- </main>
- </div>
- );
-}
+import { Header } from "@/components/header"; + +export default function WhyNotCapcut() { + return ( + <div className="min-h-screen bg-background px-5"> + <Header /> + + <main className="relative mt-12"> + <div className="absolute inset-0 overflow-hidden pointer-events-none"> + <div className="absolute -top-40 -right-40 w-96 h-96 bg-gradient-to-br from-muted/20 to-transparent rounded-full blur-3xl" /> + <div className="absolute top-1/2 -left-40 w-80 h-80 bg-gradient-to-tr from-muted/10 to-transparent rounded-full blur-3xl" /> + </div> + + <div className="relative container mx-auto px-4 py-16"> + <div className="max-w-6xl mx-auto"> + <div className="text-center mb-20"> + <h1 className="text-5xl md:text-6xl font-bold tracking-tight mb-6"> + Fuck CapCut + </h1> + <p className="text-xl text-muted-foreground mb-8 max-w-2xl mx-auto leading-relaxed"> + Roasting time, so get ready motherfucker. + </p> + </div> + + <div className="max-w-4xl mx-auto space-y-12"> + <div> + <h2 className="text-3xl font-bold mb-6"> + Seriously, what the fuck else do you want? + </h2> + <p className="text-lg mb-6"> + You probably use CapCut and think your video editing is + special. You think your fucking TikTok with 47 transitions and + 12 different fonts is going to get you some viral fame. You + think loading up every goddamn effect in their library makes + your content better. Wrong, motherfucker. Let me describe what + CapCut actually gives you: + </p> + <ul className="text-lg space-y-2 mb-6 list-disc list-inside"> + <li>A paywall every time you breathe</li> + <li>Terms of service that steal your shit</li> + <li> + More "Get Pro" dialogs than a Windows 95 error message + </li> + <li> + Features that disappear behind paywalls while you're fucking + using them + </li> + <li>Bugs disguised as "premium features"</li> + </ul> + <p className="text-lg mb-6"> + <strong>Well guess what, motherfucker:</strong> + </p> + <p className="text-lg mb-6"> + You. Are. Getting. Scammed. Look at this shit. It's a fucking + video editor. Why the fuck do you need to pay $20/month just + to remove a goddamn watermark? You spent hours editing your + video and they slap their logo on it like they fucking made + it. + </p> + </div> + + <div> + <h2 className="text-3xl font-bold mb-6"> + The "Get Pro" dialog is everywhere + </h2> + <p className="text-lg mb-6"> + This motherfucking dialog pops up more than ads on a pirated + movie site. Want to add a transition? Get Pro. Want to export + without their watermark? Get Pro. Want to use more than 2 + fonts? Get fucking Pro, peasant. + </p> + <p className="text-lg mb-6"> + Did you seriously think you could edit a video without seeing + this dialog 47 times? You click one button and BAM - there it + is again, asking for your credit card like a desperate ex + asking for money. + </p> + </div> + + <div> + <h2 className="text-3xl font-bold mb-6"> + Everything costs money now + </h2> + <p className="text-lg mb-6"> + You dumbass. You thought CapCut was free, but no. Free means + they let you open the app. Everything else costs money. Basic + shake effect? That'll be $20/month. A decent transition that + isn't "fade"? Pay up, motherfucker. + </p> + <p className="text-lg mb-6"> + Here's my favorite piece of bullshit: You import an MP3 file - + you know, AUDIO - and try to export. "Sorry, can't export + because you're using our premium extract audio feature!" + </p> + <p className="text-lg mb-6"> + <strong> + My MP3 was already fucking audio, you absolute morons. + </strong> + </p> + <p className="text-lg mb-6"> + But wait, there's more! If you drag that same MP3 to their + media panel first, then to the timeline, it magically works. + This isn't a bug, it's a fucking scam disguised as software + engineering. + </p> + </div> + + <div> + <h2 className="text-3xl font-bold mb-6"> + Their Terms of Service are insane + </h2> + <p className="text-lg mb-6"> + Look at this shit. You upload your content and they basically + say "thanks for the free content, we own it now, but if Disney + sues anyone, that's your problem." + </p> + <p className="text-lg mb-6"> + <strong>CapCut's Terms of Service:</strong> We get full rights + to use, modify, distribute, and monetize everything you upload + - permanently and without paying you shit. But you're still + responsible if anything goes wrong. + </p> + <p className="text-lg mb-6"> + Translation: "We'll make money off your viral video, you + handle the lawsuits." Brilliant legal strategy, you fucks. + </p> + </div> + + <div> + <h2 className="text-3xl font-bold mb-6"> + The editor is actually good + </h2> + <p className="text-lg mb-6"> + Here's the thing that makes me want to punch my monitor: the + actual video editor is fucking good. It's intuitive, powerful, + and anyone can figure it out. When it's not begging for money + every 30 seconds, it actually works well. + </p> + <p className="text-lg mb-6"> + Which makes everything else so much worse. They built + something people want to use, then turned it into a digital + slot machine. Every click might trigger a payment request. + </p> + </div> + + <div> + <h2 className="text-3xl font-bold mb-6"> + This is a video editor. Look at it. You've never seen one + before. + </h2> + <p className="text-lg mb-6"> + Like the person who's never used software that doesn't + constantly beg for money, you have no fucking idea what a + video editor should be. All you've ever seen are predatory + apps disguised as creative tools. + </p> + <p className="text-lg mb-6"> + A real video editor lets you edit videos. It doesn't steal + your content. It doesn't pop up payment dialogs every 5 + seconds. It doesn't charge you separately for basic features + that should be free. + </p> + </div> + + <div> + <h2 className="text-3xl font-bold mb-6"> + Yes, this is fucking satire, you fuck + </h2> + <p className="text-lg mb-6"> + I'm not actually saying all video editors should be basic as + shit. What I'm saying is that all the problems we have with + video editing apps are{" "} + <strong>ones they create themselves</strong>. Video editors + aren't broken by default - they edit videos, export them, and + let you use basic features without constantly begging for + money. CapCut breaks them. They turn them into payment + processors with video editing as a side feature. + </p> + <p className="text-lg"> + <em>"Good software gets out of your way."</em> + <br />- Some smart motherfucker who definitely wasn't working + at CapCut + </p> + </div> + </div> + </div> + </div> + </main> + </div> + ); +} diff --git a/apps/web/src/components/background-settings.tsx b/apps/web/src/components/background-settings.tsx index 721564ea..a640dc4c 100644 --- a/apps/web/src/components/background-settings.tsx +++ b/apps/web/src/components/background-settings.tsx @@ -1,184 +1,184 @@ -import { Popover, PopoverContent, PopoverTrigger } from "./ui/popover";
-import { Button } from "./ui/button";
-import { BackgroundIcon } from "./icons";
-import { cn } from "@/lib/utils";
-import Image from "next/image";
-import { colors } from "@/data/colors";
-import { useProjectStore } from "@/stores/project-store";
-import { PipetteIcon } from "lucide-react";
-
-type BackgroundTab = "color" | "blur";
-
-export function BackgroundSettings() {
- const { activeProject, updateBackgroundType } = useProjectStore();
-
- // ✅ Good: derive activeTab from activeProject during rendering
- const activeTab = activeProject?.backgroundType || "color";
-
- const handleColorSelect = (color: string) => {
- updateBackgroundType("color", { backgroundColor: color });
- };
-
- const handleBlurSelect = (blurIntensity: number) => {
- updateBackgroundType("blur", { blurIntensity });
- };
-
- const tabs = [
- {
- label: "Color",
- value: "color",
- },
- {
- label: "Blur",
- value: "blur",
- },
- ];
-
- return (
- <Popover>
- <PopoverTrigger asChild>
- <Button
- variant="text"
- size="icon"
- className="!size-4 border border-muted-foreground"
- >
- <BackgroundIcon className="!size-3" />
- </Button>
- </PopoverTrigger>
- <PopoverContent className="flex flex-col items-start w-[20rem] h-[16rem] overflow-hidden p-0">
- <div className="flex items-center justify-between w-full gap-2 z-10 bg-popover p-3">
- <h2 className="text-sm">Background</h2>
- <div className="flex items-center gap-2 text-sm">
- {tabs.map((tab) => (
- <span
- key={tab.value}
- onClick={() => {
- // Switch to the background type when clicking tabs
- if (tab.value === "color") {
- updateBackgroundType("color", {
- backgroundColor:
- activeProject?.backgroundColor || "#000000",
- });
- } else {
- updateBackgroundType("blur", {
- blurIntensity: activeProject?.blurIntensity || 8,
- });
- }
- }}
- className={cn(
- "text-muted-foreground cursor-pointer",
- activeTab === tab.value && "text-foreground"
- )}
- >
- {tab.label}
- </span>
- ))}
- </div>
- </div>
- {activeTab === "color" ? (
- <ColorView
- selectedColor={activeProject?.backgroundColor || "#000000"}
- onColorSelect={handleColorSelect}
- />
- ) : (
- <BlurView
- selectedBlur={activeProject?.blurIntensity || 8}
- onBlurSelect={handleBlurSelect}
- />
- )}
- </PopoverContent>
- </Popover>
- );
-}
-
-function ColorView({
- selectedColor,
- onColorSelect,
-}: {
- selectedColor: string;
- onColorSelect: (color: string) => void;
-}) {
- return (
- <div className="w-full h-full">
- <div className="absolute top-8 left-0 w-[calc(100%-1rem)] h-12 bg-gradient-to-b from-popover to-transparent pointer-events-none"></div>
- <div className="grid grid-cols-4 gap-2 w-full h-full p-3 pt-0 overflow-auto">
- <div className="w-full aspect-square rounded-sm cursor-pointer border border-foreground/15 hover:border-primary flex items-center justify-center">
- <PipetteIcon className="size-4" />
- </div>
- {colors.map((color) => (
- <ColorItem
- key={color}
- color={color}
- isSelected={color === selectedColor}
- onClick={() => onColorSelect(color)}
- />
- ))}
- </div>
- </div>
- );
-}
-
-function ColorItem({
- color,
- isSelected,
- onClick,
-}: {
- color: string;
- isSelected: boolean;
- onClick: () => void;
-}) {
- return (
- <div
- className={cn(
- "w-full aspect-square rounded-sm cursor-pointer hover:border-2 hover:border-primary",
- isSelected && "border-2 border-primary"
- )}
- style={{ backgroundColor: color }}
- onClick={onClick}
- />
- );
-}
-
-function BlurView({
- selectedBlur,
- onBlurSelect,
-}: {
- selectedBlur: number;
- onBlurSelect: (blurIntensity: number) => void;
-}) {
- const blurLevels = [
- { label: "Light", value: 4 },
- { label: "Medium", value: 8 },
- { label: "Heavy", value: 18 },
- ];
- const blurImage =
- "https://images.unsplash.com/photo-1501785888041-af3ef285b470?q=80&w=1470&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D";
-
- return (
- <div className="grid grid-cols-3 gap-2 w-full p-3 pt-0">
- {blurLevels.map((blur) => (
- <div
- key={blur.value}
- className={cn(
- "w-full aspect-square rounded-sm cursor-pointer hover:border-2 hover:border-primary relative overflow-hidden",
- selectedBlur === blur.value && "border-2 border-primary"
- )}
- onClick={() => onBlurSelect(blur.value)}
- >
- <Image
- src={blurImage}
- alt={`Blur preview ${blur.label}`}
- fill
- className="object-cover"
- style={{ filter: `blur(${blur.value}px)` }}
- />
- <div className="absolute bottom-1 left-1 right-1 text-center">
- <span className="text-xs text-white bg-black/50 px-1 rounded">
- {blur.label}
- </span>
- </div>
- </div>
- ))}
- </div>
- );
-}
+import { Popover, PopoverContent, PopoverTrigger } from "./ui/popover"; +import { Button } from "./ui/button"; +import { BackgroundIcon } from "./icons"; +import { cn } from "@/lib/utils"; +import Image from "next/image"; +import { colors } from "@/data/colors"; +import { useProjectStore } from "@/stores/project-store"; +import { PipetteIcon } from "lucide-react"; + +type BackgroundTab = "color" | "blur"; + +export function BackgroundSettings() { + const { activeProject, updateBackgroundType } = useProjectStore(); + + // ✅ Good: derive activeTab from activeProject during rendering + const activeTab = activeProject?.backgroundType || "color"; + + const handleColorSelect = (color: string) => { + updateBackgroundType("color", { backgroundColor: color }); + }; + + const handleBlurSelect = (blurIntensity: number) => { + updateBackgroundType("blur", { blurIntensity }); + }; + + const tabs = [ + { + label: "Color", + value: "color", + }, + { + label: "Blur", + value: "blur", + }, + ]; + + return ( + <Popover> + <PopoverTrigger asChild> + <Button + variant="text" + size="icon" + className="!size-4 border border-muted-foreground" + > + <BackgroundIcon className="!size-3" /> + </Button> + </PopoverTrigger> + <PopoverContent className="flex flex-col items-start w-[20rem] h-[16rem] overflow-hidden p-0"> + <div className="flex items-center justify-between w-full gap-2 z-10 bg-popover p-3"> + <h2 className="text-sm">Background</h2> + <div className="flex items-center gap-2 text-sm"> + {tabs.map((tab) => ( + <span + key={tab.value} + onClick={() => { + // Switch to the background type when clicking tabs + if (tab.value === "color") { + updateBackgroundType("color", { + backgroundColor: + activeProject?.backgroundColor || "#000000", + }); + } else { + updateBackgroundType("blur", { + blurIntensity: activeProject?.blurIntensity || 8, + }); + } + }} + className={cn( + "text-muted-foreground cursor-pointer", + activeTab === tab.value && "text-foreground" + )} + > + {tab.label} + </span> + ))} + </div> + </div> + {activeTab === "color" ? ( + <ColorView + selectedColor={activeProject?.backgroundColor || "#000000"} + onColorSelect={handleColorSelect} + /> + ) : ( + <BlurView + selectedBlur={activeProject?.blurIntensity || 8} + onBlurSelect={handleBlurSelect} + /> + )} + </PopoverContent> + </Popover> + ); +} + +function ColorView({ + selectedColor, + onColorSelect, +}: { + selectedColor: string; + onColorSelect: (color: string) => void; +}) { + return ( + <div className="w-full h-full"> + <div className="absolute top-8 left-0 w-[calc(100%-1rem)] h-12 bg-gradient-to-b from-popover to-transparent pointer-events-none" /> + <div className="grid grid-cols-4 gap-2 w-full h-full p-3 pt-0 overflow-auto"> + <div className="w-full aspect-square rounded-sm cursor-pointer border border-foreground/15 hover:border-primary flex items-center justify-center"> + <PipetteIcon className="size-4" /> + </div> + {colors.map((color) => ( + <ColorItem + key={color} + color={color} + isSelected={color === selectedColor} + onClick={() => onColorSelect(color)} + /> + ))} + </div> + </div> + ); +} + +function ColorItem({ + color, + isSelected, + onClick, +}: { + color: string; + isSelected: boolean; + onClick: () => void; +}) { + return ( + <div + className={cn( + "w-full aspect-square rounded-sm cursor-pointer hover:border-2 hover:border-primary", + isSelected && "border-2 border-primary" + )} + style={{ backgroundColor: color }} + onClick={onClick} + /> + ); +} + +function BlurView({ + selectedBlur, + onBlurSelect, +}: { + selectedBlur: number; + onBlurSelect: (blurIntensity: number) => void; +}) { + const blurLevels = [ + { label: "Light", value: 4 }, + { label: "Medium", value: 8 }, + { label: "Heavy", value: 18 }, + ]; + const blurImage = + "https://images.unsplash.com/photo-1501785888041-af3ef285b470?q=80&w=1470&auto=format&fit=crop&ixlib=rb-4.1.0&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"; + + return ( + <div className="grid grid-cols-3 gap-2 w-full p-3 pt-0"> + {blurLevels.map((blur) => ( + <div + key={blur.value} + className={cn( + "w-full aspect-square rounded-sm cursor-pointer hover:border-2 hover:border-primary relative overflow-hidden", + selectedBlur === blur.value && "border-2 border-primary" + )} + onClick={() => onBlurSelect(blur.value)} + > + <Image + src={blurImage} + alt={`Blur preview ${blur.label}`} + fill + className="object-cover" + style={{ filter: `blur(${blur.value}px)` }} + /> + <div className="absolute bottom-1 left-1 right-1 text-center"> + <span className="text-xs text-white bg-black/50 px-1 rounded"> + {blur.label} + </span> + </div> + </div> + ))} + </div> + ); +} diff --git a/apps/web/src/components/editor-header.tsx b/apps/web/src/components/editor-header.tsx index 4fc7d245..b643abe7 100644 --- a/apps/web/src/components/editor-header.tsx +++ b/apps/web/src/components/editor-header.tsx @@ -1,127 +1,127 @@ -"use client";
-
-import Link from "next/link";
-import { Button } from "./ui/button";
-import { ChevronLeft, Download } from "lucide-react";
-import { useTimelineStore } from "@/stores/timeline-store";
-import { HeaderBase } from "./header-base";
-import { formatTimeCode } from "@/lib/time";
-import { useProjectStore } from "@/stores/project-store";
-import { KeyboardShortcutsHelp } from "./keyboard-shortcuts-help";
-import { useState, useRef } from "react";
-import { Input } from "@/components/ui/input";
-import { toast } from "sonner";
-
-export function EditorHeader() {
- const { getTotalDuration } = useTimelineStore();
- const { activeProject, renameProject } = useProjectStore();
- const [isEditing, setIsEditing] = useState(false);
- const [newName, setNewName] = useState(activeProject?.name || "");
- const inputRef = useRef<HTMLInputElement>(null);
-
- const handleExport = () => {
- // TODO: Implement export functionality
- // NOTE: This is already being worked on
- console.log("Export project");
- toast.warning("Export project is being worked on.");
- };
-
- const handleNameClick = () => {
- if (!activeProject) return;
- setNewName(activeProject.name);
- setIsEditing(true);
- };
-
- const handleNameSave = async () => {
- if (activeProject && newName.trim() && newName !== activeProject.name) {
- try {
- await renameProject(activeProject.id, newName.trim());
- } catch (error) {
- console.error("Failed to rename project:", error);
- setNewName(activeProject.name);
- }
- }
- setIsEditing(false);
- };
-
- const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
- if (e.key === "Enter") handleNameSave();
- else if (e.key === "Escape") setIsEditing(false);
- };
-
- const leftContent = (
- <div className="flex items-center gap-2">
- <Link
- href="/projects"
- className="font-medium tracking-tight flex items-center gap-2 hover:opacity-80 transition-opacity"
- >
- <ChevronLeft className="h-4 w-4" />
- </Link>
- <div className="w-[14rem] h-9 flex items-center">
- {isEditing ? (
- <Input
- ref={inputRef}
- className="text-sm font-medium px-2 py-1 h-9 truncate"
- value={newName}
- onChange={(e) => setNewName(e.target.value)}
- onBlur={handleNameSave}
- onKeyDown={handleInputKeyDown}
- onFocus={(e) => e.target.select()}
- maxLength={64}
- aria-label="Project name"
- autoFocus
- />
- ) : (
- <span
- className="text-sm font-medium cursor-pointer hover:underline"
- title="Click to rename"
- role="button"
- tabIndex={0}
- onClick={handleNameClick}
- onKeyDown={(e) => e.key === "Enter" && handleNameClick()}
- >
- <div className="truncate text-ellipsis overflow-clip w-40">
- {activeProject?.name}
- </div>
- </span>
- )}
- </div>
- </div>
- );
-
- const centerContent = (
- <div className="flex items-center gap-2 text-xs">
- <span>
- {formatTimeCode(
- getTotalDuration(),
- "HH:MM:SS:FF",
- activeProject?.fps || 30
- )}
- </span>
- </div>
- );
-
- const rightContent = (
- <nav className="flex items-center gap-2">
- <KeyboardShortcutsHelp />
- <Button
- size="sm"
- variant="primary"
- className="h-7 text-xs"
- onClick={handleExport}
- >
- <Download className="h-4 w-4" />
- <span className="text-sm">Export</span>
- </Button>
- </nav>
- );
-
- return (
- <HeaderBase
- leftContent={leftContent}
- centerContent={centerContent}
- rightContent={rightContent}
- className="bg-background h-[3.2rem] px-4 items-center"
- />
- );
-}
+"use client"; + +import Link from "next/link"; +import { Button } from "./ui/button"; +import { ChevronLeft, Download } from "lucide-react"; +import { useTimelineStore } from "@/stores/timeline-store"; +import { HeaderBase } from "./header-base"; +import { formatTimeCode } from "@/lib/time"; +import { useProjectStore } from "@/stores/project-store"; +import { KeyboardShortcutsHelp } from "./keyboard-shortcuts-help"; +import { useState, useRef } from "react"; +import { Input } from "@/components/ui/input"; +import { toast } from "sonner"; + +export function EditorHeader() { + const { getTotalDuration } = useTimelineStore(); + const { activeProject, renameProject } = useProjectStore(); + const [isEditing, setIsEditing] = useState(false); + const [newName, setNewName] = useState(activeProject?.name || ""); + const inputRef = useRef<HTMLInputElement>(null); + + const handleExport = () => { + // TODO: Implement export functionality + // NOTE: This is already being worked on + console.log("Export project"); + toast.warning("Export project is being worked on."); + }; + + const handleNameClick = () => { + if (!activeProject) return; + setNewName(activeProject.name); + setIsEditing(true); + }; + + const handleNameSave = async () => { + if (activeProject && newName.trim() && newName !== activeProject.name) { + try { + await renameProject(activeProject.id, newName.trim()); + } catch (error) { + console.error("Failed to rename project:", error); + setNewName(activeProject.name); + } + } + setIsEditing(false); + }; + + const handleInputKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => { + if (e.key === "Enter") handleNameSave(); + else if (e.key === "Escape") setIsEditing(false); + }; + + const leftContent = ( + <div className="flex items-center gap-2"> + <Link + href="/projects" + className="font-medium tracking-tight flex items-center gap-2 hover:opacity-80 transition-opacity" + > + <ChevronLeft className="h-4 w-4" /> + </Link> + <div className="w-[14rem] h-9 flex items-center"> + {isEditing ? ( + <Input + ref={inputRef} + className="text-sm font-medium px-2 py-1 h-9 truncate" + value={newName} + onChange={(e) => setNewName(e.target.value)} + onBlur={handleNameSave} + onKeyDown={handleInputKeyDown} + onFocus={(e) => e.target.select()} + maxLength={64} + aria-label="Project name" + autoFocus + /> + ) : ( + <span + className="text-sm font-medium cursor-pointer hover:underline" + title="Click to rename" + role="button" + tabIndex={0} + onClick={handleNameClick} + onKeyDown={(e) => e.key === "Enter" && handleNameClick()} + > + <div className="truncate text-ellipsis overflow-clip w-40"> + {activeProject?.name} + </div> + </span> + )} + </div> + </div> + ); + + const centerContent = ( + <div className="flex items-center gap-2 text-xs"> + <span> + {formatTimeCode( + getTotalDuration(), + "HH:MM:SS:FF", + activeProject?.fps || 30 + )} + </span> + </div> + ); + + const rightContent = ( + <nav className="flex items-center gap-2"> + <KeyboardShortcutsHelp /> + <Button + size="sm" + variant="primary" + className="h-7 text-xs" + onClick={handleExport} + > + <Download className="h-4 w-4" /> + <span className="text-sm">Export</span> + </Button> + </nav> + ); + + return ( + <HeaderBase + leftContent={leftContent} + centerContent={centerContent} + rightContent={rightContent} + className="bg-background h-[3.2rem] px-4 items-center" + /> + ); +} diff --git a/apps/web/src/components/editor-provider.tsx b/apps/web/src/components/editor-provider.tsx index 25d040db..b8e9ae1d 100644 --- a/apps/web/src/components/editor-provider.tsx +++ b/apps/web/src/components/editor-provider.tsx @@ -1,53 +1,53 @@ -"use client";
-
-import { useEffect } from "react";
-import { Loader2 } from "lucide-react";
-import { useEditorStore } from "@/stores/editor-store";
-import {
- useKeybindingsListener,
- useKeybindingDisabler,
-} from "@/hooks/use-keybindings";
-import { useEditorActions } from "@/hooks/use-editor-actions";
-
-interface EditorProviderProps {
- children: React.ReactNode;
-}
-
-export function EditorProvider({ children }: EditorProviderProps) {
- const { isInitializing, isPanelsReady, initializeApp } = useEditorStore();
- const { disableKeybindings, enableKeybindings } = useKeybindingDisabler();
-
- // Set up action handlers
- useEditorActions();
-
- // Set up keybinding listener
- useKeybindingsListener();
-
- // Disable keybindings when initializing
- useEffect(() => {
- if (isInitializing || !isPanelsReady) {
- disableKeybindings();
- } else {
- enableKeybindings();
- }
- }, [isInitializing, isPanelsReady, disableKeybindings, enableKeybindings]);
-
- useEffect(() => {
- initializeApp();
- }, [initializeApp]);
-
- // Show loading screen while initializing
- if (isInitializing || !isPanelsReady) {
- return (
- <div className="h-screen w-screen flex items-center justify-center bg-background">
- <div className="flex flex-col items-center gap-4">
- <Loader2 className="h-8 w-8 animate-spin text-muted-foreground" />
- <p className="text-sm text-muted-foreground">Loading editor...</p>
- </div>
- </div>
- );
- }
-
- // App is ready, render children
- return <>{children}</>;
-}
+"use client"; + +import { useEffect } from "react"; +import { Loader2 } from "lucide-react"; +import { useEditorStore } from "@/stores/editor-store"; +import { + useKeybindingsListener, + useKeybindingDisabler, +} from "@/hooks/use-keybindings"; +import { useEditorActions } from "@/hooks/use-editor-actions"; + +interface EditorProviderProps { + children: React.ReactNode; +} + +export function EditorProvider({ children }: EditorProviderProps) { + const { isInitializing, isPanelsReady, initializeApp } = useEditorStore(); + const { disableKeybindings, enableKeybindings } = useKeybindingDisabler(); + + // Set up action handlers + useEditorActions(); + + // Set up keybinding listener + useKeybindingsListener(); + + // Disable keybindings when initializing + useEffect(() => { + if (isInitializing || !isPanelsReady) { + disableKeybindings(); + } else { + enableKeybindings(); + } + }, [isInitializing, isPanelsReady, disableKeybindings, enableKeybindings]); + + useEffect(() => { + initializeApp(); + }, [initializeApp]); + + // Show loading screen while initializing + if (isInitializing || !isPanelsReady) { + return ( + <div className="h-screen w-screen flex items-center justify-center bg-background"> + <div className="flex flex-col items-center gap-4"> + <Loader2 className="h-8 w-8 animate-spin text-muted-foreground" /> + <p className="text-sm text-muted-foreground">Loading editor...</p> + </div> + </div> + ); + } + + // App is ready, render children + return <>{children}</>; +} diff --git a/apps/web/src/components/editor/audio-waveform.tsx b/apps/web/src/components/editor/audio-waveform.tsx index 75a5ae06..a673f995 100644 --- a/apps/web/src/components/editor/audio-waveform.tsx +++ b/apps/web/src/components/editor/audio-waveform.tsx @@ -1,5 +1,5 @@ -import React, { useEffect, useRef, useState } from 'react'; -import WaveSurfer from 'wavesurfer.js'; +import React, { useEffect, useRef, useState } from "react"; +import WaveSurfer from "wavesurfer.js"; interface AudioWaveformProps { audioUrl: string; @@ -7,10 +7,10 @@ interface AudioWaveformProps { className?: string; } -const AudioWaveform: React.FC<AudioWaveformProps> = ({ - audioUrl, - height = 32, - className = '' +const AudioWaveform: React.FC<AudioWaveformProps> = ({ + audioUrl, + height = 32, + className = "", }) => { const waveformRef = useRef<HTMLDivElement>(null); const wavesurfer = useRef<WaveSurfer | null>(null); @@ -36,26 +36,26 @@ const AudioWaveform: React.FC<AudioWaveformProps> = ({ wavesurfer.current = WaveSurfer.create({ container: waveformRef.current, - waveColor: 'rgba(255, 255, 255, 0.6)', - progressColor: 'rgba(255, 255, 255, 0.9)', - cursorColor: 'transparent', + waveColor: "rgba(255, 255, 255, 0.6)", + progressColor: "rgba(255, 255, 255, 0.9)", + cursorColor: "transparent", barWidth: 2, barGap: 1, - height: height, + height, normalize: true, interact: false, }); // Event listeners - wavesurfer.current.on('ready', () => { + wavesurfer.current.on("ready", () => { if (mounted) { setIsLoading(false); setError(false); } }); - wavesurfer.current.on('error', (err) => { - console.error('WaveSurfer error:', err); + wavesurfer.current.on("error", (err) => { + console.error("WaveSurfer error:", err); if (mounted) { setError(true); setIsLoading(false); @@ -63,9 +63,8 @@ const AudioWaveform: React.FC<AudioWaveformProps> = ({ }); await wavesurfer.current.load(audioUrl); - } catch (err) { - console.error('Failed to initialize WaveSurfer:', err); + console.error("Failed to initialize WaveSurfer:", err); if (mounted) { setError(true); setIsLoading(false); @@ -90,7 +89,10 @@ const AudioWaveform: React.FC<AudioWaveformProps> = ({ if (error) { return ( - <div className={`flex items-center justify-center ${className}`} style={{ height }}> + <div + className={`flex items-center justify-center ${className}`} + style={{ height }} + > <span className="text-xs text-foreground/60">Audio unavailable</span> </div> ); @@ -103,13 +105,13 @@ const AudioWaveform: React.FC<AudioWaveformProps> = ({ <span className="text-xs text-foreground/60">Loading...</span> </div> )} - <div - ref={waveformRef} - className={`w-full transition-opacity duration-200 ${isLoading ? 'opacity-0' : 'opacity-100'}`} + <div + ref={waveformRef} + className={`w-full transition-opacity duration-200 ${isLoading ? "opacity-0" : "opacity-100"}`} style={{ height }} /> </div> ); }; -export default AudioWaveform;
\ No newline at end of file +export default AudioWaveform; diff --git a/apps/web/src/components/editor/media-panel/drag-overlay.tsx b/apps/web/src/components/editor/media-panel/drag-overlay.tsx index 3f3820db..e1fd257e 100644 --- a/apps/web/src/components/editor/media-panel/drag-overlay.tsx +++ b/apps/web/src/components/editor/media-panel/drag-overlay.tsx @@ -1,57 +1,57 @@ -import { Upload, Plus, Image } from "lucide-react";
-import { Button } from "@/components/ui/button";
-
-interface MediaDragOverlayProps {
- isVisible: boolean;
- isProcessing?: boolean;
- progress?: number;
- onClick?: () => void;
- isEmptyState?: boolean;
-}
-
-export function MediaDragOverlay({
- isVisible,
- isProcessing = false,
- progress = 0,
- onClick,
- isEmptyState = false,
-}: MediaDragOverlayProps) {
- if (!isVisible) return null;
-
- const handleClick = (e: React.MouseEvent) => {
- if (isProcessing || !onClick) return;
- e.preventDefault();
- e.stopPropagation();
- onClick();
- };
-
- return (
- <div
- className="flex flex-col items-center justify-center gap-4 h-full text-center rounded-lg bg-foreground/5 hover:bg-foreground/10 transition-all duration-200 p-8"
- onClick={handleClick}
- >
- <div className="flex items-center justify-center">
- <Upload className="h-10 w-10 text-foreground" />
- </div>
-
- <div className="space-y-2">
- <p className="text-xs text-muted-foreground max-w-sm">
- {isProcessing
- ? `Processing your files (${progress}%)`
- : "Drag and drop videos, photos, and audio files here"}
- </p>
- </div>
-
- {isProcessing && (
- <div className="w-full max-w-xs">
- <div className="w-full bg-muted/50 rounded-full h-2">
- <div
- className="bg-primary h-2 rounded-full transition-all duration-300"
- style={{ width: `${progress}%` }}
- />
- </div>
- </div>
- )}
- </div>
- );
-}
+import { Upload, Plus, Image } from "lucide-react"; +import { Button } from "@/components/ui/button"; + +interface MediaDragOverlayProps { + isVisible: boolean; + isProcessing?: boolean; + progress?: number; + onClick?: () => void; + isEmptyState?: boolean; +} + +export function MediaDragOverlay({ + isVisible, + isProcessing = false, + progress = 0, + onClick, + isEmptyState = false, +}: MediaDragOverlayProps) { + if (!isVisible) return null; + + const handleClick = (e: React.MouseEvent) => { + if (isProcessing || !onClick) return; + e.preventDefault(); + e.stopPropagation(); + onClick(); + }; + + return ( + <div + className="flex flex-col items-center justify-center gap-4 h-full text-center rounded-lg bg-foreground/5 hover:bg-foreground/10 transition-all duration-200 p-8" + onClick={handleClick} + > + <div className="flex items-center justify-center"> + <Upload className="h-10 w-10 text-foreground" /> + </div> + + <div className="space-y-2"> + <p className="text-xs text-muted-foreground max-w-sm"> + {isProcessing + ? `Processing your files (${progress}%)` + : "Drag and drop videos, photos, and audio files here"} + </p> + </div> + + {isProcessing && ( + <div className="w-full max-w-xs"> + <div className="w-full bg-muted/50 rounded-full h-2"> + <div + className="bg-primary h-2 rounded-full transition-all duration-300" + style={{ width: `${progress}%` }} + /> + </div> + </div> + )} + </div> + ); +} diff --git a/apps/web/src/components/editor/media-panel/index.tsx b/apps/web/src/components/editor/media-panel/index.tsx index 90ac84f0..2c743618 100644 --- a/apps/web/src/components/editor/media-panel/index.tsx +++ b/apps/web/src/components/editor/media-panel/index.tsx @@ -1,54 +1,54 @@ -"use client";
-
-import { TabBar } from "./tabbar";
-import { MediaView } from "./views/media";
-import { useMediaPanelStore, Tab } from "./store";
-import { TextView } from "./views/text";
-import { AudioView } from "./views/audio";
-
-export function MediaPanel() {
- const { activeTab } = useMediaPanelStore();
-
- const viewMap: Record<Tab, React.ReactNode> = {
- media: <MediaView />,
- audio: <AudioView />,
- text: <TextView />,
- stickers: (
- <div className="p-4 text-muted-foreground">
- Stickers view coming soon...
- </div>
- ),
- effects: (
- <div className="p-4 text-muted-foreground">
- Effects view coming soon...
- </div>
- ),
- transitions: (
- <div className="p-4 text-muted-foreground">
- Transitions view coming soon...
- </div>
- ),
- captions: (
- <div className="p-4 text-muted-foreground">
- Captions view coming soon...
- </div>
- ),
- filters: (
- <div className="p-4 text-muted-foreground">
- Filters view coming soon...
- </div>
- ),
- adjustment: (
- <div className="p-4 text-muted-foreground">
- Adjustment view coming soon...
- </div>
- ),
- };
-
- return (
- <div className="h-full flex flex-col bg-panel rounded-sm overflow-hidden">
- <TabBar />
- <div className="flex-1">{viewMap[activeTab]}</div>
- </div>
- );
-}
+"use client"; + +import { TabBar } from "./tabbar"; +import { MediaView } from "./views/media"; +import { useMediaPanelStore, Tab } from "./store"; +import { TextView } from "./views/text"; +import { AudioView } from "./views/audio"; + +export function MediaPanel() { + const { activeTab } = useMediaPanelStore(); + + const viewMap: Record<Tab, React.ReactNode> = { + media: <MediaView />, + audio: <AudioView />, + text: <TextView />, + stickers: ( + <div className="p-4 text-muted-foreground"> + Stickers view coming soon... + </div> + ), + effects: ( + <div className="p-4 text-muted-foreground"> + Effects view coming soon... + </div> + ), + transitions: ( + <div className="p-4 text-muted-foreground"> + Transitions view coming soon... + </div> + ), + captions: ( + <div className="p-4 text-muted-foreground"> + Captions view coming soon... + </div> + ), + filters: ( + <div className="p-4 text-muted-foreground"> + Filters view coming soon... + </div> + ), + adjustment: ( + <div className="p-4 text-muted-foreground"> + Adjustment view coming soon... + </div> + ), + }; + + return ( + <div className="h-full flex flex-col bg-panel rounded-sm overflow-hidden"> + <TabBar /> + <div className="flex-1">{viewMap[activeTab]}</div> + </div> + ); +} diff --git a/apps/web/src/components/editor/media-panel/store.ts b/apps/web/src/components/editor/media-panel/store.ts index 9668f285..c661f51e 100644 --- a/apps/web/src/components/editor/media-panel/store.ts +++ b/apps/web/src/components/editor/media-panel/store.ts @@ -1,73 +1,73 @@ -import {
- CaptionsIcon,
- ArrowLeftRightIcon,
- SparklesIcon,
- StickerIcon,
- MusicIcon,
- VideoIcon,
- BlendIcon,
- SlidersHorizontalIcon,
- LucideIcon,
- TypeIcon,
-} from "lucide-react";
-import { create } from "zustand";
-
-export type Tab =
- | "media"
- | "audio"
- | "text"
- | "stickers"
- | "effects"
- | "transitions"
- | "captions"
- | "filters"
- | "adjustment";
-
-export const tabs: { [key in Tab]: { icon: LucideIcon; label: string } } = {
- media: {
- icon: VideoIcon,
- label: "Media",
- },
- audio: {
- icon: MusicIcon,
- label: "Audio",
- },
- text: {
- icon: TypeIcon,
- label: "Text",
- },
- stickers: {
- icon: StickerIcon,
- label: "Stickers",
- },
- effects: {
- icon: SparklesIcon,
- label: "Effects",
- },
- transitions: {
- icon: ArrowLeftRightIcon,
- label: "Transitions",
- },
- captions: {
- icon: CaptionsIcon,
- label: "Captions",
- },
- filters: {
- icon: BlendIcon,
- label: "Filters",
- },
- adjustment: {
- icon: SlidersHorizontalIcon,
- label: "Adjustment",
- },
-};
-
-interface MediaPanelStore {
- activeTab: Tab;
- setActiveTab: (tab: Tab) => void;
-}
-
-export const useMediaPanelStore = create<MediaPanelStore>((set) => ({
- activeTab: "media",
- setActiveTab: (tab) => set({ activeTab: tab }),
-}));
+import { + CaptionsIcon, + ArrowLeftRightIcon, + SparklesIcon, + StickerIcon, + MusicIcon, + VideoIcon, + BlendIcon, + SlidersHorizontalIcon, + LucideIcon, + TypeIcon, +} from "lucide-react"; +import { create } from "zustand"; + +export type Tab = + | "media" + | "audio" + | "text" + | "stickers" + | "effects" + | "transitions" + | "captions" + | "filters" + | "adjustment"; + +export const tabs: { [key in Tab]: { icon: LucideIcon; label: string } } = { + media: { + icon: VideoIcon, + label: "Media", + }, + audio: { + icon: MusicIcon, + label: "Audio", + }, + text: { + icon: TypeIcon, + label: "Text", + }, + stickers: { + icon: StickerIcon, + label: "Stickers", + }, + effects: { + icon: SparklesIcon, + label: "Effects", + }, + transitions: { + icon: ArrowLeftRightIcon, + label: "Transitions", + }, + captions: { + icon: CaptionsIcon, + label: "Captions", + }, + filters: { + icon: BlendIcon, + label: "Filters", + }, + adjustment: { + icon: SlidersHorizontalIcon, + label: "Adjustment", + }, +}; + +interface MediaPanelStore { + activeTab: Tab; + setActiveTab: (tab: Tab) => void; +} + +export const useMediaPanelStore = create<MediaPanelStore>((set) => ({ + activeTab: "media", + setActiveTab: (tab) => set({ activeTab: tab }), +})); diff --git a/apps/web/src/components/editor/media-panel/tabbar.tsx b/apps/web/src/components/editor/media-panel/tabbar.tsx index b05bee7e..bce84a46 100644 --- a/apps/web/src/components/editor/media-panel/tabbar.tsx +++ b/apps/web/src/components/editor/media-panel/tabbar.tsx @@ -1,124 +1,124 @@ -"use client";
-
-import { cn } from "@/lib/utils";
-import { Tab, tabs, useMediaPanelStore } from "./store";
-import { Button } from "@/components/ui/button";
-import { ChevronRight, ChevronLeft } from "lucide-react";
-import { useRef, useState, useEffect } from "react";
-
-export function TabBar() {
- const { activeTab, setActiveTab } = useMediaPanelStore();
- const scrollContainerRef = useRef<HTMLDivElement>(null);
- const [isAtEnd, setIsAtEnd] = useState(false);
- const [isAtStart, setIsAtStart] = useState(true);
-
- const scrollToEnd = () => {
- if (scrollContainerRef.current) {
- scrollContainerRef.current.scrollTo({
- left: scrollContainerRef.current.scrollWidth,
- });
- setIsAtEnd(true);
- setIsAtStart(false);
- }
- };
-
- const scrollToStart = () => {
- if (scrollContainerRef.current) {
- scrollContainerRef.current.scrollTo({
- left: 0,
- });
- setIsAtStart(true);
- setIsAtEnd(false);
- }
- };
-
- const checkScrollPosition = () => {
- if (scrollContainerRef.current) {
- const { scrollLeft, scrollWidth, clientWidth } =
- scrollContainerRef.current;
- const isAtEndNow = scrollLeft + clientWidth >= scrollWidth - 1;
- const isAtStartNow = scrollLeft <= 1;
- setIsAtEnd(isAtEndNow);
- setIsAtStart(isAtStartNow);
- }
- };
-
- // We're using useEffect because we need to sync with external DOM scroll events
- useEffect(() => {
- const container = scrollContainerRef.current;
- if (!container) return;
-
- checkScrollPosition();
- container.addEventListener("scroll", checkScrollPosition);
-
- const resizeObserver = new ResizeObserver(checkScrollPosition);
- resizeObserver.observe(container);
-
- return () => {
- container.removeEventListener("scroll", checkScrollPosition);
- resizeObserver.disconnect();
- };
- }, []);
-
- return (
- <div className="flex">
- <ScrollButton
- direction="left"
- onClick={scrollToStart}
- isVisible={!isAtStart}
- />
- <div
- ref={scrollContainerRef}
- className="h-12 bg-panel-accent px-3 flex justify-start items-center gap-5 overflow-x-auto scrollbar-x-hidden relative w-full"
- >
- {(Object.keys(tabs) as Tab[]).map((tabKey) => {
- const tab = tabs[tabKey];
- return (
- <div
- className={cn(
- "flex flex-col gap-0.5 items-center cursor-pointer",
- activeTab === tabKey ? "text-primary" : "text-muted-foreground"
- )}
- onClick={() => setActiveTab(tabKey)}
- key={tabKey}
- >
- <tab.icon className="!size-[1.1rem]" />
- <span className="text-[0.65rem]">{tab.label}</span>
- </div>
- );
- })}
- </div>
- <ScrollButton
- direction="right"
- onClick={scrollToEnd}
- isVisible={!isAtEnd}
- />
- </div>
- );
-}
-
-function ScrollButton({
- direction,
- onClick,
- isVisible,
-}: {
- direction: "left" | "right";
- onClick: () => void;
- isVisible: boolean;
-}) {
- if (!isVisible) return null;
-
- const Icon = direction === "left" ? ChevronLeft : ChevronRight;
-
- return (
- <div className="bg-panel-accent w-12 h-full flex items-center justify-center">
- <Button
- size="icon"
- className="rounded-[0.4rem] w-4 h-7 !bg-foreground/10"
- onClick={onClick}
- >
- <Icon className="!size-4 text-foreground" />
- </Button>
- </div>
- );
-}
+"use client"; + +import { cn } from "@/lib/utils"; +import { Tab, tabs, useMediaPanelStore } from "./store"; +import { Button } from "@/components/ui/button"; +import { ChevronRight, ChevronLeft } from "lucide-react"; +import { useRef, useState, useEffect } from "react"; + +export function TabBar() { + const { activeTab, setActiveTab } = useMediaPanelStore(); + const scrollContainerRef = useRef<HTMLDivElement>(null); + const [isAtEnd, setIsAtEnd] = useState(false); + const [isAtStart, setIsAtStart] = useState(true); + + const scrollToEnd = () => { + if (scrollContainerRef.current) { + scrollContainerRef.current.scrollTo({ + left: scrollContainerRef.current.scrollWidth, + }); + setIsAtEnd(true); + setIsAtStart(false); + } + }; + + const scrollToStart = () => { + if (scrollContainerRef.current) { + scrollContainerRef.current.scrollTo({ + left: 0, + }); + setIsAtStart(true); + setIsAtEnd(false); + } + }; + + const checkScrollPosition = () => { + if (scrollContainerRef.current) { + const { scrollLeft, scrollWidth, clientWidth } = + scrollContainerRef.current; + const isAtEndNow = scrollLeft + clientWidth >= scrollWidth - 1; + const isAtStartNow = scrollLeft <= 1; + setIsAtEnd(isAtEndNow); + setIsAtStart(isAtStartNow); + } + }; + + // We're using useEffect because we need to sync with external DOM scroll events + useEffect(() => { + const container = scrollContainerRef.current; + if (!container) return; + + checkScrollPosition(); + container.addEventListener("scroll", checkScrollPosition); + + const resizeObserver = new ResizeObserver(checkScrollPosition); + resizeObserver.observe(container); + + return () => { + container.removeEventListener("scroll", checkScrollPosition); + resizeObserver.disconnect(); + }; + }, []); + + return ( + <div className="flex"> + <ScrollButton + direction="left" + onClick={scrollToStart} + isVisible={!isAtStart} + /> + <div + ref={scrollContainerRef} + className="h-12 bg-panel-accent px-3 flex justify-start items-center gap-5 overflow-x-auto scrollbar-x-hidden relative w-full" + > + {(Object.keys(tabs) as Tab[]).map((tabKey) => { + const tab = tabs[tabKey]; + return ( + <div + className={cn( + "flex flex-col gap-0.5 items-center cursor-pointer", + activeTab === tabKey ? "text-primary" : "text-muted-foreground" + )} + onClick={() => setActiveTab(tabKey)} + key={tabKey} + > + <tab.icon className="!size-[1.1rem]" /> + <span className="text-[0.65rem]">{tab.label}</span> + </div> + ); + })} + </div> + <ScrollButton + direction="right" + onClick={scrollToEnd} + isVisible={!isAtEnd} + /> + </div> + ); +} + +function ScrollButton({ + direction, + onClick, + isVisible, +}: { + direction: "left" | "right"; + onClick: () => void; + isVisible: boolean; +}) { + if (!isVisible) return null; + + const Icon = direction === "left" ? ChevronLeft : ChevronRight; + + return ( + <div className="bg-panel-accent w-12 h-full flex items-center justify-center"> + <Button + size="icon" + className="rounded-[0.4rem] w-4 h-7 !bg-foreground/10" + onClick={onClick} + > + <Icon className="!size-4 text-foreground" /> + </Button> + </div> + ); +} diff --git a/apps/web/src/components/editor/media-panel/views/audio.tsx b/apps/web/src/components/editor/media-panel/views/audio.tsx index 7ddf465c..ba64d749 100644 --- a/apps/web/src/components/editor/media-panel/views/audio.tsx +++ b/apps/web/src/components/editor/media-panel/views/audio.tsx @@ -1,18 +1,18 @@ -"use client";
-
-import { Input } from "@/components/ui/input";
-import { useState } from "react";
-
-export function AudioView() {
- const [search, setSearch] = useState("");
- return (
- <div className="h-full flex flex-col gap-2 p-4">
- <Input
- placeholder="Search songs and artists"
- value={search}
- onChange={(e) => setSearch(e.target.value)}
- />
- <div className="flex flex-col gap-2"></div>
- </div>
- );
-}
+"use client"; + +import { Input } from "@/components/ui/input"; +import { useState } from "react"; + +export function AudioView() { + const [search, setSearch] = useState(""); + return ( + <div className="h-full flex flex-col gap-2 p-4"> + <Input + placeholder="Search songs and artists" + value={search} + onChange={(e) => setSearch(e.target.value)} + /> + <div className="flex flex-col gap-2" /> + </div> + ); +} diff --git a/apps/web/src/components/editor/media-panel/views/media.tsx b/apps/web/src/components/editor/media-panel/views/media.tsx index 0189720f..66d0d00d 100644 --- a/apps/web/src/components/editor/media-panel/views/media.tsx +++ b/apps/web/src/components/editor/media-panel/views/media.tsx @@ -1,298 +1,298 @@ -"use client";
-
-import { useDragDrop } from "@/hooks/use-drag-drop";
-import { processMediaFiles } from "@/lib/media-processing";
-import { useMediaStore, type MediaItem } from "@/stores/media-store";
-import { Image, Loader2, Music, Plus, Video } from "lucide-react";
-import { useEffect, useRef, useState } from "react";
-import { toast } from "sonner";
-import { Button } from "@/components/ui/button";
-import { MediaDragOverlay } from "@/components/editor/media-panel/drag-overlay";
-import {
- ContextMenu,
- ContextMenuContent,
- ContextMenuItem,
- ContextMenuTrigger,
-} from "@/components/ui/context-menu";
-import { Input } from "@/components/ui/input";
-import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "@/components/ui/select";
-import { DraggableMediaItem } from "@/components/ui/draggable-item";
-import { useProjectStore } from "@/stores/project-store";
-import { useTimelineStore } from "@/stores/timeline-store";
-
-export function MediaView() {
- const { mediaItems, addMediaItem, removeMediaItem } = useMediaStore();
- const { activeProject } = useProjectStore();
- const fileInputRef = useRef<HTMLInputElement>(null);
- const [isProcessing, setIsProcessing] = useState(false);
- const [progress, setProgress] = useState(0);
- const [searchQuery, setSearchQuery] = useState("");
- const [mediaFilter, setMediaFilter] = useState("all");
-
- const processFiles = async (files: FileList | File[]) => {
- if (!files || files.length === 0) return;
- if (!activeProject) {
- toast.error("No active project");
- return;
- }
-
- setIsProcessing(true);
- setProgress(0);
- try {
- // Process files (extract metadata, generate thumbnails, etc.)
- const processedItems = await processMediaFiles(files, (p) =>
- setProgress(p)
- );
- // Add each processed media item to the store
- for (const item of processedItems) {
- await addMediaItem(activeProject.id, item);
- }
- } catch (error) {
- // Show error toast if processing fails
- console.error("Error processing files:", error);
- toast.error("Failed to process files");
- } finally {
- setIsProcessing(false);
- setProgress(0);
- }
- };
-
- const { isDragOver, dragProps } = useDragDrop({
- // When files are dropped, process them
- onDrop: processFiles,
- });
-
- const handleFileSelect = () => fileInputRef.current?.click(); // Open file picker
-
- const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
- // When files are selected via file picker, process them
- if (e.target.files) processFiles(e.target.files);
- e.target.value = ""; // Reset input
- };
-
- const handleRemove = async (e: React.MouseEvent, id: string) => {
- // Remove a media item from the store
- e.stopPropagation();
-
- if (!activeProject) {
- toast.error("No active project");
- return;
- }
-
- // Media store now handles cascade deletion automatically
- await removeMediaItem(activeProject.id, id);
- };
-
- const formatDuration = (duration: number) => {
- // Format seconds as mm:ss
- const min = Math.floor(duration / 60);
- const sec = Math.floor(duration % 60);
- return `${min}:${sec.toString().padStart(2, "0")}`;
- };
-
- const [filteredMediaItems, setFilteredMediaItems] = useState(mediaItems);
-
- useEffect(() => {
- const filtered = mediaItems.filter((item) => {
- if (mediaFilter && mediaFilter !== "all" && item.type !== mediaFilter) {
- return false;
- }
-
- if (
- searchQuery &&
- !item.name.toLowerCase().includes(searchQuery.toLowerCase())
- ) {
- return false;
- }
-
- return true;
- });
-
- setFilteredMediaItems(filtered);
- }, [mediaItems, mediaFilter, searchQuery]);
-
- const renderPreview = (item: MediaItem) => {
- // Render a preview for each media type (image, video, audio, unknown)
- if (item.type === "image") {
- return (
- <div className="w-full h-full flex items-center justify-center">
- <img
- src={item.url}
- alt={item.name}
- className="max-w-full max-h-full object-contain"
- loading="lazy"
- />
- </div>
- );
- }
-
- if (item.type === "video") {
- if (item.thumbnailUrl) {
- return (
- <div className="relative w-full h-full">
- <img
- src={item.thumbnailUrl}
- alt={item.name}
- className="w-full h-full object-cover rounded"
- loading="lazy"
- />
- <div className="absolute inset-0 flex items-center justify-center bg-black/20 rounded">
- <Video className="h-6 w-6 text-white drop-shadow-md" />
- </div>
- {item.duration && (
- <div className="absolute bottom-1 right-1 bg-black/70 text-white text-xs px-1 rounded">
- {formatDuration(item.duration)}
- </div>
- )}
- </div>
- );
- }
- return (
- <div className="w-full h-full bg-muted/30 flex flex-col items-center justify-center text-muted-foreground rounded">
- <Video className="h-6 w-6 mb-1" />
- <span className="text-xs">Video</span>
- {item.duration && (
- <span className="text-xs opacity-70">
- {formatDuration(item.duration)}
- </span>
- )}
- </div>
- );
- }
-
- if (item.type === "audio") {
- return (
- <div className="w-full h-full bg-gradient-to-br from-green-500/20 to-emerald-500/20 flex flex-col items-center justify-center text-muted-foreground rounded border border-green-500/20">
- <Music className="h-6 w-6 mb-1" />
- <span className="text-xs">Audio</span>
- {item.duration && (
- <span className="text-xs opacity-70">
- {formatDuration(item.duration)}
- </span>
- )}
- </div>
- );
- }
-
- return (
- <div className="w-full h-full bg-muted/30 flex flex-col items-center justify-center text-muted-foreground rounded">
- <Image className="h-6 w-6" />
- <span className="text-xs mt-1">Unknown</span>
- </div>
- );
- };
-
- return (
- <>
- {/* Hidden file input for uploading media */}
- <input
- ref={fileInputRef}
- type="file"
- accept="image/*,video/*,audio/*"
- multiple
- className="hidden"
- onChange={handleFileChange}
- />
-
- <div
- className={`h-full flex flex-col gap-1 transition-colors relative ${isDragOver ? "bg-accent/30" : ""}`}
- {...dragProps}
- >
- <div className="p-3 pb-2">
- {/* Search and filter controls */}
- <div className="flex gap-2">
- <Select value={mediaFilter} onValueChange={setMediaFilter}>
- <SelectTrigger className="w-[80px] h-9 text-xs">
- <SelectValue />
- </SelectTrigger>
- <SelectContent>
- <SelectItem value="all">All</SelectItem>
- <SelectItem value="video">Video</SelectItem>
- <SelectItem value="audio">Audio</SelectItem>
- <SelectItem value="image">Image</SelectItem>
- </SelectContent>
- </Select>
- <Input
- type="text"
- placeholder="Search media..."
- className="min-w-[60px] flex-1 h-9 text-xs"
- value={searchQuery}
- onChange={(e) => setSearchQuery(e.target.value)}
- />
- <Button
- variant="outline"
- size="lg"
- onClick={handleFileSelect}
- disabled={isProcessing}
- className="flex-none bg-transparent min-w-[30px] whitespace-nowrap overflow-hidden px-2 justify-center items-center h-9"
- >
- {isProcessing ? (
- <Loader2 className="h-4 w-4 animate-spin" />
- ) : (
- <Plus className="h-4 w-4" />
- )}
- </Button>
- </div>
- </div>
-
- <div className="flex-1 overflow-y-auto p-3 pt-0">
- {isDragOver || filteredMediaItems.length === 0 ? (
- <MediaDragOverlay
- isVisible={true}
- isProcessing={isProcessing}
- progress={progress}
- onClick={handleFileSelect}
- isEmptyState={filteredMediaItems.length === 0 && !isDragOver}
- />
- ) : (
- <div
- className="grid gap-2"
- style={{
- gridTemplateColumns: "repeat(auto-fill, 160px)",
- }}
- >
- {/* Render each media item as a draggable button */}
- {filteredMediaItems.map((item) => (
- <ContextMenu key={item.id}>
- <ContextMenuTrigger>
- <DraggableMediaItem
- name={item.name}
- preview={renderPreview(item)}
- dragData={{
- id: item.id,
- type: item.type,
- name: item.name,
- }}
- showPlusOnDrag={false}
- onAddToTimeline={(currentTime) =>
- useTimelineStore
- .getState()
- .addMediaAtTime(item, currentTime)
- }
- rounded={false}
- />
- </ContextMenuTrigger>
- <ContextMenuContent>
- <ContextMenuItem>Export clips</ContextMenuItem>
- <ContextMenuItem
- variant="destructive"
- onClick={(e) => handleRemove(e, item.id)}
- >
- Delete
- </ContextMenuItem>
- </ContextMenuContent>
- </ContextMenu>
- ))}
- </div>
- )}
- </div>
- </div>
- </>
- );
-}
+"use client"; + +import { useDragDrop } from "@/hooks/use-drag-drop"; +import { processMediaFiles } from "@/lib/media-processing"; +import { useMediaStore, type MediaItem } from "@/stores/media-store"; +import { Image, Loader2, Music, Plus, Video } from "lucide-react"; +import { useEffect, useRef, useState } from "react"; +import { toast } from "sonner"; +import { Button } from "@/components/ui/button"; +import { MediaDragOverlay } from "@/components/editor/media-panel/drag-overlay"; +import { + ContextMenu, + ContextMenuContent, + ContextMenuItem, + ContextMenuTrigger, +} from "@/components/ui/context-menu"; +import { Input } from "@/components/ui/input"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { DraggableMediaItem } from "@/components/ui/draggable-item"; +import { useProjectStore } from "@/stores/project-store"; +import { useTimelineStore } from "@/stores/timeline-store"; + +export function MediaView() { + const { mediaItems, addMediaItem, removeMediaItem } = useMediaStore(); + const { activeProject } = useProjectStore(); + const fileInputRef = useRef<HTMLInputElement>(null); + const [isProcessing, setIsProcessing] = useState(false); + const [progress, setProgress] = useState(0); + const [searchQuery, setSearchQuery] = useState(""); + const [mediaFilter, setMediaFilter] = useState("all"); + + const processFiles = async (files: FileList | File[]) => { + if (!files || files.length === 0) return; + if (!activeProject) { + toast.error("No active project"); + return; + } + + setIsProcessing(true); + setProgress(0); + try { + // Process files (extract metadata, generate thumbnails, etc.) + const processedItems = await processMediaFiles(files, (p) => + setProgress(p) + ); + // Add each processed media item to the store + for (const item of processedItems) { + await addMediaItem(activeProject.id, item); + } + } catch (error) { + // Show error toast if processing fails + console.error("Error processing files:", error); + toast.error("Failed to process files"); + } finally { + setIsProcessing(false); + setProgress(0); + } + }; + + const { isDragOver, dragProps } = useDragDrop({ + // When files are dropped, process them + onDrop: processFiles, + }); + + const handleFileSelect = () => fileInputRef.current?.click(); // Open file picker + + const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => { + // When files are selected via file picker, process them + if (e.target.files) processFiles(e.target.files); + e.target.value = ""; // Reset input + }; + + const handleRemove = async (e: React.MouseEvent, id: string) => { + // Remove a media item from the store + e.stopPropagation(); + + if (!activeProject) { + toast.error("No active project"); + return; + } + + // Media store now handles cascade deletion automatically + await removeMediaItem(activeProject.id, id); + }; + + const formatDuration = (duration: number) => { + // Format seconds as mm:ss + const min = Math.floor(duration / 60); + const sec = Math.floor(duration % 60); + return `${min}:${sec.toString().padStart(2, "0")}`; + }; + + const [filteredMediaItems, setFilteredMediaItems] = useState(mediaItems); + + useEffect(() => { + const filtered = mediaItems.filter((item) => { + if (mediaFilter && mediaFilter !== "all" && item.type !== mediaFilter) { + return false; + } + + if ( + searchQuery && + !item.name.toLowerCase().includes(searchQuery.toLowerCase()) + ) { + return false; + } + + return true; + }); + + setFilteredMediaItems(filtered); + }, [mediaItems, mediaFilter, searchQuery]); + + const renderPreview = (item: MediaItem) => { + // Render a preview for each media type (image, video, audio, unknown) + if (item.type === "image") { + return ( + <div className="w-full h-full flex items-center justify-center"> + <img + src={item.url} + alt={item.name} + className="max-w-full max-h-full object-contain" + loading="lazy" + /> + </div> + ); + } + + if (item.type === "video") { + if (item.thumbnailUrl) { + return ( + <div className="relative w-full h-full"> + <img + src={item.thumbnailUrl} + alt={item.name} + className="w-full h-full object-cover rounded" + loading="lazy" + /> + <div className="absolute inset-0 flex items-center justify-center bg-black/20 rounded"> + <Video className="h-6 w-6 text-white drop-shadow-md" /> + </div> + {item.duration && ( + <div className="absolute bottom-1 right-1 bg-black/70 text-white text-xs px-1 rounded"> + {formatDuration(item.duration)} + </div> + )} + </div> + ); + } + return ( + <div className="w-full h-full bg-muted/30 flex flex-col items-center justify-center text-muted-foreground rounded"> + <Video className="h-6 w-6 mb-1" /> + <span className="text-xs">Video</span> + {item.duration && ( + <span className="text-xs opacity-70"> + {formatDuration(item.duration)} + </span> + )} + </div> + ); + } + + if (item.type === "audio") { + return ( + <div className="w-full h-full bg-gradient-to-br from-green-500/20 to-emerald-500/20 flex flex-col items-center justify-center text-muted-foreground rounded border border-green-500/20"> + <Music className="h-6 w-6 mb-1" /> + <span className="text-xs">Audio</span> + {item.duration && ( + <span className="text-xs opacity-70"> + {formatDuration(item.duration)} + </span> + )} + </div> + ); + } + + return ( + <div className="w-full h-full bg-muted/30 flex flex-col items-center justify-center text-muted-foreground rounded"> + <Image className="h-6 w-6" /> + <span className="text-xs mt-1">Unknown</span> + </div> + ); + }; + + return ( + <> + {/* Hidden file input for uploading media */} + <input + ref={fileInputRef} + type="file" + accept="image/*,video/*,audio/*" + multiple + className="hidden" + onChange={handleFileChange} + /> + + <div + className={`h-full flex flex-col gap-1 transition-colors relative ${isDragOver ? "bg-accent/30" : ""}`} + {...dragProps} + > + <div className="p-3 pb-2"> + {/* Search and filter controls */} + <div className="flex gap-2"> + <Select value={mediaFilter} onValueChange={setMediaFilter}> + <SelectTrigger className="w-[80px] h-9 text-xs"> + <SelectValue /> + </SelectTrigger> + <SelectContent> + <SelectItem value="all">All</SelectItem> + <SelectItem value="video">Video</SelectItem> + <SelectItem value="audio">Audio</SelectItem> + <SelectItem value="image">Image</SelectItem> + </SelectContent> + </Select> + <Input + type="text" + placeholder="Search media..." + className="min-w-[60px] flex-1 h-9 text-xs" + value={searchQuery} + onChange={(e) => setSearchQuery(e.target.value)} + /> + <Button + variant="outline" + size="lg" + onClick={handleFileSelect} + disabled={isProcessing} + className="flex-none bg-transparent min-w-[30px] whitespace-nowrap overflow-hidden px-2 justify-center items-center h-9" + > + {isProcessing ? ( + <Loader2 className="h-4 w-4 animate-spin" /> + ) : ( + <Plus className="h-4 w-4" /> + )} + </Button> + </div> + </div> + + <div className="flex-1 overflow-y-auto p-3 pt-0"> + {isDragOver || filteredMediaItems.length === 0 ? ( + <MediaDragOverlay + isVisible={true} + isProcessing={isProcessing} + progress={progress} + onClick={handleFileSelect} + isEmptyState={filteredMediaItems.length === 0 && !isDragOver} + /> + ) : ( + <div + className="grid gap-2" + style={{ + gridTemplateColumns: "repeat(auto-fill, 160px)", + }} + > + {/* Render each media item as a draggable button */} + {filteredMediaItems.map((item) => ( + <ContextMenu key={item.id}> + <ContextMenuTrigger> + <DraggableMediaItem + name={item.name} + preview={renderPreview(item)} + dragData={{ + id: item.id, + type: item.type, + name: item.name, + }} + showPlusOnDrag={false} + onAddToTimeline={(currentTime) => + useTimelineStore + .getState() + .addMediaAtTime(item, currentTime) + } + rounded={false} + /> + </ContextMenuTrigger> + <ContextMenuContent> + <ContextMenuItem>Export clips</ContextMenuItem> + <ContextMenuItem + variant="destructive" + onClick={(e) => handleRemove(e, item.id)} + > + Delete + </ContextMenuItem> + </ContextMenuContent> + </ContextMenu> + ))} + </div> + )} + </div> + </div> + </> + ); +} diff --git a/apps/web/src/components/editor/media-panel/views/text.tsx b/apps/web/src/components/editor/media-panel/views/text.tsx index 6d0d310b..0686190e 100644 --- a/apps/web/src/components/editor/media-panel/views/text.tsx +++ b/apps/web/src/components/editor/media-panel/views/text.tsx @@ -1,53 +1,53 @@ -import { DraggableMediaItem } from "@/components/ui/draggable-item";
-import { TIMELINE_CONSTANTS } from "@/constants/timeline-constants";
-import { useTimelineStore } from "@/stores/timeline-store";
-import { type TextElement } from "@/types/timeline";
-
-let textData: TextElement = {
- id: "default-text",
- type: "text",
- name: "Default text",
- content: "Default text",
- fontSize: 48,
- fontFamily: "Arial",
- color: "#ffffff",
- backgroundColor: "transparent",
- textAlign: "center" as const,
- fontWeight: "normal" as const,
- fontStyle: "normal" as const,
- textDecoration: "none" as const,
- x: 0,
- y: 0,
- rotation: 0,
- opacity: 1,
- duration: TIMELINE_CONSTANTS.DEFAULT_TEXT_DURATION,
- startTime: 0,
- trimStart: 0,
- trimEnd: 0,
-};
-
-export function TextView() {
- return (
- <div className="p-4">
- <DraggableMediaItem
- name="Default text"
- preview={
- <div className="flex items-center justify-center w-full h-full bg-accent rounded">
- <span className="text-xs select-none">Default text</span>
- </div>
- }
- dragData={{
- id: textData.id,
- type: textData.type,
- name: textData.name,
- content: textData.content,
- }}
- aspectRatio={1}
- onAddToTimeline={(currentTime) =>
- useTimelineStore.getState().addTextAtTime(textData, currentTime)
- }
- showLabel={false}
- />
- </div>
- );
-}
+import { DraggableMediaItem } from "@/components/ui/draggable-item"; +import { TIMELINE_CONSTANTS } from "@/constants/timeline-constants"; +import { useTimelineStore } from "@/stores/timeline-store"; +import { type TextElement } from "@/types/timeline"; + +const textData: TextElement = { + id: "default-text", + type: "text", + name: "Default text", + content: "Default text", + fontSize: 48, + fontFamily: "Arial", + color: "#ffffff", + backgroundColor: "transparent", + textAlign: "center" as const, + fontWeight: "normal" as const, + fontStyle: "normal" as const, + textDecoration: "none" as const, + x: 0, + y: 0, + rotation: 0, + opacity: 1, + duration: TIMELINE_CONSTANTS.DEFAULT_TEXT_DURATION, + startTime: 0, + trimStart: 0, + trimEnd: 0, +}; + +export function TextView() { + return ( + <div className="p-4"> + <DraggableMediaItem + name="Default text" + preview={ + <div className="flex items-center justify-center w-full h-full bg-accent rounded"> + <span className="text-xs select-none">Default text</span> + </div> + } + dragData={{ + id: textData.id, + type: textData.type, + name: textData.name, + content: textData.content, + }} + aspectRatio={1} + onAddToTimeline={(currentTime) => + useTimelineStore.getState().addTextAtTime(textData, currentTime) + } + showLabel={false} + /> + </div> + ); +} diff --git a/apps/web/src/components/editor/preview-panel.tsx b/apps/web/src/components/editor/preview-panel.tsx index 2cba1374..f09e8462 100644 --- a/apps/web/src/components/editor/preview-panel.tsx +++ b/apps/web/src/components/editor/preview-panel.tsx @@ -368,7 +368,7 @@ export function PreviewPanel() { ref={containerRef} className="flex-1 flex flex-col items-center justify-center p-3 min-h-0 min-w-0" > - <div className="flex-1"></div> + <div className="flex-1" /> {hasAnyElements ? ( <div ref={previewRef} @@ -402,7 +402,7 @@ export function PreviewPanel() { </div> ) : null} - <div className="flex-1"></div> + <div className="flex-1" /> <PreviewToolbar hasAnyElements={hasAnyElements} diff --git a/apps/web/src/components/editor/properties-panel/audio-properties.tsx b/apps/web/src/components/editor/properties-panel/audio-properties.tsx index 384f0c5e..8d69e36a 100644 --- a/apps/web/src/components/editor/properties-panel/audio-properties.tsx +++ b/apps/web/src/components/editor/properties-panel/audio-properties.tsx @@ -1,5 +1,5 @@ -import { MediaElement } from "@/types/timeline";
-
-export function AudioProperties({ element }: { element: MediaElement }) {
- return <div className="space-y-4 p-5">Audio properties</div>;
-}
\ No newline at end of file +import { MediaElement } from "@/types/timeline"; + +export function AudioProperties({ element }: { element: MediaElement }) { + return <div className="space-y-4 p-5">Audio properties</div>; +} diff --git a/apps/web/src/components/editor/properties-panel/media-properties.tsx b/apps/web/src/components/editor/properties-panel/media-properties.tsx index c2c514cf..4ea28bb2 100644 --- a/apps/web/src/components/editor/properties-panel/media-properties.tsx +++ b/apps/web/src/components/editor/properties-panel/media-properties.tsx @@ -1,5 +1,5 @@ -import { MediaElement } from "@/types/timeline";
-
-export function MediaProperties({ element }: { element: MediaElement }) {
- return <div className="space-y-4 p-5">Media properties</div>;
-}
+import { MediaElement } from "@/types/timeline"; + +export function MediaProperties({ element }: { element: MediaElement }) { + return <div className="space-y-4 p-5">Media properties</div>; +} diff --git a/apps/web/src/components/editor/properties-panel/property-item.tsx b/apps/web/src/components/editor/properties-panel/property-item.tsx index beb8c799..804ffb39 100644 --- a/apps/web/src/components/editor/properties-panel/property-item.tsx +++ b/apps/web/src/components/editor/properties-panel/property-item.tsx @@ -1,47 +1,47 @@ -import { cn } from "@/lib/utils";
-
-interface PropertyItemProps {
- direction?: "row" | "column";
- children: React.ReactNode;
- className?: string;
-}
-
-export function PropertyItem({
- direction = "row",
- children,
- className,
-}: PropertyItemProps) {
- return (
- <div
- className={cn(
- "flex gap-2",
- direction === "row"
- ? "items-center justify-between gap-6"
- : "flex-col gap-1",
- className
- )}
- >
- {children}
- </div>
- );
-}
-
-export function PropertyItemLabel({
- children,
- className,
-}: {
- children: React.ReactNode;
- className?: string;
-}) {
- return <label className={cn("text-xs", className)}>{children}</label>;
-}
-
-export function PropertyItemValue({
- children,
- className,
-}: {
- children: React.ReactNode;
- className?: string;
-}) {
- return <div className={cn("flex-1", className)}>{children}</div>;
-}
+import { cn } from "@/lib/utils"; + +interface PropertyItemProps { + direction?: "row" | "column"; + children: React.ReactNode; + className?: string; +} + +export function PropertyItem({ + direction = "row", + children, + className, +}: PropertyItemProps) { + return ( + <div + className={cn( + "flex gap-2", + direction === "row" + ? "items-center justify-between gap-6" + : "flex-col gap-1", + className + )} + > + {children} + </div> + ); +} + +export function PropertyItemLabel({ + children, + className, +}: { + children: React.ReactNode; + className?: string; +}) { + return <label className={cn("text-xs", className)}>{children}</label>; +} + +export function PropertyItemValue({ + children, + className, +}: { + children: React.ReactNode; + className?: string; +}) { + return <div className={cn("flex-1", className)}>{children}</div>; +} diff --git a/apps/web/src/components/editor/properties-panel/text-properties.tsx b/apps/web/src/components/editor/properties-panel/text-properties.tsx index e13dabc8..c55c3dae 100644 --- a/apps/web/src/components/editor/properties-panel/text-properties.tsx +++ b/apps/web/src/components/editor/properties-panel/text-properties.tsx @@ -1,76 +1,76 @@ -import { Textarea } from "@/components/ui/textarea";
-import { FontPicker } from "@/components/ui/font-picker";
-import { FontFamily } from "@/constants/font-constants";
-import { TextElement } from "@/types/timeline";
-import { useTimelineStore } from "@/stores/timeline-store";
-import { Slider } from "@/components/ui/slider";
-import { Input } from "@/components/ui/input";
-import {
- PropertyItem,
- PropertyItemLabel,
- PropertyItemValue,
-} from "./property-item";
-
-export function TextProperties({
- element,
- trackId,
-}: {
- element: TextElement;
- trackId: string;
-}) {
- const { updateTextElement } = useTimelineStore();
-
- return (
- <div className="space-y-6 p-5">
- <Textarea
- placeholder="Name"
- defaultValue={element.content}
- className="min-h-[4.5rem] resize-none bg-background/50"
- onChange={(e) =>
- updateTextElement(trackId, element.id, { content: e.target.value })
- }
- />
- <PropertyItem direction="row">
- <PropertyItemLabel>Font</PropertyItemLabel>
- <PropertyItemValue>
- <FontPicker
- defaultValue={element.fontFamily}
- onValueChange={(value: FontFamily) =>
- updateTextElement(trackId, element.id, { fontFamily: value })
- }
- />
- </PropertyItemValue>
- </PropertyItem>
- <PropertyItem direction="column">
- <PropertyItemLabel>Font size</PropertyItemLabel>
- <PropertyItemValue>
- <div className="flex items-center gap-2">
- <Slider
- defaultValue={[element.fontSize]}
- min={8}
- max={300}
- step={1}
- onValueChange={([value]) =>
- updateTextElement(trackId, element.id, { fontSize: value })
- }
- className="w-full"
- />
- <Input
- type="number"
- value={element.fontSize}
- onChange={(e) =>
- updateTextElement(trackId, element.id, {
- fontSize: parseInt(e.target.value),
- })
- }
- className="w-12 !text-xs h-7 rounded-sm text-center
- [appearance:textfield]
- [&::-webkit-outer-spin-button]:appearance-none
- [&::-webkit-inner-spin-button]:appearance-none"
- />
- </div>
- </PropertyItemValue>
- </PropertyItem>
- </div>
- );
-}
+import { Textarea } from "@/components/ui/textarea"; +import { FontPicker } from "@/components/ui/font-picker"; +import { FontFamily } from "@/constants/font-constants"; +import { TextElement } from "@/types/timeline"; +import { useTimelineStore } from "@/stores/timeline-store"; +import { Slider } from "@/components/ui/slider"; +import { Input } from "@/components/ui/input"; +import { + PropertyItem, + PropertyItemLabel, + PropertyItemValue, +} from "./property-item"; + +export function TextProperties({ + element, + trackId, +}: { + element: TextElement; + trackId: string; +}) { + const { updateTextElement } = useTimelineStore(); + + return ( + <div className="space-y-6 p-5"> + <Textarea + placeholder="Name" + defaultValue={element.content} + className="min-h-[4.5rem] resize-none bg-background/50" + onChange={(e) => + updateTextElement(trackId, element.id, { content: e.target.value }) + } + /> + <PropertyItem direction="row"> + <PropertyItemLabel>Font</PropertyItemLabel> + <PropertyItemValue> + <FontPicker + defaultValue={element.fontFamily} + onValueChange={(value: FontFamily) => + updateTextElement(trackId, element.id, { fontFamily: value }) + } + /> + </PropertyItemValue> + </PropertyItem> + <PropertyItem direction="column"> + <PropertyItemLabel>Font size</PropertyItemLabel> + <PropertyItemValue> + <div className="flex items-center gap-2"> + <Slider + defaultValue={[element.fontSize]} + min={8} + max={300} + step={1} + onValueChange={([value]) => + updateTextElement(trackId, element.id, { fontSize: value }) + } + className="w-full" + /> + <Input + type="number" + value={element.fontSize} + onChange={(e) => + updateTextElement(trackId, element.id, { + fontSize: parseInt(e.target.value), + }) + } + className="w-12 !text-xs h-7 rounded-sm text-center + [appearance:textfield] + [&::-webkit-outer-spin-button]:appearance-none + [&::-webkit-inner-spin-button]:appearance-none" + /> + </div> + </PropertyItemValue> + </PropertyItem> + </div> + ); +} diff --git a/apps/web/src/components/editor/selection-box.tsx b/apps/web/src/components/editor/selection-box.tsx index 5c452f7c..0a97c6f8 100644 --- a/apps/web/src/components/editor/selection-box.tsx +++ b/apps/web/src/components/editor/selection-box.tsx @@ -1,58 +1,58 @@ -"use client";
-
-import { useEffect, useRef } from "react";
-
-interface SelectionBoxProps {
- startPos: { x: number; y: number } | null;
- currentPos: { x: number; y: number } | null;
- containerRef: React.RefObject<HTMLElement>;
- isActive: boolean;
-}
-
-export function SelectionBox({
- startPos,
- currentPos,
- containerRef,
- isActive,
-}: SelectionBoxProps) {
- const selectionBoxRef = useRef<HTMLDivElement>(null);
-
- useEffect(() => {
- if (!isActive || !startPos || !currentPos || !containerRef.current) return;
-
- const container = containerRef.current;
- const containerRect = container.getBoundingClientRect();
-
- // Calculate relative positions within the container
- const startX = startPos.x - containerRect.left;
- const startY = startPos.y - containerRect.top;
- const currentX = currentPos.x - containerRect.left;
- const currentY = currentPos.y - containerRect.top;
-
- // Calculate the selection rectangle bounds
- const left = Math.min(startX, currentX);
- const top = Math.min(startY, currentY);
- const width = Math.abs(currentX - startX);
- const height = Math.abs(currentY - startY);
-
- // Update the selection box position and size
- if (selectionBoxRef.current) {
- selectionBoxRef.current.style.left = `${left}px`;
- selectionBoxRef.current.style.top = `${top}px`;
- selectionBoxRef.current.style.width = `${width}px`;
- selectionBoxRef.current.style.height = `${height}px`;
- }
- }, [startPos, currentPos, isActive, containerRef]);
-
- if (!isActive || !startPos || !currentPos) return null;
-
- return (
- <div
- ref={selectionBoxRef}
- className="absolute pointer-events-none z-50"
- style={{
- backgroundColor: "hsl(var(--foreground) / 0.1)",
- }}
- />
- );
-}
+"use client"; + +import { useEffect, useRef } from "react"; + +interface SelectionBoxProps { + startPos: { x: number; y: number } | null; + currentPos: { x: number; y: number } | null; + containerRef: React.RefObject<HTMLElement>; + isActive: boolean; +} + +export function SelectionBox({ + startPos, + currentPos, + containerRef, + isActive, +}: SelectionBoxProps) { + const selectionBoxRef = useRef<HTMLDivElement>(null); + + useEffect(() => { + if (!isActive || !startPos || !currentPos || !containerRef.current) return; + + const container = containerRef.current; + const containerRect = container.getBoundingClientRect(); + + // Calculate relative positions within the container + const startX = startPos.x - containerRect.left; + const startY = startPos.y - containerRect.top; + const currentX = currentPos.x - containerRect.left; + const currentY = currentPos.y - containerRect.top; + + // Calculate the selection rectangle bounds + const left = Math.min(startX, currentX); + const top = Math.min(startY, currentY); + const width = Math.abs(currentX - startX); + const height = Math.abs(currentY - startY); + + // Update the selection box position and size + if (selectionBoxRef.current) { + selectionBoxRef.current.style.left = `${left}px`; + selectionBoxRef.current.style.top = `${top}px`; + selectionBoxRef.current.style.width = `${width}px`; + selectionBoxRef.current.style.height = `${height}px`; + } + }, [startPos, currentPos, isActive, containerRef]); + + if (!isActive || !startPos || !currentPos) return null; + + return ( + <div + ref={selectionBoxRef} + className="absolute pointer-events-none z-50" + style={{ + backgroundColor: "hsl(var(--foreground) / 0.1)", + }} + /> + ); +} diff --git a/apps/web/src/components/editor/snap-indicator.tsx b/apps/web/src/components/editor/snap-indicator.tsx index 83a1f678..302a52bb 100644 --- a/apps/web/src/components/editor/snap-indicator.tsx +++ b/apps/web/src/components/editor/snap-indicator.tsx @@ -48,7 +48,7 @@ export function SnapIndicator({ width: "2px", }} > - <div className={`w-0.5 h-full bg-primary/40 opacity-80`} /> + <div className={"w-0.5 h-full bg-primary/40 opacity-80"} /> </div> ); } diff --git a/apps/web/src/components/editor/speed-control.tsx b/apps/web/src/components/editor/speed-control.tsx index 39281a9a..f2b0568d 100644 --- a/apps/web/src/components/editor/speed-control.tsx +++ b/apps/web/src/components/editor/speed-control.tsx @@ -43,4 +43,4 @@ export function SpeedControl() { </div> </div> ); -}
\ No newline at end of file +} diff --git a/apps/web/src/components/editor/timeline/index.tsx b/apps/web/src/components/editor/timeline/index.tsx index 2360eb8a..fd2b2a11 100644 --- a/apps/web/src/components/editor/timeline/index.tsx +++ b/apps/web/src/components/editor/timeline/index.tsx @@ -278,7 +278,7 @@ export function Timeline() { Math.min( duration, (mouseX + scrollLeft) / - (TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel) + (TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel) ) ); @@ -501,7 +501,9 @@ export function Timeline() { return ( <div - className={`h-full flex flex-col transition-colors duration-200 relative bg-panel rounded-sm overflow-hidden`} + className={ + "h-full flex flex-col transition-colors duration-200 relative bg-panel rounded-sm overflow-hidden" + } {...dragProps} onMouseEnter={() => setIsInTimeline(true)} onMouseLeave={() => setIsInTimeline(false)} @@ -598,19 +600,21 @@ export function Timeline() { return ( <div key={i} - className={`absolute top-0 bottom-0 ${isMainMarker + className={`absolute top-0 bottom-0 ${ + isMainMarker ? "border-l border-muted-foreground/40" : "border-l border-muted-foreground/20" - }`} + }`} style={{ left: `${time * TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel}px`, }} > <span - className={`absolute top-1 left-1 text-[0.6rem] ${isMainMarker + className={`absolute top-1 left-1 text-[0.6rem] ${ + isMainMarker ? "text-muted-foreground font-medium" : "text-muted-foreground/70" - }`} + }`} > {(() => { const formatTime = (seconds: number) => { @@ -620,13 +624,14 @@ export function Timeline() { if (hours > 0) { return `${hours}:${minutes.toString().padStart(2, "0")}:${Math.floor(secs).toString().padStart(2, "0")}`; - } else if (minutes > 0) { + } + if (minutes > 0) { return `${minutes}:${Math.floor(secs).toString().padStart(2, "0")}`; - } else if (interval >= 1) { + } + if (interval >= 1) { return `${Math.floor(secs)}s`; - } else { - return `${secs.toFixed(1)}s`; } + return `${secs.toFixed(1)}s`; }; return formatTime(time); })()} @@ -709,7 +714,7 @@ export function Timeline() { }} > {tracks.length === 0 ? ( - <div></div> + <div /> ) : ( <> {tracks.map((track, index) => ( diff --git a/apps/web/src/components/editor/timeline/timeline-playhead.tsx b/apps/web/src/components/editor/timeline/timeline-playhead.tsx index 7a357067..509ce9d7 100644 --- a/apps/web/src/components/editor/timeline/timeline-playhead.tsx +++ b/apps/web/src/components/editor/timeline/timeline-playhead.tsx @@ -1,116 +1,116 @@ -"use client";
-
-import { useRef } from "react";
-import { TimelineTrack } from "@/types/timeline";
-import {
- TIMELINE_CONSTANTS,
- getTotalTracksHeight,
-} from "@/constants/timeline-constants";
-import { useTimelinePlayhead } from "@/hooks/use-timeline-playhead";
-
-interface TimelinePlayheadProps {
- currentTime: number;
- duration: number;
- zoomLevel: number;
- tracks: TimelineTrack[];
- seek: (time: number) => void;
- rulerRef: React.RefObject<HTMLDivElement>;
- rulerScrollRef: React.RefObject<HTMLDivElement>;
- tracksScrollRef: React.RefObject<HTMLDivElement>;
- trackLabelsRef?: React.RefObject<HTMLDivElement>;
- timelineRef: React.RefObject<HTMLDivElement>;
- playheadRef?: React.RefObject<HTMLDivElement>;
- isSnappingToPlayhead?: boolean;
-}
-
-export function TimelinePlayhead({
- currentTime,
- duration,
- zoomLevel,
- tracks,
- seek,
- rulerRef,
- rulerScrollRef,
- tracksScrollRef,
- trackLabelsRef,
- timelineRef,
- playheadRef: externalPlayheadRef,
- isSnappingToPlayhead = false,
-}: TimelinePlayheadProps) {
- const internalPlayheadRef = useRef<HTMLDivElement>(null);
- const playheadRef = externalPlayheadRef || internalPlayheadRef;
- const { playheadPosition, handlePlayheadMouseDown } = useTimelinePlayhead({
- currentTime,
- duration,
- zoomLevel,
- seek,
- rulerRef,
- rulerScrollRef,
- tracksScrollRef,
- playheadRef,
- });
-
- // Use timeline container height minus a few pixels for breathing room
- const timelineContainerHeight = timelineRef.current?.offsetHeight || 400;
- const totalHeight = timelineContainerHeight - 8; // 8px padding from edges
-
- // Get dynamic track labels width, fallback to 0 if no tracks or no ref
- const trackLabelsWidth =
- tracks.length > 0 && trackLabelsRef?.current
- ? trackLabelsRef.current.offsetWidth
- : 0;
- const leftPosition =
- trackLabelsWidth +
- playheadPosition * TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel;
-
- return (
- <div
- ref={playheadRef}
- className="absolute pointer-events-auto z-[150]"
- style={{
- left: `${leftPosition}px`,
- top: 0,
- height: `${totalHeight}px`,
- width: "2px", // Slightly wider for better click target
- }}
- onMouseDown={handlePlayheadMouseDown}
- >
- {/* The playhead line spanning full height */}
- <div
- className={`absolute left-0 w-0.5 cursor-col-resize h-full ${isSnappingToPlayhead ? "bg-primary" : "bg-foreground"}`}
- />
-
- {/* Playhead dot indicator at the top (in ruler area) */}
- <div
- className={`absolute top-1 left-1/2 transform -translate-x-1/2 w-3 h-3 rounded-full border-2 shadow-sm ${isSnappingToPlayhead ? "bg-primary border-primary" : "bg-foreground border-foreground"}`}
- />
- </div>
- );
-}
-
-// Also export a hook for getting ruler handlers
-export function useTimelinePlayheadRuler({
- currentTime,
- duration,
- zoomLevel,
- seek,
- rulerRef,
- rulerScrollRef,
- tracksScrollRef,
- playheadRef,
-}: Omit<TimelinePlayheadProps, "tracks" | "trackLabelsRef" | "timelineRef">) {
- const { handleRulerMouseDown, isDraggingRuler } = useTimelinePlayhead({
- currentTime,
- duration,
- zoomLevel,
- seek,
- rulerRef,
- rulerScrollRef,
- tracksScrollRef,
- playheadRef,
- });
-
- return { handleRulerMouseDown, isDraggingRuler };
-}
-
-export { TimelinePlayhead as default };
+"use client"; + +import { useRef } from "react"; +import { TimelineTrack } from "@/types/timeline"; +import { + TIMELINE_CONSTANTS, + getTotalTracksHeight, +} from "@/constants/timeline-constants"; +import { useTimelinePlayhead } from "@/hooks/use-timeline-playhead"; + +interface TimelinePlayheadProps { + currentTime: number; + duration: number; + zoomLevel: number; + tracks: TimelineTrack[]; + seek: (time: number) => void; + rulerRef: React.RefObject<HTMLDivElement>; + rulerScrollRef: React.RefObject<HTMLDivElement>; + tracksScrollRef: React.RefObject<HTMLDivElement>; + trackLabelsRef?: React.RefObject<HTMLDivElement>; + timelineRef: React.RefObject<HTMLDivElement>; + playheadRef?: React.RefObject<HTMLDivElement>; + isSnappingToPlayhead?: boolean; +} + +export function TimelinePlayhead({ + currentTime, + duration, + zoomLevel, + tracks, + seek, + rulerRef, + rulerScrollRef, + tracksScrollRef, + trackLabelsRef, + timelineRef, + playheadRef: externalPlayheadRef, + isSnappingToPlayhead = false, +}: TimelinePlayheadProps) { + const internalPlayheadRef = useRef<HTMLDivElement>(null); + const playheadRef = externalPlayheadRef || internalPlayheadRef; + const { playheadPosition, handlePlayheadMouseDown } = useTimelinePlayhead({ + currentTime, + duration, + zoomLevel, + seek, + rulerRef, + rulerScrollRef, + tracksScrollRef, + playheadRef, + }); + + // Use timeline container height minus a few pixels for breathing room + const timelineContainerHeight = timelineRef.current?.offsetHeight || 400; + const totalHeight = timelineContainerHeight - 8; // 8px padding from edges + + // Get dynamic track labels width, fallback to 0 if no tracks or no ref + const trackLabelsWidth = + tracks.length > 0 && trackLabelsRef?.current + ? trackLabelsRef.current.offsetWidth + : 0; + const leftPosition = + trackLabelsWidth + + playheadPosition * TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel; + + return ( + <div + ref={playheadRef} + className="absolute pointer-events-auto z-[150]" + style={{ + left: `${leftPosition}px`, + top: 0, + height: `${totalHeight}px`, + width: "2px", // Slightly wider for better click target + }} + onMouseDown={handlePlayheadMouseDown} + > + {/* The playhead line spanning full height */} + <div + className={`absolute left-0 w-0.5 cursor-col-resize h-full ${isSnappingToPlayhead ? "bg-primary" : "bg-foreground"}`} + /> + + {/* Playhead dot indicator at the top (in ruler area) */} + <div + className={`absolute top-1 left-1/2 transform -translate-x-1/2 w-3 h-3 rounded-full border-2 shadow-sm ${isSnappingToPlayhead ? "bg-primary border-primary" : "bg-foreground border-foreground"}`} + /> + </div> + ); +} + +// Also export a hook for getting ruler handlers +export function useTimelinePlayheadRuler({ + currentTime, + duration, + zoomLevel, + seek, + rulerRef, + rulerScrollRef, + tracksScrollRef, + playheadRef, +}: Omit<TimelinePlayheadProps, "tracks" | "trackLabelsRef" | "timelineRef">) { + const { handleRulerMouseDown, isDraggingRuler } = useTimelinePlayhead({ + currentTime, + duration, + zoomLevel, + seek, + rulerRef, + rulerScrollRef, + tracksScrollRef, + playheadRef, + }); + + return { handleRulerMouseDown, isDraggingRuler }; +} + +export { TimelinePlayhead as default }; diff --git a/apps/web/src/components/editor/timeline/timeline-track.tsx b/apps/web/src/components/editor/timeline/timeline-track.tsx index 82ca0b98..097fc051 100644 --- a/apps/web/src/components/editor/timeline/timeline-track.tsx +++ b/apps/web/src/components/editor/timeline/timeline-track.tsx @@ -1,1151 +1,1151 @@ -"use client";
-
-import { useRef, useState, useEffect } from "react";
-import { useTimelineStore } from "@/stores/timeline-store";
-import { useMediaStore } from "@/stores/media-store";
-import { toast } from "sonner";
-import { TimelineElement } from "./timeline-element";
-import {
- TimelineTrack,
- sortTracksByOrder,
- ensureMainTrack,
- getMainTrack,
- canElementGoOnTrack,
-} from "@/types/timeline";
-import { usePlaybackStore } from "@/stores/playback-store";
-import type {
- TimelineElement as TimelineElementType,
- DragData,
-} from "@/types/timeline";
-import {
- snapTimeToFrame,
- TIMELINE_CONSTANTS,
-} from "@/constants/timeline-constants";
-import { useProjectStore } from "@/stores/project-store";
-import { useTimelineSnapping, SnapPoint } from "@/hooks/use-timeline-snapping";
-
-export function TimelineTrackContent({
- track,
- zoomLevel,
- onSnapPointChange,
-}: {
- track: TimelineTrack;
- zoomLevel: number;
- onSnapPointChange?: (snapPoint: SnapPoint | null) => void;
-}) {
- const { mediaItems } = useMediaStore();
- const {
- tracks,
- addTrack,
- moveElementToTrack,
- updateElementStartTime,
- updateElementStartTimeWithRipple,
- addElementToTrack,
- selectedElements,
- selectElement,
- dragState,
- startDrag: startDragAction,
- updateDragTime,
- endDrag: endDragAction,
- clearSelectedElements,
- insertTrackAt,
- snappingEnabled,
- rippleEditingEnabled,
- } = useTimelineStore();
-
- const { currentTime } = usePlaybackStore();
-
- // Initialize snapping hook
- const { snapElementPosition, snapElementEdge } = useTimelineSnapping({
- snapThreshold: 10,
- enableElementSnapping: snappingEnabled,
- enablePlayheadSnapping: snappingEnabled,
- });
-
- // Helper function for drop snapping that tries both edges
- const getDropSnappedTime = (
- dropTime: number,
- elementDuration: number,
- excludeElementId?: string
- ) => {
- if (!snappingEnabled) {
- // Use frame snapping if project has FPS, otherwise use decimal snapping
- const projectStore = useProjectStore.getState();
- const projectFps = projectStore.activeProject?.fps || 30;
- return snapTimeToFrame(dropTime, projectFps);
- }
-
- // Try snapping both start and end edges for drops
- const startSnapResult = snapElementEdge(
- dropTime,
- elementDuration,
- tracks,
- currentTime,
- zoomLevel,
- excludeElementId,
- true // snap to start edge
- );
-
- const endSnapResult = snapElementEdge(
- dropTime,
- elementDuration,
- tracks,
- currentTime,
- zoomLevel,
- excludeElementId,
- false // snap to end edge
- );
-
- // Choose the snap result with the smaller distance (closer snap)
- let bestSnapResult = startSnapResult;
- if (
- endSnapResult.snapPoint &&
- (!startSnapResult.snapPoint ||
- endSnapResult.snapDistance < startSnapResult.snapDistance)
- ) {
- bestSnapResult = endSnapResult;
- }
-
- return bestSnapResult.snappedTime;
- };
-
- const timelineRef = useRef<HTMLDivElement>(null);
- const [isDropping, setIsDropping] = useState(false);
- const [dropPosition, setDropPosition] = useState<number | null>(null);
- const [wouldOverlap, setWouldOverlap] = useState(false);
- const dragCounterRef = useRef(0);
- const [mouseDownLocation, setMouseDownLocation] = useState<{
- x: number;
- y: number;
- } | null>(null);
-
- // Set up mouse event listeners for drag
- useEffect(() => {
- if (!dragState.isDragging) return;
-
- const handleMouseMove = (e: MouseEvent) => {
- if (!timelineRef.current) return;
-
- // On first mouse move during drag, ensure the element is selected
- if (dragState.elementId && dragState.trackId) {
- const isSelected = selectedElements.some(
- (c) =>
- c.trackId === dragState.trackId &&
- c.elementId === dragState.elementId
- );
-
- if (!isSelected) {
- // Select this element (replacing other selections) since we're dragging it
- selectElement(dragState.trackId, dragState.elementId, false);
- }
- }
-
- const timelineRect = timelineRef.current.getBoundingClientRect();
- const mouseX = e.clientX - timelineRect.left;
- const mouseTime = Math.max(
- 0,
- mouseX / (TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel)
- );
- const adjustedTime = Math.max(0, mouseTime - dragState.clickOffsetTime);
-
- // Apply snapping if enabled
- let finalTime = adjustedTime;
- let snapPoint = null;
- if (snappingEnabled) {
- // Find the element being dragged to get its duration
- let elementDuration = 5; // fallback duration
- if (dragState.elementId && dragState.trackId) {
- const sourceTrack = tracks.find((t) => t.id === dragState.trackId);
- const element = sourceTrack?.elements.find(
- (e) => e.id === dragState.elementId
- );
- if (element) {
- elementDuration =
- element.duration - element.trimStart - element.trimEnd;
- }
- }
-
- // Try snapping both start and end edges
- const startSnapResult = snapElementEdge(
- adjustedTime,
- elementDuration,
- tracks,
- currentTime,
- zoomLevel,
- dragState.elementId || undefined,
- true // snap to start edge
- );
-
- const endSnapResult = snapElementEdge(
- adjustedTime,
- elementDuration,
- tracks,
- currentTime,
- zoomLevel,
- dragState.elementId || undefined,
- false // snap to end edge
- );
-
- // Choose the snap result with the smaller distance (closer snap)
- let bestSnapResult = startSnapResult;
- if (
- endSnapResult.snapPoint &&
- (!startSnapResult.snapPoint ||
- endSnapResult.snapDistance < startSnapResult.snapDistance)
- ) {
- bestSnapResult = endSnapResult;
- }
-
- finalTime = bestSnapResult.snappedTime;
- snapPoint = bestSnapResult.snapPoint;
-
- // Notify parent component about snap point change
- onSnapPointChange?.(snapPoint);
- } else {
- // Use frame snapping if project has FPS, otherwise use decimal snapping
- const projectStore = useProjectStore.getState();
- const projectFps = projectStore.activeProject?.fps || 30;
- finalTime = snapTimeToFrame(adjustedTime, projectFps);
-
- // Clear snap point when not snapping
- onSnapPointChange?.(null);
- }
-
- updateDragTime(finalTime);
- };
-
- const handleMouseUp = (e: MouseEvent) => {
- if (!dragState.elementId || !dragState.trackId) return;
-
- // If this track initiated the drag, we should handle the mouse up regardless of where it occurs
- const isTrackThatStartedDrag = dragState.trackId === track.id;
-
- const timelineRect = timelineRef.current?.getBoundingClientRect();
- if (!timelineRect) {
- if (isTrackThatStartedDrag) {
- if (rippleEditingEnabled) {
- updateElementStartTimeWithRipple(
- track.id,
- dragState.elementId,
- dragState.currentTime
- );
- } else {
- updateElementStartTime(
- track.id,
- dragState.elementId,
- dragState.currentTime
- );
- }
- endDragAction();
- // Clear snap point when drag ends
- onSnapPointChange?.(null);
- }
- return;
- }
-
- const isMouseOverThisTrack =
- e.clientY >= timelineRect.top && e.clientY <= timelineRect.bottom;
-
- if (!isMouseOverThisTrack && !isTrackThatStartedDrag) return;
-
- const finalTime = dragState.currentTime;
-
- if (isMouseOverThisTrack) {
- const sourceTrack = tracks.find((t) => t.id === dragState.trackId);
- const movingElement = sourceTrack?.elements.find(
- (c) => c.id === dragState.elementId
- );
-
- if (movingElement) {
- const movingElementDuration =
- movingElement.duration -
- movingElement.trimStart -
- movingElement.trimEnd;
- const movingElementEnd = finalTime + movingElementDuration;
-
- const targetTrack = tracks.find((t) => t.id === track.id);
- const hasOverlap = targetTrack?.elements.some((existingElement) => {
- if (
- dragState.trackId === track.id &&
- existingElement.id === dragState.elementId
- ) {
- return false;
- }
- const existingStart = existingElement.startTime;
- const existingEnd =
- existingElement.startTime +
- (existingElement.duration -
- existingElement.trimStart -
- existingElement.trimEnd);
- return finalTime < existingEnd && movingElementEnd > existingStart;
- });
-
- if (!hasOverlap) {
- if (dragState.trackId === track.id) {
- if (rippleEditingEnabled) {
- updateElementStartTimeWithRipple(
- track.id,
- dragState.elementId,
- finalTime
- );
- } else {
- updateElementStartTime(
- track.id,
- dragState.elementId,
- finalTime
- );
- }
- } else {
- moveElementToTrack(
- dragState.trackId,
- track.id,
- dragState.elementId
- );
- requestAnimationFrame(() => {
- if (rippleEditingEnabled) {
- updateElementStartTimeWithRipple(
- track.id,
- dragState.elementId!,
- finalTime
- );
- } else {
- updateElementStartTime(
- track.id,
- dragState.elementId!,
- finalTime
- );
- }
- });
- }
- }
- }
- } else if (isTrackThatStartedDrag) {
- // Mouse is not over this track, but this track started the drag
- // This means user released over ruler/outside - update position within same track
- const sourceTrack = tracks.find((t) => t.id === dragState.trackId);
- const movingElement = sourceTrack?.elements.find(
- (c) => c.id === dragState.elementId
- );
-
- if (movingElement) {
- const movingElementDuration =
- movingElement.duration -
- movingElement.trimStart -
- movingElement.trimEnd;
- const movingElementEnd = finalTime + movingElementDuration;
-
- const hasOverlap = track.elements.some((existingElement) => {
- if (existingElement.id === dragState.elementId) {
- return false;
- }
- const existingStart = existingElement.startTime;
- const existingEnd =
- existingElement.startTime +
- (existingElement.duration -
- existingElement.trimStart -
- existingElement.trimEnd);
- return finalTime < existingEnd && movingElementEnd > existingStart;
- });
-
- if (!hasOverlap) {
- if (rippleEditingEnabled) {
- updateElementStartTimeWithRipple(
- track.id,
- dragState.elementId,
- finalTime
- );
- } else {
- updateElementStartTime(track.id, dragState.elementId, finalTime);
- }
- }
- }
- }
-
- if (isTrackThatStartedDrag) {
- endDragAction();
- // Clear snap point when drag ends
- onSnapPointChange?.(null);
- }
- };
-
- document.addEventListener("mousemove", handleMouseMove);
- document.addEventListener("mouseup", handleMouseUp);
-
- return () => {
- document.removeEventListener("mousemove", handleMouseMove);
- document.removeEventListener("mouseup", handleMouseUp);
- };
- }, [
- dragState.isDragging,
- dragState.clickOffsetTime,
- dragState.elementId,
- dragState.trackId,
- dragState.currentTime,
- zoomLevel,
- tracks,
- track.id,
- updateDragTime,
- updateElementStartTime,
- moveElementToTrack,
- endDragAction,
- selectedElements,
- selectElement,
- onSnapPointChange,
- ]);
-
- const handleElementMouseDown = (
- e: React.MouseEvent,
- element: TimelineElementType
- ) => {
- setMouseDownLocation({ x: e.clientX, y: e.clientY });
-
- // Detect right-click (button 2) and handle selection without starting drag
- const isRightClick = e.button === 2;
- const isMultiSelect = e.metaKey || e.ctrlKey || e.shiftKey;
-
- if (isRightClick) {
- // Handle right-click selection
- const isSelected = selectedElements.some(
- (c) => c.trackId === track.id && c.elementId === element.id
- );
-
- // If element is not selected, select it (keep other selections if multi-select)
- if (!isSelected) {
- selectElement(track.id, element.id, isMultiSelect);
- }
- // If element is already selected, keep it selected
-
- // Don't start drag action for right-clicks
- return;
- }
-
- // Handle multi-selection for left-click with modifiers
- if (isMultiSelect) {
- selectElement(track.id, element.id, true);
- }
-
- // Calculate the offset from the left edge of the element to where the user clicked
- const elementElement = e.currentTarget as HTMLElement;
- const elementRect = elementElement.getBoundingClientRect();
- const clickOffsetX = e.clientX - elementRect.left;
- const clickOffsetTime =
- clickOffsetX / (TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel);
-
- startDragAction(
- element.id,
- track.id,
- e.clientX,
- element.startTime,
- clickOffsetTime
- );
- };
-
- const handleElementClick = (
- e: React.MouseEvent,
- element: TimelineElementType
- ) => {
- e.stopPropagation();
-
- // Check if mouse moved significantly
- if (mouseDownLocation) {
- const deltaX = Math.abs(e.clientX - mouseDownLocation.x);
- const deltaY = Math.abs(e.clientY - mouseDownLocation.y);
- // If it moved more than a few pixels, consider it a drag and not a click.
- if (deltaX > 5 || deltaY > 5) {
- setMouseDownLocation(null); // Reset for next interaction
- return;
- }
- }
-
- // Skip selection logic for multi-selection (handled in mousedown)
- if (e.metaKey || e.ctrlKey || e.shiftKey) {
- return;
- }
-
- // Handle single selection
- const isSelected = selectedElements.some(
- (c) => c.trackId === track.id && c.elementId === element.id
- );
-
- if (!isSelected) {
- // If element is not selected, select it (replacing other selections)
- selectElement(track.id, element.id, false);
- }
- // If element is already selected, keep it selected (do nothing)
- };
-
- const handleTrackDragOver = (e: React.DragEvent) => {
- e.preventDefault();
-
- // Handle both timeline elements and media items
- const hasTimelineElement = e.dataTransfer.types.includes(
- "application/x-timeline-element"
- );
- const hasMediaItem = e.dataTransfer.types.includes(
- "application/x-media-item"
- );
-
- if (!hasTimelineElement && !hasMediaItem) return;
-
- // Calculate drop position for overlap checking
- const trackContainer = e.currentTarget.querySelector(
- ".track-elements-container"
- ) as HTMLElement;
- let dropTime = 0;
- if (trackContainer) {
- const rect = trackContainer.getBoundingClientRect();
- const mouseX = Math.max(0, e.clientX - rect.left);
- dropTime = mouseX / (TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel);
- }
-
- // Check for potential overlaps and show appropriate feedback
- let wouldOverlap = false;
-
- if (hasMediaItem) {
- try {
- const mediaItemData = e.dataTransfer.getData(
- "application/x-media-item"
- );
- if (mediaItemData) {
- const dragData: DragData = JSON.parse(mediaItemData);
-
- if (dragData.type === "text") {
- // Text elements have default duration of 5 seconds
- const newElementDuration = 5;
- const snappedTime = getDropSnappedTime(
- dropTime,
- newElementDuration
- );
- const newElementEnd = snappedTime + newElementDuration;
-
- wouldOverlap = track.elements.some((existingElement) => {
- const existingStart = existingElement.startTime;
- const existingEnd =
- existingElement.startTime +
- (existingElement.duration -
- existingElement.trimStart -
- existingElement.trimEnd);
- return snappedTime < existingEnd && newElementEnd > existingStart;
- });
- } else {
- // Media elements
- const mediaItem = mediaItems.find(
- (item) => item.id === dragData.id
- );
- if (mediaItem) {
- const newElementDuration = mediaItem.duration || 5;
- const snappedTime = getDropSnappedTime(
- dropTime,
- newElementDuration
- );
- const newElementEnd = snappedTime + newElementDuration;
-
- wouldOverlap = track.elements.some((existingElement) => {
- const existingStart = existingElement.startTime;
- const existingEnd =
- existingElement.startTime +
- (existingElement.duration -
- existingElement.trimStart -
- existingElement.trimEnd);
- return (
- snappedTime < existingEnd && newElementEnd > existingStart
- );
- });
- }
- }
- }
- } catch (error) {
- // Continue with default behavior
- }
- } else if (hasTimelineElement) {
- try {
- const timelineElementData = e.dataTransfer.getData(
- "application/x-timeline-element"
- );
- if (timelineElementData) {
- const { elementId, trackId: fromTrackId } =
- JSON.parse(timelineElementData);
- const sourceTrack = tracks.find(
- (t: TimelineTrack) => t.id === fromTrackId
- );
- const movingElement = sourceTrack?.elements.find(
- (c: any) => c.id === elementId
- );
-
- if (movingElement) {
- const movingElementDuration =
- movingElement.duration -
- movingElement.trimStart -
- movingElement.trimEnd;
- const snappedTime = getDropSnappedTime(
- dropTime,
- movingElementDuration,
- elementId
- );
- const movingElementEnd = snappedTime + movingElementDuration;
-
- wouldOverlap = track.elements.some((existingElement) => {
- if (fromTrackId === track.id && existingElement.id === elementId)
- return false;
-
- const existingStart = existingElement.startTime;
- const existingEnd =
- existingElement.startTime +
- (existingElement.duration -
- existingElement.trimStart -
- existingElement.trimEnd);
- return (
- snappedTime < existingEnd && movingElementEnd > existingStart
- );
- });
- }
- }
- } catch (error) {
- // Continue with default behavior
- }
- }
-
- if (wouldOverlap) {
- e.dataTransfer.dropEffect = "none";
- setWouldOverlap(true);
- // Use default duration for position indicator
- setDropPosition(getDropSnappedTime(dropTime, 5));
- return;
- }
-
- e.dataTransfer.dropEffect = hasTimelineElement ? "move" : "copy";
- setWouldOverlap(false);
- // Use default duration for position indicator
- setDropPosition(getDropSnappedTime(dropTime, 5));
- };
-
- const handleTrackDragEnter = (e: React.DragEvent) => {
- e.preventDefault();
-
- const hasTimelineElement = e.dataTransfer.types.includes(
- "application/x-timeline-element"
- );
- const hasMediaItem = e.dataTransfer.types.includes(
- "application/x-media-item"
- );
-
- if (!hasTimelineElement && !hasMediaItem) return;
-
- dragCounterRef.current++;
- setIsDropping(true);
- };
-
- const handleTrackDragLeave = (e: React.DragEvent) => {
- e.preventDefault();
-
- const hasTimelineElement = e.dataTransfer.types.includes(
- "application/x-timeline-element"
- );
- const hasMediaItem = e.dataTransfer.types.includes(
- "application/x-media-item"
- );
-
- if (!hasTimelineElement && !hasMediaItem) return;
-
- dragCounterRef.current--;
-
- if (dragCounterRef.current === 0) {
- setIsDropping(false);
- setWouldOverlap(false);
- setDropPosition(null);
- }
- };
-
- const handleTrackDrop = (e: React.DragEvent) => {
- e.preventDefault();
- e.stopPropagation();
-
- // Debug logging
- console.log(
- JSON.stringify({
- message: "Drop event started in timeline track",
- dataTransferTypes: Array.from(e.dataTransfer.types),
- trackId: track.id,
- trackType: track.type,
- })
- );
-
- // Reset all drag states
- dragCounterRef.current = 0;
- setIsDropping(false);
- setWouldOverlap(false);
-
- const hasTimelineElement = e.dataTransfer.types.includes(
- "application/x-timeline-element"
- );
- const hasMediaItem = e.dataTransfer.types.includes(
- "application/x-media-item"
- );
-
- if (!hasTimelineElement && !hasMediaItem) return;
-
- const trackContainer = e.currentTarget.querySelector(
- ".track-elements-container"
- ) as HTMLElement;
- if (!trackContainer) return;
-
- const rect = trackContainer.getBoundingClientRect();
- const mouseX = Math.max(0, e.clientX - rect.left);
- const mouseY = e.clientY - rect.top; // Get Y position relative to this track
- const newStartTime =
- mouseX / (TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel);
- const projectStore = useProjectStore.getState();
- const projectFps = projectStore.activeProject?.fps || 30;
- const snappedTime = snapTimeToFrame(newStartTime, projectFps);
-
- // Calculate drop position relative to tracks
- const currentTrackIndex = tracks.findIndex((t) => t.id === track.id);
-
- // Determine drop zone within the track (top 20px, middle 20px, bottom 20px)
- let dropPosition: "above" | "on" | "below";
- if (mouseY < 20) {
- dropPosition = "above";
- } else if (mouseY > 40) {
- dropPosition = "below";
- } else {
- dropPosition = "on";
- }
-
- try {
- if (hasTimelineElement) {
- // Handle timeline element movement
- const timelineElementData = e.dataTransfer.getData(
- "application/x-timeline-element"
- );
- if (!timelineElementData) return;
-
- const {
- elementId,
- trackId: fromTrackId,
- clickOffsetTime = 0,
- } = JSON.parse(timelineElementData);
-
- // Find the element being moved
- const sourceTrack = tracks.find(
- (t: TimelineTrack) => t.id === fromTrackId
- );
- const movingElement = sourceTrack?.elements.find(
- (c: TimelineElementType) => c.id === elementId
- );
-
- if (!movingElement) {
- toast.error("Element not found");
- return;
- }
-
- // Check for overlaps with existing elements (excluding the moving element itself)
- const movingElementDuration =
- movingElement.duration -
- movingElement.trimStart -
- movingElement.trimEnd;
-
- // Adjust position based on where user clicked on the element
- const adjustedStartTime = newStartTime - clickOffsetTime;
- const snappedStartTime = getDropSnappedTime(
- adjustedStartTime,
- movingElementDuration,
- elementId
- );
- const finalStartTime = Math.max(0, snappedStartTime);
- const movingElementEnd = finalStartTime + movingElementDuration;
-
- const hasOverlap = track.elements.some((existingElement) => {
- // Skip the element being moved if it's on the same track
- if (fromTrackId === track.id && existingElement.id === elementId)
- return false;
-
- const existingStart = existingElement.startTime;
- const existingEnd =
- existingElement.startTime +
- (existingElement.duration -
- existingElement.trimStart -
- existingElement.trimEnd);
-
- // Check if elements overlap
- return (
- finalStartTime < existingEnd && movingElementEnd > existingStart
- );
- });
-
- if (hasOverlap) {
- toast.error(
- "Cannot move element here - it would overlap with existing elements"
- );
- return;
- }
-
- if (fromTrackId === track.id) {
- // Moving within same track
- if (rippleEditingEnabled) {
- updateElementStartTimeWithRipple(
- track.id,
- elementId,
- finalStartTime
- );
- } else {
- updateElementStartTime(track.id, elementId, finalStartTime);
- }
- } else {
- // Moving to different track
- moveElementToTrack(fromTrackId, track.id, elementId);
- requestAnimationFrame(() => {
- if (rippleEditingEnabled) {
- updateElementStartTimeWithRipple(
- track.id,
- elementId,
- finalStartTime
- );
- } else {
- updateElementStartTime(track.id, elementId, finalStartTime);
- }
- });
- }
- } else if (hasMediaItem) {
- // Handle media item drop
- const mediaItemData = e.dataTransfer.getData(
- "application/x-media-item"
- );
- if (!mediaItemData) return;
-
- const dragData: DragData = JSON.parse(mediaItemData);
-
- if (dragData.type === "text") {
- let targetTrackId = track.id;
- let targetTrack = track;
-
- // Handle position-aware track creation for text
- if (track.type !== "text" || dropPosition !== "on") {
- // Text tracks should go above the main track
- const mainTrack = getMainTrack(tracks);
- let insertIndex: number;
-
- if (dropPosition === "above") {
- insertIndex = currentTrackIndex;
- } else if (dropPosition === "below") {
- insertIndex = currentTrackIndex + 1;
- } else {
- // dropPosition === "on" but track is not text type
- // Insert above main track if main track exists, otherwise at top
- if (mainTrack) {
- const mainTrackIndex = tracks.findIndex(
- (t) => t.id === mainTrack.id
- );
- insertIndex = mainTrackIndex;
- } else {
- insertIndex = 0; // Top of timeline
- }
- }
-
- targetTrackId = insertTrackAt("text", insertIndex);
- // Get the updated tracks array after creating the new track
- const updatedTracks = useTimelineStore.getState().tracks;
- const newTargetTrack = updatedTracks.find(
- (t) => t.id === targetTrackId
- );
- if (!newTargetTrack) return;
- targetTrack = newTargetTrack;
- }
-
- // Check for overlaps with existing elements in target track
- const newElementDuration = 5; // Default text duration
- const textSnappedTime = getDropSnappedTime(
- newStartTime,
- newElementDuration
- );
- const newElementEnd = textSnappedTime + newElementDuration;
-
- const hasOverlap = targetTrack.elements.some((existingElement) => {
- const existingStart = existingElement.startTime;
- const existingEnd =
- existingElement.startTime +
- (existingElement.duration -
- existingElement.trimStart -
- existingElement.trimEnd);
-
- // Check if elements overlap
- return (
- textSnappedTime < existingEnd && newElementEnd > existingStart
- );
- });
-
- if (hasOverlap) {
- toast.error(
- "Cannot place element here - it would overlap with existing elements"
- );
- return;
- }
-
- addElementToTrack(targetTrackId, {
- type: "text",
- name: dragData.name || "Text",
- content: dragData.content || "Default Text",
- duration: TIMELINE_CONSTANTS.DEFAULT_TEXT_DURATION,
- startTime: textSnappedTime,
- trimStart: 0,
- trimEnd: 0,
- fontSize: 48,
- fontFamily: "Arial",
- color: "#ffffff",
- backgroundColor: "transparent",
- textAlign: "center",
- fontWeight: "normal",
- fontStyle: "normal",
- textDecoration: "none",
- x: 0,
- y: 0,
- rotation: 0,
- opacity: 1,
- });
- } else {
- // Handle media items
- const mediaItem = mediaItems.find((item) => item.id === dragData.id);
-
- if (!mediaItem) {
- toast.error("Media item not found");
- return;
- }
-
- let targetTrackId = track.id;
-
- // Check if track type is compatible
- const isVideoOrImage =
- dragData.type === "video" || dragData.type === "image";
- const isAudio = dragData.type === "audio";
- const isCompatible = isVideoOrImage
- ? canElementGoOnTrack("media", track.type)
- : isAudio
- ? canElementGoOnTrack("media", track.type)
- : false;
-
- let targetTrack = tracks.find((t) => t.id === targetTrackId);
-
- // Handle position-aware track creation for media elements
- if (!isCompatible || dropPosition !== "on") {
- if (isVideoOrImage) {
- // For video/image, check if we need a main track or additional media track
- const mainTrack = getMainTrack(tracks);
-
- if (!mainTrack) {
- // No main track exists, create it
- targetTrackId = addTrack("media");
- const updatedTracks = useTimelineStore.getState().tracks;
- const newTargetTrack = updatedTracks.find(
- (t) => t.id === targetTrackId
- );
- if (!newTargetTrack) return;
- targetTrack = newTargetTrack;
- } else if (
- mainTrack.elements.length === 0 &&
- dropPosition === "on"
- ) {
- // Main track exists and is empty, use it
- targetTrackId = mainTrack.id;
- targetTrack = mainTrack;
- } else {
- // Create new media track
- let insertIndex: number;
-
- if (dropPosition === "above") {
- insertIndex = currentTrackIndex;
- } else if (dropPosition === "below") {
- insertIndex = currentTrackIndex + 1;
- } else {
- // Insert above main track
- const mainTrackIndex = tracks.findIndex(
- (t) => t.id === mainTrack.id
- );
- insertIndex = mainTrackIndex;
- }
-
- targetTrackId = insertTrackAt("media", insertIndex);
- const updatedTracks = useTimelineStore.getState().tracks;
- const newTargetTrack = updatedTracks.find(
- (t) => t.id === targetTrackId
- );
- if (!newTargetTrack) return;
- targetTrack = newTargetTrack;
- }
- } else if (isAudio) {
- // Audio tracks go at the bottom
- const mainTrack = getMainTrack(tracks);
- let insertIndex: number;
-
- if (dropPosition === "above") {
- insertIndex = currentTrackIndex;
- } else if (dropPosition === "below") {
- insertIndex = currentTrackIndex + 1;
- } else {
- // Insert after main track (bottom area)
- if (mainTrack) {
- const mainTrackIndex = tracks.findIndex(
- (t) => t.id === mainTrack.id
- );
- insertIndex = mainTrackIndex + 1;
- } else {
- insertIndex = tracks.length; // Bottom of timeline
- }
- }
-
- targetTrackId = insertTrackAt("audio", insertIndex);
- const updatedTracks = useTimelineStore.getState().tracks;
- const newTargetTrack = updatedTracks.find(
- (t) => t.id === targetTrackId
- );
- if (!newTargetTrack) return;
- targetTrack = newTargetTrack;
- }
- }
-
- if (!targetTrack) return;
-
- // Check for overlaps with existing elements in target track
- const newElementDuration = mediaItem.duration || 5;
- const mediaSnappedTime = getDropSnappedTime(
- newStartTime,
- newElementDuration
- );
- const newElementEnd = mediaSnappedTime + newElementDuration;
-
- const hasOverlap = targetTrack.elements.some((existingElement) => {
- const existingStart = existingElement.startTime;
- const existingEnd =
- existingElement.startTime +
- (existingElement.duration -
- existingElement.trimStart -
- existingElement.trimEnd);
-
- // Check if elements overlap
- return (
- mediaSnappedTime < existingEnd && newElementEnd > existingStart
- );
- });
-
- if (hasOverlap) {
- toast.error(
- "Cannot place element here - it would overlap with existing elements"
- );
- return;
- }
-
- addElementToTrack(targetTrackId, {
- type: "media",
- mediaId: mediaItem.id,
- name: mediaItem.name,
- duration: mediaItem.duration || 5,
- startTime: mediaSnappedTime,
- trimStart: 0,
- trimEnd: 0,
- });
- }
- }
- } catch (error) {
- console.error("Error handling drop:", error);
- toast.error("Failed to add media to track");
- }
- };
-
- return (
- <div
- className="w-full h-full hover:bg-muted/20"
- onClick={(e) => {
- // If clicking empty area (not on an element), deselect all elements
- if (!(e.target as HTMLElement).closest(".timeline-element")) {
- clearSelectedElements();
- }
- }}
- onDragOver={handleTrackDragOver}
- onDragEnter={handleTrackDragEnter}
- onDragLeave={handleTrackDragLeave}
- onDrop={handleTrackDrop}
- >
- <div
- ref={timelineRef}
- className="h-full relative track-elements-container min-w-full"
- >
- {track.elements.length === 0 ? (
- <div
- className={`h-full w-full rounded-sm border-2 border-dashed flex items-center justify-center text-xs text-muted-foreground transition-colors ${
- isDropping
- ? wouldOverlap
- ? "border-red-500 bg-red-500/10 text-red-600"
- : "border-blue-500 bg-blue-500/10 text-blue-600"
- : "border-muted/30"
- }`}
- >
- {isDropping
- ? wouldOverlap
- ? "Cannot drop - would overlap"
- : "Drop element here"
- : ""}
- </div>
- ) : (
- <>
- {track.elements.map((element) => {
- const isSelected = selectedElements.some(
- (c) => c.trackId === track.id && c.elementId === element.id
- );
-
- const handleElementSplit = () => {
- const { currentTime } = usePlaybackStore();
- const { splitElement } = useTimelineStore();
- const splitTime = currentTime;
- const effectiveStart = element.startTime;
- const effectiveEnd =
- element.startTime +
- (element.duration - element.trimStart - element.trimEnd);
-
- if (splitTime > effectiveStart && splitTime < effectiveEnd) {
- const secondElementId = splitElement(
- track.id,
- element.id,
- splitTime
- );
- if (!secondElementId) {
- toast.error("Failed to split element");
- }
- } else {
- toast.error("Playhead must be within element to split");
- }
- };
-
- const handleElementDuplicate = () => {
- const { addElementToTrack } = useTimelineStore.getState();
- const { id, ...elementWithoutId } = element;
- addElementToTrack(track.id, {
- ...elementWithoutId,
- name: element.name + " (copy)",
- startTime:
- element.startTime +
- (element.duration - element.trimStart - element.trimEnd) +
- 0.1,
- });
- };
-
- const handleElementDelete = () => {
- const { removeElementFromTrack } = useTimelineStore.getState();
- removeElementFromTrack(track.id, element.id);
- };
-
- return (
- <TimelineElement
- key={element.id}
- element={element}
- track={track}
- zoomLevel={zoomLevel}
- isSelected={isSelected}
- onElementMouseDown={handleElementMouseDown}
- onElementClick={handleElementClick}
- />
- );
- })}
- </>
- )}
- </div>
- </div>
- );
-}
+"use client"; + +import { useRef, useState, useEffect } from "react"; +import { useTimelineStore } from "@/stores/timeline-store"; +import { useMediaStore } from "@/stores/media-store"; +import { toast } from "sonner"; +import { TimelineElement } from "./timeline-element"; +import { + TimelineTrack, + sortTracksByOrder, + ensureMainTrack, + getMainTrack, + canElementGoOnTrack, +} from "@/types/timeline"; +import { usePlaybackStore } from "@/stores/playback-store"; +import type { + TimelineElement as TimelineElementType, + DragData, +} from "@/types/timeline"; +import { + snapTimeToFrame, + TIMELINE_CONSTANTS, +} from "@/constants/timeline-constants"; +import { useProjectStore } from "@/stores/project-store"; +import { useTimelineSnapping, SnapPoint } from "@/hooks/use-timeline-snapping"; + +export function TimelineTrackContent({ + track, + zoomLevel, + onSnapPointChange, +}: { + track: TimelineTrack; + zoomLevel: number; + onSnapPointChange?: (snapPoint: SnapPoint | null) => void; +}) { + const { mediaItems } = useMediaStore(); + const { + tracks, + addTrack, + moveElementToTrack, + updateElementStartTime, + updateElementStartTimeWithRipple, + addElementToTrack, + selectedElements, + selectElement, + dragState, + startDrag: startDragAction, + updateDragTime, + endDrag: endDragAction, + clearSelectedElements, + insertTrackAt, + snappingEnabled, + rippleEditingEnabled, + } = useTimelineStore(); + + const { currentTime } = usePlaybackStore(); + + // Initialize snapping hook + const { snapElementPosition, snapElementEdge } = useTimelineSnapping({ + snapThreshold: 10, + enableElementSnapping: snappingEnabled, + enablePlayheadSnapping: snappingEnabled, + }); + + // Helper function for drop snapping that tries both edges + const getDropSnappedTime = ( + dropTime: number, + elementDuration: number, + excludeElementId?: string + ) => { + if (!snappingEnabled) { + // Use frame snapping if project has FPS, otherwise use decimal snapping + const projectStore = useProjectStore.getState(); + const projectFps = projectStore.activeProject?.fps || 30; + return snapTimeToFrame(dropTime, projectFps); + } + + // Try snapping both start and end edges for drops + const startSnapResult = snapElementEdge( + dropTime, + elementDuration, + tracks, + currentTime, + zoomLevel, + excludeElementId, + true // snap to start edge + ); + + const endSnapResult = snapElementEdge( + dropTime, + elementDuration, + tracks, + currentTime, + zoomLevel, + excludeElementId, + false // snap to end edge + ); + + // Choose the snap result with the smaller distance (closer snap) + let bestSnapResult = startSnapResult; + if ( + endSnapResult.snapPoint && + (!startSnapResult.snapPoint || + endSnapResult.snapDistance < startSnapResult.snapDistance) + ) { + bestSnapResult = endSnapResult; + } + + return bestSnapResult.snappedTime; + }; + + const timelineRef = useRef<HTMLDivElement>(null); + const [isDropping, setIsDropping] = useState(false); + const [dropPosition, setDropPosition] = useState<number | null>(null); + const [wouldOverlap, setWouldOverlap] = useState(false); + const dragCounterRef = useRef(0); + const [mouseDownLocation, setMouseDownLocation] = useState<{ + x: number; + y: number; + } | null>(null); + + // Set up mouse event listeners for drag + useEffect(() => { + if (!dragState.isDragging) return; + + const handleMouseMove = (e: MouseEvent) => { + if (!timelineRef.current) return; + + // On first mouse move during drag, ensure the element is selected + if (dragState.elementId && dragState.trackId) { + const isSelected = selectedElements.some( + (c) => + c.trackId === dragState.trackId && + c.elementId === dragState.elementId + ); + + if (!isSelected) { + // Select this element (replacing other selections) since we're dragging it + selectElement(dragState.trackId, dragState.elementId, false); + } + } + + const timelineRect = timelineRef.current.getBoundingClientRect(); + const mouseX = e.clientX - timelineRect.left; + const mouseTime = Math.max( + 0, + mouseX / (TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel) + ); + const adjustedTime = Math.max(0, mouseTime - dragState.clickOffsetTime); + + // Apply snapping if enabled + let finalTime = adjustedTime; + let snapPoint = null; + if (snappingEnabled) { + // Find the element being dragged to get its duration + let elementDuration = 5; // fallback duration + if (dragState.elementId && dragState.trackId) { + const sourceTrack = tracks.find((t) => t.id === dragState.trackId); + const element = sourceTrack?.elements.find( + (e) => e.id === dragState.elementId + ); + if (element) { + elementDuration = + element.duration - element.trimStart - element.trimEnd; + } + } + + // Try snapping both start and end edges + const startSnapResult = snapElementEdge( + adjustedTime, + elementDuration, + tracks, + currentTime, + zoomLevel, + dragState.elementId || undefined, + true // snap to start edge + ); + + const endSnapResult = snapElementEdge( + adjustedTime, + elementDuration, + tracks, + currentTime, + zoomLevel, + dragState.elementId || undefined, + false // snap to end edge + ); + + // Choose the snap result with the smaller distance (closer snap) + let bestSnapResult = startSnapResult; + if ( + endSnapResult.snapPoint && + (!startSnapResult.snapPoint || + endSnapResult.snapDistance < startSnapResult.snapDistance) + ) { + bestSnapResult = endSnapResult; + } + + finalTime = bestSnapResult.snappedTime; + snapPoint = bestSnapResult.snapPoint; + + // Notify parent component about snap point change + onSnapPointChange?.(snapPoint); + } else { + // Use frame snapping if project has FPS, otherwise use decimal snapping + const projectStore = useProjectStore.getState(); + const projectFps = projectStore.activeProject?.fps || 30; + finalTime = snapTimeToFrame(adjustedTime, projectFps); + + // Clear snap point when not snapping + onSnapPointChange?.(null); + } + + updateDragTime(finalTime); + }; + + const handleMouseUp = (e: MouseEvent) => { + if (!dragState.elementId || !dragState.trackId) return; + + // If this track initiated the drag, we should handle the mouse up regardless of where it occurs + const isTrackThatStartedDrag = dragState.trackId === track.id; + + const timelineRect = timelineRef.current?.getBoundingClientRect(); + if (!timelineRect) { + if (isTrackThatStartedDrag) { + if (rippleEditingEnabled) { + updateElementStartTimeWithRipple( + track.id, + dragState.elementId, + dragState.currentTime + ); + } else { + updateElementStartTime( + track.id, + dragState.elementId, + dragState.currentTime + ); + } + endDragAction(); + // Clear snap point when drag ends + onSnapPointChange?.(null); + } + return; + } + + const isMouseOverThisTrack = + e.clientY >= timelineRect.top && e.clientY <= timelineRect.bottom; + + if (!isMouseOverThisTrack && !isTrackThatStartedDrag) return; + + const finalTime = dragState.currentTime; + + if (isMouseOverThisTrack) { + const sourceTrack = tracks.find((t) => t.id === dragState.trackId); + const movingElement = sourceTrack?.elements.find( + (c) => c.id === dragState.elementId + ); + + if (movingElement) { + const movingElementDuration = + movingElement.duration - + movingElement.trimStart - + movingElement.trimEnd; + const movingElementEnd = finalTime + movingElementDuration; + + const targetTrack = tracks.find((t) => t.id === track.id); + const hasOverlap = targetTrack?.elements.some((existingElement) => { + if ( + dragState.trackId === track.id && + existingElement.id === dragState.elementId + ) { + return false; + } + const existingStart = existingElement.startTime; + const existingEnd = + existingElement.startTime + + (existingElement.duration - + existingElement.trimStart - + existingElement.trimEnd); + return finalTime < existingEnd && movingElementEnd > existingStart; + }); + + if (!hasOverlap) { + if (dragState.trackId === track.id) { + if (rippleEditingEnabled) { + updateElementStartTimeWithRipple( + track.id, + dragState.elementId, + finalTime + ); + } else { + updateElementStartTime( + track.id, + dragState.elementId, + finalTime + ); + } + } else { + moveElementToTrack( + dragState.trackId, + track.id, + dragState.elementId + ); + requestAnimationFrame(() => { + if (rippleEditingEnabled) { + updateElementStartTimeWithRipple( + track.id, + dragState.elementId!, + finalTime + ); + } else { + updateElementStartTime( + track.id, + dragState.elementId!, + finalTime + ); + } + }); + } + } + } + } else if (isTrackThatStartedDrag) { + // Mouse is not over this track, but this track started the drag + // This means user released over ruler/outside - update position within same track + const sourceTrack = tracks.find((t) => t.id === dragState.trackId); + const movingElement = sourceTrack?.elements.find( + (c) => c.id === dragState.elementId + ); + + if (movingElement) { + const movingElementDuration = + movingElement.duration - + movingElement.trimStart - + movingElement.trimEnd; + const movingElementEnd = finalTime + movingElementDuration; + + const hasOverlap = track.elements.some((existingElement) => { + if (existingElement.id === dragState.elementId) { + return false; + } + const existingStart = existingElement.startTime; + const existingEnd = + existingElement.startTime + + (existingElement.duration - + existingElement.trimStart - + existingElement.trimEnd); + return finalTime < existingEnd && movingElementEnd > existingStart; + }); + + if (!hasOverlap) { + if (rippleEditingEnabled) { + updateElementStartTimeWithRipple( + track.id, + dragState.elementId, + finalTime + ); + } else { + updateElementStartTime(track.id, dragState.elementId, finalTime); + } + } + } + } + + if (isTrackThatStartedDrag) { + endDragAction(); + // Clear snap point when drag ends + onSnapPointChange?.(null); + } + }; + + document.addEventListener("mousemove", handleMouseMove); + document.addEventListener("mouseup", handleMouseUp); + + return () => { + document.removeEventListener("mousemove", handleMouseMove); + document.removeEventListener("mouseup", handleMouseUp); + }; + }, [ + dragState.isDragging, + dragState.clickOffsetTime, + dragState.elementId, + dragState.trackId, + dragState.currentTime, + zoomLevel, + tracks, + track.id, + updateDragTime, + updateElementStartTime, + moveElementToTrack, + endDragAction, + selectedElements, + selectElement, + onSnapPointChange, + ]); + + const handleElementMouseDown = ( + e: React.MouseEvent, + element: TimelineElementType + ) => { + setMouseDownLocation({ x: e.clientX, y: e.clientY }); + + // Detect right-click (button 2) and handle selection without starting drag + const isRightClick = e.button === 2; + const isMultiSelect = e.metaKey || e.ctrlKey || e.shiftKey; + + if (isRightClick) { + // Handle right-click selection + const isSelected = selectedElements.some( + (c) => c.trackId === track.id && c.elementId === element.id + ); + + // If element is not selected, select it (keep other selections if multi-select) + if (!isSelected) { + selectElement(track.id, element.id, isMultiSelect); + } + // If element is already selected, keep it selected + + // Don't start drag action for right-clicks + return; + } + + // Handle multi-selection for left-click with modifiers + if (isMultiSelect) { + selectElement(track.id, element.id, true); + } + + // Calculate the offset from the left edge of the element to where the user clicked + const elementElement = e.currentTarget as HTMLElement; + const elementRect = elementElement.getBoundingClientRect(); + const clickOffsetX = e.clientX - elementRect.left; + const clickOffsetTime = + clickOffsetX / (TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel); + + startDragAction( + element.id, + track.id, + e.clientX, + element.startTime, + clickOffsetTime + ); + }; + + const handleElementClick = ( + e: React.MouseEvent, + element: TimelineElementType + ) => { + e.stopPropagation(); + + // Check if mouse moved significantly + if (mouseDownLocation) { + const deltaX = Math.abs(e.clientX - mouseDownLocation.x); + const deltaY = Math.abs(e.clientY - mouseDownLocation.y); + // If it moved more than a few pixels, consider it a drag and not a click. + if (deltaX > 5 || deltaY > 5) { + setMouseDownLocation(null); // Reset for next interaction + return; + } + } + + // Skip selection logic for multi-selection (handled in mousedown) + if (e.metaKey || e.ctrlKey || e.shiftKey) { + return; + } + + // Handle single selection + const isSelected = selectedElements.some( + (c) => c.trackId === track.id && c.elementId === element.id + ); + + if (!isSelected) { + // If element is not selected, select it (replacing other selections) + selectElement(track.id, element.id, false); + } + // If element is already selected, keep it selected (do nothing) + }; + + const handleTrackDragOver = (e: React.DragEvent) => { + e.preventDefault(); + + // Handle both timeline elements and media items + const hasTimelineElement = e.dataTransfer.types.includes( + "application/x-timeline-element" + ); + const hasMediaItem = e.dataTransfer.types.includes( + "application/x-media-item" + ); + + if (!hasTimelineElement && !hasMediaItem) return; + + // Calculate drop position for overlap checking + const trackContainer = e.currentTarget.querySelector( + ".track-elements-container" + ) as HTMLElement; + let dropTime = 0; + if (trackContainer) { + const rect = trackContainer.getBoundingClientRect(); + const mouseX = Math.max(0, e.clientX - rect.left); + dropTime = mouseX / (TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel); + } + + // Check for potential overlaps and show appropriate feedback + let wouldOverlap = false; + + if (hasMediaItem) { + try { + const mediaItemData = e.dataTransfer.getData( + "application/x-media-item" + ); + if (mediaItemData) { + const dragData: DragData = JSON.parse(mediaItemData); + + if (dragData.type === "text") { + // Text elements have default duration of 5 seconds + const newElementDuration = 5; + const snappedTime = getDropSnappedTime( + dropTime, + newElementDuration + ); + const newElementEnd = snappedTime + newElementDuration; + + wouldOverlap = track.elements.some((existingElement) => { + const existingStart = existingElement.startTime; + const existingEnd = + existingElement.startTime + + (existingElement.duration - + existingElement.trimStart - + existingElement.trimEnd); + return snappedTime < existingEnd && newElementEnd > existingStart; + }); + } else { + // Media elements + const mediaItem = mediaItems.find( + (item) => item.id === dragData.id + ); + if (mediaItem) { + const newElementDuration = mediaItem.duration || 5; + const snappedTime = getDropSnappedTime( + dropTime, + newElementDuration + ); + const newElementEnd = snappedTime + newElementDuration; + + wouldOverlap = track.elements.some((existingElement) => { + const existingStart = existingElement.startTime; + const existingEnd = + existingElement.startTime + + (existingElement.duration - + existingElement.trimStart - + existingElement.trimEnd); + return ( + snappedTime < existingEnd && newElementEnd > existingStart + ); + }); + } + } + } + } catch (error) { + // Continue with default behavior + } + } else if (hasTimelineElement) { + try { + const timelineElementData = e.dataTransfer.getData( + "application/x-timeline-element" + ); + if (timelineElementData) { + const { elementId, trackId: fromTrackId } = + JSON.parse(timelineElementData); + const sourceTrack = tracks.find( + (t: TimelineTrack) => t.id === fromTrackId + ); + const movingElement = sourceTrack?.elements.find( + (c: any) => c.id === elementId + ); + + if (movingElement) { + const movingElementDuration = + movingElement.duration - + movingElement.trimStart - + movingElement.trimEnd; + const snappedTime = getDropSnappedTime( + dropTime, + movingElementDuration, + elementId + ); + const movingElementEnd = snappedTime + movingElementDuration; + + wouldOverlap = track.elements.some((existingElement) => { + if (fromTrackId === track.id && existingElement.id === elementId) + return false; + + const existingStart = existingElement.startTime; + const existingEnd = + existingElement.startTime + + (existingElement.duration - + existingElement.trimStart - + existingElement.trimEnd); + return ( + snappedTime < existingEnd && movingElementEnd > existingStart + ); + }); + } + } + } catch (error) { + // Continue with default behavior + } + } + + if (wouldOverlap) { + e.dataTransfer.dropEffect = "none"; + setWouldOverlap(true); + // Use default duration for position indicator + setDropPosition(getDropSnappedTime(dropTime, 5)); + return; + } + + e.dataTransfer.dropEffect = hasTimelineElement ? "move" : "copy"; + setWouldOverlap(false); + // Use default duration for position indicator + setDropPosition(getDropSnappedTime(dropTime, 5)); + }; + + const handleTrackDragEnter = (e: React.DragEvent) => { + e.preventDefault(); + + const hasTimelineElement = e.dataTransfer.types.includes( + "application/x-timeline-element" + ); + const hasMediaItem = e.dataTransfer.types.includes( + "application/x-media-item" + ); + + if (!hasTimelineElement && !hasMediaItem) return; + + dragCounterRef.current++; + setIsDropping(true); + }; + + const handleTrackDragLeave = (e: React.DragEvent) => { + e.preventDefault(); + + const hasTimelineElement = e.dataTransfer.types.includes( + "application/x-timeline-element" + ); + const hasMediaItem = e.dataTransfer.types.includes( + "application/x-media-item" + ); + + if (!hasTimelineElement && !hasMediaItem) return; + + dragCounterRef.current--; + + if (dragCounterRef.current === 0) { + setIsDropping(false); + setWouldOverlap(false); + setDropPosition(null); + } + }; + + const handleTrackDrop = (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + + // Debug logging + console.log( + JSON.stringify({ + message: "Drop event started in timeline track", + dataTransferTypes: Array.from(e.dataTransfer.types), + trackId: track.id, + trackType: track.type, + }) + ); + + // Reset all drag states + dragCounterRef.current = 0; + setIsDropping(false); + setWouldOverlap(false); + + const hasTimelineElement = e.dataTransfer.types.includes( + "application/x-timeline-element" + ); + const hasMediaItem = e.dataTransfer.types.includes( + "application/x-media-item" + ); + + if (!hasTimelineElement && !hasMediaItem) return; + + const trackContainer = e.currentTarget.querySelector( + ".track-elements-container" + ) as HTMLElement; + if (!trackContainer) return; + + const rect = trackContainer.getBoundingClientRect(); + const mouseX = Math.max(0, e.clientX - rect.left); + const mouseY = e.clientY - rect.top; // Get Y position relative to this track + const newStartTime = + mouseX / (TIMELINE_CONSTANTS.PIXELS_PER_SECOND * zoomLevel); + const projectStore = useProjectStore.getState(); + const projectFps = projectStore.activeProject?.fps || 30; + const snappedTime = snapTimeToFrame(newStartTime, projectFps); + + // Calculate drop position relative to tracks + const currentTrackIndex = tracks.findIndex((t) => t.id === track.id); + + // Determine drop zone within the track (top 20px, middle 20px, bottom 20px) + let dropPosition: "above" | "on" | "below"; + if (mouseY < 20) { + dropPosition = "above"; + } else if (mouseY > 40) { + dropPosition = "below"; + } else { + dropPosition = "on"; + } + + try { + if (hasTimelineElement) { + // Handle timeline element movement + const timelineElementData = e.dataTransfer.getData( + "application/x-timeline-element" + ); + if (!timelineElementData) return; + + const { + elementId, + trackId: fromTrackId, + clickOffsetTime = 0, + } = JSON.parse(timelineElementData); + + // Find the element being moved + const sourceTrack = tracks.find( + (t: TimelineTrack) => t.id === fromTrackId + ); + const movingElement = sourceTrack?.elements.find( + (c: TimelineElementType) => c.id === elementId + ); + + if (!movingElement) { + toast.error("Element not found"); + return; + } + + // Check for overlaps with existing elements (excluding the moving element itself) + const movingElementDuration = + movingElement.duration - + movingElement.trimStart - + movingElement.trimEnd; + + // Adjust position based on where user clicked on the element + const adjustedStartTime = newStartTime - clickOffsetTime; + const snappedStartTime = getDropSnappedTime( + adjustedStartTime, + movingElementDuration, + elementId + ); + const finalStartTime = Math.max(0, snappedStartTime); + const movingElementEnd = finalStartTime + movingElementDuration; + + const hasOverlap = track.elements.some((existingElement) => { + // Skip the element being moved if it's on the same track + if (fromTrackId === track.id && existingElement.id === elementId) + return false; + + const existingStart = existingElement.startTime; + const existingEnd = + existingElement.startTime + + (existingElement.duration - + existingElement.trimStart - + existingElement.trimEnd); + + // Check if elements overlap + return ( + finalStartTime < existingEnd && movingElementEnd > existingStart + ); + }); + + if (hasOverlap) { + toast.error( + "Cannot move element here - it would overlap with existing elements" + ); + return; + } + + if (fromTrackId === track.id) { + // Moving within same track + if (rippleEditingEnabled) { + updateElementStartTimeWithRipple( + track.id, + elementId, + finalStartTime + ); + } else { + updateElementStartTime(track.id, elementId, finalStartTime); + } + } else { + // Moving to different track + moveElementToTrack(fromTrackId, track.id, elementId); + requestAnimationFrame(() => { + if (rippleEditingEnabled) { + updateElementStartTimeWithRipple( + track.id, + elementId, + finalStartTime + ); + } else { + updateElementStartTime(track.id, elementId, finalStartTime); + } + }); + } + } else if (hasMediaItem) { + // Handle media item drop + const mediaItemData = e.dataTransfer.getData( + "application/x-media-item" + ); + if (!mediaItemData) return; + + const dragData: DragData = JSON.parse(mediaItemData); + + if (dragData.type === "text") { + let targetTrackId = track.id; + let targetTrack = track; + + // Handle position-aware track creation for text + if (track.type !== "text" || dropPosition !== "on") { + // Text tracks should go above the main track + const mainTrack = getMainTrack(tracks); + let insertIndex: number; + + if (dropPosition === "above") { + insertIndex = currentTrackIndex; + } else if (dropPosition === "below") { + insertIndex = currentTrackIndex + 1; + } else { + // dropPosition === "on" but track is not text type + // Insert above main track if main track exists, otherwise at top + if (mainTrack) { + const mainTrackIndex = tracks.findIndex( + (t) => t.id === mainTrack.id + ); + insertIndex = mainTrackIndex; + } else { + insertIndex = 0; // Top of timeline + } + } + + targetTrackId = insertTrackAt("text", insertIndex); + // Get the updated tracks array after creating the new track + const updatedTracks = useTimelineStore.getState().tracks; + const newTargetTrack = updatedTracks.find( + (t) => t.id === targetTrackId + ); + if (!newTargetTrack) return; + targetTrack = newTargetTrack; + } + + // Check for overlaps with existing elements in target track + const newElementDuration = 5; // Default text duration + const textSnappedTime = getDropSnappedTime( + newStartTime, + newElementDuration + ); + const newElementEnd = textSnappedTime + newElementDuration; + + const hasOverlap = targetTrack.elements.some((existingElement) => { + const existingStart = existingElement.startTime; + const existingEnd = + existingElement.startTime + + (existingElement.duration - + existingElement.trimStart - + existingElement.trimEnd); + + // Check if elements overlap + return ( + textSnappedTime < existingEnd && newElementEnd > existingStart + ); + }); + + if (hasOverlap) { + toast.error( + "Cannot place element here - it would overlap with existing elements" + ); + return; + } + + addElementToTrack(targetTrackId, { + type: "text", + name: dragData.name || "Text", + content: dragData.content || "Default Text", + duration: TIMELINE_CONSTANTS.DEFAULT_TEXT_DURATION, + startTime: textSnappedTime, + trimStart: 0, + trimEnd: 0, + fontSize: 48, + fontFamily: "Arial", + color: "#ffffff", + backgroundColor: "transparent", + textAlign: "center", + fontWeight: "normal", + fontStyle: "normal", + textDecoration: "none", + x: 0, + y: 0, + rotation: 0, + opacity: 1, + }); + } else { + // Handle media items + const mediaItem = mediaItems.find((item) => item.id === dragData.id); + + if (!mediaItem) { + toast.error("Media item not found"); + return; + } + + let targetTrackId = track.id; + + // Check if track type is compatible + const isVideoOrImage = + dragData.type === "video" || dragData.type === "image"; + const isAudio = dragData.type === "audio"; + const isCompatible = isVideoOrImage + ? canElementGoOnTrack("media", track.type) + : isAudio + ? canElementGoOnTrack("media", track.type) + : false; + + let targetTrack = tracks.find((t) => t.id === targetTrackId); + + // Handle position-aware track creation for media elements + if (!isCompatible || dropPosition !== "on") { + if (isVideoOrImage) { + // For video/image, check if we need a main track or additional media track + const mainTrack = getMainTrack(tracks); + + if (!mainTrack) { + // No main track exists, create it + targetTrackId = addTrack("media"); + const updatedTracks = useTimelineStore.getState().tracks; + const newTargetTrack = updatedTracks.find( + (t) => t.id === targetTrackId + ); + if (!newTargetTrack) return; + targetTrack = newTargetTrack; + } else if ( + mainTrack.elements.length === 0 && + dropPosition === "on" + ) { + // Main track exists and is empty, use it + targetTrackId = mainTrack.id; + targetTrack = mainTrack; + } else { + // Create new media track + let insertIndex: number; + + if (dropPosition === "above") { + insertIndex = currentTrackIndex; + } else if (dropPosition === "below") { + insertIndex = currentTrackIndex + 1; + } else { + // Insert above main track + const mainTrackIndex = tracks.findIndex( + (t) => t.id === mainTrack.id + ); + insertIndex = mainTrackIndex; + } + + targetTrackId = insertTrackAt("media", insertIndex); + const updatedTracks = useTimelineStore.getState().tracks; + const newTargetTrack = updatedTracks.find( + (t) => t.id === targetTrackId + ); + if (!newTargetTrack) return; + targetTrack = newTargetTrack; + } + } else if (isAudio) { + // Audio tracks go at the bottom + const mainTrack = getMainTrack(tracks); + let insertIndex: number; + + if (dropPosition === "above") { + insertIndex = currentTrackIndex; + } else if (dropPosition === "below") { + insertIndex = currentTrackIndex + 1; + } else { + // Insert after main track (bottom area) + if (mainTrack) { + const mainTrackIndex = tracks.findIndex( + (t) => t.id === mainTrack.id + ); + insertIndex = mainTrackIndex + 1; + } else { + insertIndex = tracks.length; // Bottom of timeline + } + } + + targetTrackId = insertTrackAt("audio", insertIndex); + const updatedTracks = useTimelineStore.getState().tracks; + const newTargetTrack = updatedTracks.find( + (t) => t.id === targetTrackId + ); + if (!newTargetTrack) return; + targetTrack = newTargetTrack; + } + } + + if (!targetTrack) return; + + // Check for overlaps with existing elements in target track + const newElementDuration = mediaItem.duration || 5; + const mediaSnappedTime = getDropSnappedTime( + newStartTime, + newElementDuration + ); + const newElementEnd = mediaSnappedTime + newElementDuration; + + const hasOverlap = targetTrack.elements.some((existingElement) => { + const existingStart = existingElement.startTime; + const existingEnd = + existingElement.startTime + + (existingElement.duration - + existingElement.trimStart - + existingElement.trimEnd); + + // Check if elements overlap + return ( + mediaSnappedTime < existingEnd && newElementEnd > existingStart + ); + }); + + if (hasOverlap) { + toast.error( + "Cannot place element here - it would overlap with existing elements" + ); + return; + } + + addElementToTrack(targetTrackId, { + type: "media", + mediaId: mediaItem.id, + name: mediaItem.name, + duration: mediaItem.duration || 5, + startTime: mediaSnappedTime, + trimStart: 0, + trimEnd: 0, + }); + } + } + } catch (error) { + console.error("Error handling drop:", error); + toast.error("Failed to add media to track"); + } + }; + + return ( + <div + className="w-full h-full hover:bg-muted/20" + onClick={(e) => { + // If clicking empty area (not on an element), deselect all elements + if (!(e.target as HTMLElement).closest(".timeline-element")) { + clearSelectedElements(); + } + }} + onDragOver={handleTrackDragOver} + onDragEnter={handleTrackDragEnter} + onDragLeave={handleTrackDragLeave} + onDrop={handleTrackDrop} + > + <div + ref={timelineRef} + className="h-full relative track-elements-container min-w-full" + > + {track.elements.length === 0 ? ( + <div + className={`h-full w-full rounded-sm border-2 border-dashed flex items-center justify-center text-xs text-muted-foreground transition-colors ${ + isDropping + ? wouldOverlap + ? "border-red-500 bg-red-500/10 text-red-600" + : "border-blue-500 bg-blue-500/10 text-blue-600" + : "border-muted/30" + }`} + > + {isDropping + ? wouldOverlap + ? "Cannot drop - would overlap" + : "Drop element here" + : ""} + </div> + ) : ( + <> + {track.elements.map((element) => { + const isSelected = selectedElements.some( + (c) => c.trackId === track.id && c.elementId === element.id + ); + + const handleElementSplit = () => { + const { currentTime } = usePlaybackStore(); + const { splitElement } = useTimelineStore(); + const splitTime = currentTime; + const effectiveStart = element.startTime; + const effectiveEnd = + element.startTime + + (element.duration - element.trimStart - element.trimEnd); + + if (splitTime > effectiveStart && splitTime < effectiveEnd) { + const secondElementId = splitElement( + track.id, + element.id, + splitTime + ); + if (!secondElementId) { + toast.error("Failed to split element"); + } + } else { + toast.error("Playhead must be within element to split"); + } + }; + + const handleElementDuplicate = () => { + const { addElementToTrack } = useTimelineStore.getState(); + const { id, ...elementWithoutId } = element; + addElementToTrack(track.id, { + ...elementWithoutId, + name: element.name + " (copy)", + startTime: + element.startTime + + (element.duration - element.trimStart - element.trimEnd) + + 0.1, + }); + }; + + const handleElementDelete = () => { + const { removeElementFromTrack } = useTimelineStore.getState(); + removeElementFromTrack(track.id, element.id); + }; + + return ( + <TimelineElement + key={element.id} + element={element} + track={track} + zoomLevel={zoomLevel} + isSelected={isSelected} + onElementMouseDown={handleElementMouseDown} + onElementClick={handleElementClick} + /> + ); + })} + </> + )} + </div> + </div> + ); +} diff --git a/apps/web/src/components/header-base.tsx b/apps/web/src/components/header-base.tsx index f27eb7fc..98f1c431 100644 --- a/apps/web/src/components/header-base.tsx +++ b/apps/web/src/components/header-base.tsx @@ -1,41 +1,41 @@ -"use client";
-
-import { cn } from "@/lib/utils";
-import { ReactNode } from "react";
-
-interface HeaderBaseProps {
- leftContent?: ReactNode;
- centerContent?: ReactNode;
- rightContent?: ReactNode;
- className?: string;
- children?: ReactNode;
-}
-
-export function HeaderBase({
- leftContent,
- centerContent,
- rightContent,
- className,
- children,
-}: HeaderBaseProps) {
- // If children is provided, render it directly without the grid layout
- if (children) {
- return (
- <header className={cn("px-6 h-16 flex items-center", className)}>
- {children}
- </header>
- );
- }
-
- return (
- <header
- className={cn("px-6 h-14 flex justify-between items-center", className)}
- >
- {leftContent && <div className="flex items-center">{leftContent}</div>}
- {centerContent && (
- <div className="flex items-center">{centerContent}</div>
- )}
- {rightContent && <div className="flex items-center">{rightContent}</div>}
- </header>
- );
-}
+"use client"; + +import { cn } from "@/lib/utils"; +import { ReactNode } from "react"; + +interface HeaderBaseProps { + leftContent?: ReactNode; + centerContent?: ReactNode; + rightContent?: ReactNode; + className?: string; + children?: ReactNode; +} + +export function HeaderBase({ + leftContent, + centerContent, + rightContent, + className, + children, +}: HeaderBaseProps) { + // If children is provided, render it directly without the grid layout + if (children) { + return ( + <header className={cn("px-6 h-16 flex items-center", className)}> + {children} + </header> + ); + } + + return ( + <header + className={cn("px-6 h-14 flex justify-between items-center", className)} + > + {leftContent && <div className="flex items-center">{leftContent}</div>} + {centerContent && ( + <div className="flex items-center">{centerContent}</div> + )} + {rightContent && <div className="flex items-center">{rightContent}</div>} + </header> + ); +} diff --git a/apps/web/src/components/header.tsx b/apps/web/src/components/header.tsx index 7d11e68a..2e6de534 100644 --- a/apps/web/src/components/header.tsx +++ b/apps/web/src/components/header.tsx @@ -1,47 +1,47 @@ -"use client";
-
-import Link from "next/link";
-import { Button } from "./ui/button";
-import { ArrowRight } from "lucide-react";
-import { HeaderBase } from "./header-base";
-import Image from "next/image";
-
-export function Header() {
- const leftContent = (
- <Link href="/" className="flex items-center gap-3">
- <Image src="/logo.svg" alt="OpenCut Logo" width={32} height={32} />
- <span className="text-xl font-medium hidden md:block">OpenCut</span>
- </Link>
- );
-
- const rightContent = (
- <nav className="flex items-center gap-3">
- <Link href="/blog">
- <Button variant="text" className="text-sm p-0">
- Blog
- </Button>
- </Link>
- <Link href="/contributors">
- <Button variant="text" className="text-sm p-0">
- Contributors
- </Button>
- </Link>
- <Link href="/projects">
- <Button size="sm" className="text-sm ml-4">
- Projects
- <ArrowRight className="h-4 w-4" />
- </Button>
- </Link>
- </nav>
- );
-
- return (
- <div className="mx-4 md:mx-0">
- <HeaderBase
- className="bg-accent border rounded-2xl max-w-3xl mx-auto mt-4 pl-4 pr-[14px]"
- leftContent={leftContent}
- rightContent={rightContent}
- />
- </div>
- );
-}
+"use client"; + +import Link from "next/link"; +import { Button } from "./ui/button"; +import { ArrowRight } from "lucide-react"; +import { HeaderBase } from "./header-base"; +import Image from "next/image"; + +export function Header() { + const leftContent = ( + <Link href="/" className="flex items-center gap-3"> + <Image src="/logo.svg" alt="OpenCut Logo" width={32} height={32} /> + <span className="text-xl font-medium hidden md:block">OpenCut</span> + </Link> + ); + + const rightContent = ( + <nav className="flex items-center gap-3"> + <Link href="/blog"> + <Button variant="text" className="text-sm p-0"> + Blog + </Button> + </Link> + <Link href="/contributors"> + <Button variant="text" className="text-sm p-0"> + Contributors + </Button> + </Link> + <Link href="/projects"> + <Button size="sm" className="text-sm ml-4"> + Projects + <ArrowRight className="h-4 w-4" /> + </Button> + </Link> + </nav> + ); + + return ( + <div className="mx-4 md:mx-0"> + <HeaderBase + className="bg-accent border rounded-2xl max-w-3xl mx-auto mt-4 pl-4 pr-[14px]" + leftContent={leftContent} + rightContent={rightContent} + /> + </div> + ); +} diff --git a/apps/web/src/components/icons.tsx b/apps/web/src/components/icons.tsx index 68e8f0ff..6099c052 100644 --- a/apps/web/src/components/icons.tsx +++ b/apps/web/src/components/icons.tsx @@ -40,8 +40,15 @@ export function GithubIcon({ className }: { className?: string }) { export function VercelIcon({ className }: { className?: string }) { return ( - <svg className={className} width="20" height="18" viewBox="0 0 76 65" fill="none" xmlns="http://www.w3.org/2000/svg"> - <path d="M37.5274 0L75.0548 65H0L37.5274 0Z" fill="currentColor"/> + <svg + className={className} + width="20" + height="18" + viewBox="0 0 76 65" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <path d="M37.5274 0L75.0548 65H0L37.5274 0Z" fill="currentColor" /> </svg> ); } @@ -105,4 +112,4 @@ export function BackgroundIcon({ className }: { className?: string }) { </defs> </svg> ); -}
\ No newline at end of file +} diff --git a/apps/web/src/components/landing/handlebars.tsx b/apps/web/src/components/landing/handlebars.tsx index 36705e90..94764dbe 100644 --- a/apps/web/src/components/landing/handlebars.tsx +++ b/apps/web/src/components/landing/handlebars.tsx @@ -112,7 +112,7 @@ export function Handlebars({ whileDrag={{ scale: 1.1 }} transition={{ type: "spring", stiffness: 400, damping: 30 }} > - <div className="w-2 h-8 rounded-full bg-yellow-500"></div> + <div className="w-2 h-8 rounded-full bg-yellow-500" /> </motion.div> <motion.div @@ -135,7 +135,7 @@ export function Handlebars({ whileDrag={{ scale: 1.1 }} transition={{ type: "spring", stiffness: 400, damping: 30 }} > - <div className="w-2 h-8 rounded-full bg-yellow-500"></div> + <div className="w-2 h-8 rounded-full bg-yellow-500" /> </motion.div> </div> @@ -161,4 +161,4 @@ export function Handlebars({ </div> </div> ); -}; +} diff --git a/apps/web/src/components/onboarding.tsx b/apps/web/src/components/onboarding.tsx index 80b5f99c..1b43978e 100644 --- a/apps/web/src/components/onboarding.tsx +++ b/apps/web/src/components/onboarding.tsx @@ -1,121 +1,121 @@ -"use client";
-
-import { Dialog, DialogContent } from "./ui/dialog";
-import { Button } from "./ui/button";
-import { ArrowRightIcon } from "lucide-react";
-import { useState, useEffect } from "react";
-import ReactMarkdown from "react-markdown";
-
-export function Onboarding() {
- const [step, setStep] = useState(0);
- const [isOpen, setIsOpen] = useState(false);
-
- useEffect(() => {
- const hasSeenOnboarding = localStorage.getItem("hasSeenOnboarding");
- if (!hasSeenOnboarding) {
- setIsOpen(true);
- }
- }, []);
-
- const handleNext = () => {
- setStep(step + 1);
- };
-
- const handleClose = () => {
- setIsOpen(false);
- localStorage.setItem("hasSeenOnboarding", "true");
- };
-
- const renderStepContent = () => {
- switch (step) {
- case 0:
- return (
- <div className="space-y-5">
- <div className="space-y-3">
- <Title title="Welcome to OpenCut Beta! 🎉" />
- <Description description="You're among the first to try OpenCut - the fully open source CapCut alternative." />
- </div>
- <NextButton onClick={handleNext}>Next</NextButton>
- </div>
- );
- case 1:
- return (
- <div className="space-y-5">
- <div className="space-y-3">
- <Title title="⚠️ This is a super early beta!" />
- <Description description="OpenCut started just one month ago. There's still a ton of things to do to make this editor amazing." />
- <Description description="If you're curious, check out our roadmap [here](https://opencut.app/roadmap)" />
- </div>
- <NextButton onClick={handleNext}>Next</NextButton>
- </div>
- );
- case 2:
- return (
- <div className="space-y-5">
- <div className="space-y-3">
- <Title title="🦋 Have fun testing!" />
- <Description description="Join our [Discord](https://discord.gg/zmR9N35cjK), chat with cool people and share feedback to help make OpenCut the best editor ever." />
- </div>
- <NextButton onClick={handleClose}>Finish</NextButton>
- </div>
- );
- default:
- return null;
- }
- };
-
- return (
- <Dialog open={isOpen} onOpenChange={handleClose}>
- <DialogContent className="sm:max-w-[425px] !outline-none">
- {renderStepContent()}
- </DialogContent>
- </Dialog>
- );
-}
-
-function Title({ title }: { title: string }) {
- return <h2 className="text-lg md:text-xl font-bold">{title}</h2>;
-}
-
-function Subtitle({ subtitle }: { subtitle: string }) {
- return <h3 className="text-lg font-medium">{subtitle}</h3>;
-}
-
-function Description({ description }: { description: string }) {
- return (
- <div className="text-muted-foreground">
- <ReactMarkdown
- components={{
- p: ({ children }) => <p className="mb-0">{children}</p>,
- a: ({ href, children }) => (
- <a
- href={href}
- target="_blank"
- rel="noopener noreferrer"
- className="text-foreground hover:text-foreground/80 underline"
- >
- {children}
- </a>
- ),
- }}
- >
- {description}
- </ReactMarkdown>
- </div>
- );
-}
-
-function NextButton({
- children,
- onClick,
-}: {
- children: React.ReactNode;
- onClick: () => void;
-}) {
- return (
- <Button onClick={onClick} variant="default" className="w-full">
- {children}
- <ArrowRightIcon className="w-4 h-4" />
- </Button>
- );
-}
+"use client"; + +import { Dialog, DialogContent } from "./ui/dialog"; +import { Button } from "./ui/button"; +import { ArrowRightIcon } from "lucide-react"; +import { useState, useEffect } from "react"; +import ReactMarkdown from "react-markdown"; + +export function Onboarding() { + const [step, setStep] = useState(0); + const [isOpen, setIsOpen] = useState(false); + + useEffect(() => { + const hasSeenOnboarding = localStorage.getItem("hasSeenOnboarding"); + if (!hasSeenOnboarding) { + setIsOpen(true); + } + }, []); + + const handleNext = () => { + setStep(step + 1); + }; + + const handleClose = () => { + setIsOpen(false); + localStorage.setItem("hasSeenOnboarding", "true"); + }; + + const renderStepContent = () => { + switch (step) { + case 0: + return ( + <div className="space-y-5"> + <div className="space-y-3"> + <Title title="Welcome to OpenCut Beta! 🎉" /> + <Description description="You're among the first to try OpenCut - the fully open source CapCut alternative." /> + </div> + <NextButton onClick={handleNext}>Next</NextButton> + </div> + ); + case 1: + return ( + <div className="space-y-5"> + <div className="space-y-3"> + <Title title="⚠️ This is a super early beta!" /> + <Description description="OpenCut started just one month ago. There's still a ton of things to do to make this editor amazing." /> + <Description description="If you're curious, check out our roadmap [here](https://opencut.app/roadmap)" /> + </div> + <NextButton onClick={handleNext}>Next</NextButton> + </div> + ); + case 2: + return ( + <div className="space-y-5"> + <div className="space-y-3"> + <Title title="🦋 Have fun testing!" /> + <Description description="Join our [Discord](https://discord.gg/zmR9N35cjK), chat with cool people and share feedback to help make OpenCut the best editor ever." /> + </div> + <NextButton onClick={handleClose}>Finish</NextButton> + </div> + ); + default: + return null; + } + }; + + return ( + <Dialog open={isOpen} onOpenChange={handleClose}> + <DialogContent className="sm:max-w-[425px] !outline-none"> + {renderStepContent()} + </DialogContent> + </Dialog> + ); +} + +function Title({ title }: { title: string }) { + return <h2 className="text-lg md:text-xl font-bold">{title}</h2>; +} + +function Subtitle({ subtitle }: { subtitle: string }) { + return <h3 className="text-lg font-medium">{subtitle}</h3>; +} + +function Description({ description }: { description: string }) { + return ( + <div className="text-muted-foreground"> + <ReactMarkdown + components={{ + p: ({ children }) => <p className="mb-0">{children}</p>, + a: ({ href, children }) => ( + <a + href={href} + target="_blank" + rel="noopener noreferrer" + className="text-foreground hover:text-foreground/80 underline" + > + {children} + </a> + ), + }} + > + {description} + </ReactMarkdown> + </div> + ); +} + +function NextButton({ + children, + onClick, +}: { + children: React.ReactNode; + onClick: () => void; +}) { + return ( + <Button onClick={onClick} variant="default" className="w-full"> + {children} + <ArrowRightIcon className="w-4 h-4" /> + </Button> + ); +} diff --git a/apps/web/src/components/rename-project-dialog.tsx b/apps/web/src/components/rename-project-dialog.tsx index d84bad71..c50f9f71 100644 --- a/apps/web/src/components/rename-project-dialog.tsx +++ b/apps/web/src/components/rename-project-dialog.tsx @@ -1,73 +1,73 @@ -import { Button } from "@/components/ui/button";
-import {
- Dialog,
- DialogContent,
- DialogDescription,
- DialogFooter,
- DialogHeader,
- DialogTitle,
-} from "@/components/ui/dialog";
-import { Input } from "@/components/ui/input";
-import { useState } from "react";
-
-export function RenameProjectDialog({
- isOpen,
- onOpenChange,
- onConfirm,
- projectName,
-}: {
- isOpen: boolean;
- onOpenChange: (open: boolean) => void;
- onConfirm: (name: string) => void;
- projectName: string;
-}) {
- const [name, setName] = useState(projectName);
-
- // Reset the name when dialog opens - this is better UX than syncing with every prop change
- const handleOpenChange = (open: boolean) => {
- if (open) {
- setName(projectName);
- }
- onOpenChange(open);
- };
-
- return (
- <Dialog open={isOpen} onOpenChange={handleOpenChange}>
- <DialogContent>
- <DialogHeader>
- <DialogTitle>Rename Project</DialogTitle>
- <DialogDescription>
- Enter a new name for your project.
- </DialogDescription>
- </DialogHeader>
-
- <Input
- value={name}
- onChange={(e) => setName(e.target.value)}
- onKeyDown={(e) => {
- if (e.key === "Enter") {
- e.preventDefault();
- onConfirm(name);
- }
- }}
- placeholder="Enter a new name"
- className="mt-4"
- />
-
- <DialogFooter>
- <Button
- variant="outline"
- onClick={(e) => {
- e.preventDefault();
- e.stopPropagation();
- onOpenChange(false);
- }}
- >
- Cancel
- </Button>
- <Button onClick={() => onConfirm(name)}>Rename</Button>
- </DialogFooter>
- </DialogContent>
- </Dialog>
- );
-}
+import { Button } from "@/components/ui/button"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { Input } from "@/components/ui/input"; +import { useState } from "react"; + +export function RenameProjectDialog({ + isOpen, + onOpenChange, + onConfirm, + projectName, +}: { + isOpen: boolean; + onOpenChange: (open: boolean) => void; + onConfirm: (name: string) => void; + projectName: string; +}) { + const [name, setName] = useState(projectName); + + // Reset the name when dialog opens - this is better UX than syncing with every prop change + const handleOpenChange = (open: boolean) => { + if (open) { + setName(projectName); + } + onOpenChange(open); + }; + + return ( + <Dialog open={isOpen} onOpenChange={handleOpenChange}> + <DialogContent> + <DialogHeader> + <DialogTitle>Rename Project</DialogTitle> + <DialogDescription> + Enter a new name for your project. + </DialogDescription> + </DialogHeader> + + <Input + value={name} + onChange={(e) => setName(e.target.value)} + onKeyDown={(e) => { + if (e.key === "Enter") { + e.preventDefault(); + onConfirm(name); + } + }} + placeholder="Enter a new name" + className="mt-4" + /> + + <DialogFooter> + <Button + variant="outline" + onClick={(e) => { + e.preventDefault(); + e.stopPropagation(); + onOpenChange(false); + }} + > + Cancel + </Button> + <Button onClick={() => onConfirm(name)}>Rename</Button> + </DialogFooter> + </DialogContent> + </Dialog> + ); +} diff --git a/apps/web/src/components/storage-provider.tsx b/apps/web/src/components/storage-provider.tsx index 48423b5c..69105d0f 100644 --- a/apps/web/src/components/storage-provider.tsx +++ b/apps/web/src/components/storage-provider.tsx @@ -1,80 +1,80 @@ -"use client";
-
-import { createContext, useContext, useEffect, useState } from "react";
-import { useProjectStore } from "@/stores/project-store";
-import { useMediaStore } from "@/stores/media-store";
-import { storageService } from "@/lib/storage/storage-service";
-import { toast } from "sonner";
-
-interface StorageContextType {
- isInitialized: boolean;
- isLoading: boolean;
- hasSupport: boolean;
- error: string | null;
-}
-
-const StorageContext = createContext<StorageContextType | null>(null);
-
-export function useStorage() {
- const context = useContext(StorageContext);
- if (!context) {
- throw new Error("useStorage must be used within StorageProvider");
- }
- return context;
-}
-
-interface StorageProviderProps {
- children: React.ReactNode;
-}
-
-export function StorageProvider({ children }: StorageProviderProps) {
- const [status, setStatus] = useState<StorageContextType>({
- isInitialized: false,
- isLoading: true,
- hasSupport: false,
- error: null,
- });
-
- const loadAllProjects = useProjectStore((state) => state.loadAllProjects);
-
- useEffect(() => {
- const initializeStorage = async () => {
- setStatus((prev) => ({ ...prev, isLoading: true }));
-
- try {
- // Check browser support
- const hasSupport = storageService.isFullySupported();
-
- if (!hasSupport) {
- toast.warning(
- "Storage not fully supported. Some features may not work."
- );
- }
-
- // Load saved projects (media will be loaded when a project is loaded)
- await loadAllProjects();
-
- setStatus({
- isInitialized: true,
- isLoading: false,
- hasSupport,
- error: null,
- });
- } catch (error) {
- console.error("Failed to initialize storage:", error);
- setStatus({
- isInitialized: false,
- isLoading: false,
- hasSupport: storageService.isFullySupported(),
- error: error instanceof Error ? error.message : "Unknown error",
- });
- }
- };
-
- initializeStorage();
- }, [loadAllProjects]);
-
- return (
- <StorageContext.Provider value={status}>{children}</StorageContext.Provider>
- );
-}
+"use client"; + +import { createContext, useContext, useEffect, useState } from "react"; +import { useProjectStore } from "@/stores/project-store"; +import { useMediaStore } from "@/stores/media-store"; +import { storageService } from "@/lib/storage/storage-service"; +import { toast } from "sonner"; + +interface StorageContextType { + isInitialized: boolean; + isLoading: boolean; + hasSupport: boolean; + error: string | null; +} + +const StorageContext = createContext<StorageContextType | null>(null); + +export function useStorage() { + const context = useContext(StorageContext); + if (!context) { + throw new Error("useStorage must be used within StorageProvider"); + } + return context; +} + +interface StorageProviderProps { + children: React.ReactNode; +} + +export function StorageProvider({ children }: StorageProviderProps) { + const [status, setStatus] = useState<StorageContextType>({ + isInitialized: false, + isLoading: true, + hasSupport: false, + error: null, + }); + + const loadAllProjects = useProjectStore((state) => state.loadAllProjects); + + useEffect(() => { + const initializeStorage = async () => { + setStatus((prev) => ({ ...prev, isLoading: true })); + + try { + // Check browser support + const hasSupport = storageService.isFullySupported(); + + if (!hasSupport) { + toast.warning( + "Storage not fully supported. Some features may not work." + ); + } + + // Load saved projects (media will be loaded when a project is loaded) + await loadAllProjects(); + + setStatus({ + isInitialized: true, + isLoading: false, + hasSupport, + error: null, + }); + } catch (error) { + console.error("Failed to initialize storage:", error); + setStatus({ + isInitialized: false, + isLoading: false, + hasSupport: storageService.isFullySupported(), + error: error instanceof Error ? error.message : "Unknown error", + }); + } + }; + + initializeStorage(); + }, [loadAllProjects]); + + return ( + <StorageContext.Provider value={status}>{children}</StorageContext.Provider> + ); +} diff --git a/apps/web/src/components/ui/aspect-ratio.tsx b/apps/web/src/components/ui/aspect-ratio.tsx index 6f90bbb8..082de9df 100644 --- a/apps/web/src/components/ui/aspect-ratio.tsx +++ b/apps/web/src/components/ui/aspect-ratio.tsx @@ -1,7 +1,7 @@ -"use client" +"use client"; -import { AspectRatio as AspectRatioPrimitive } from "radix-ui" +import { AspectRatio as AspectRatioPrimitive } from "radix-ui"; -const AspectRatio = AspectRatioPrimitive.Root +const AspectRatio = AspectRatioPrimitive.Root; -export { AspectRatio } +export { AspectRatio }; diff --git a/apps/web/src/components/ui/audio-player.tsx b/apps/web/src/components/ui/audio-player.tsx index 774dd95c..37bf8ca9 100644 --- a/apps/web/src/components/ui/audio-player.tsx +++ b/apps/web/src/components/ui/audio-player.tsx @@ -1,127 +1,127 @@ -"use client";
-
-import { useRef, useEffect } from "react";
-import { usePlaybackStore } from "@/stores/playback-store";
-
-interface AudioPlayerProps {
- src: string;
- className?: string;
- clipStartTime: number;
- trimStart: number;
- trimEnd: number;
- clipDuration: number;
- trackMuted?: boolean;
-}
-
-export function AudioPlayer({
- src,
- className = "",
- clipStartTime,
- trimStart,
- trimEnd,
- clipDuration,
- trackMuted = false,
-}: AudioPlayerProps) {
- const audioRef = useRef<HTMLAudioElement>(null);
- const { isPlaying, currentTime, volume, speed, muted } = usePlaybackStore();
-
- // Calculate if we're within this clip's timeline range
- const clipEndTime = clipStartTime + (clipDuration - trimStart - trimEnd);
- const isInClipRange =
- currentTime >= clipStartTime && currentTime < clipEndTime;
-
- // Sync playback events
- useEffect(() => {
- const audio = audioRef.current;
- if (!audio || !isInClipRange) return;
-
- const handleSeekEvent = (e: CustomEvent) => {
- // Always update audio time, even if outside clip range
- const timelineTime = e.detail.time;
- const audioTime = Math.max(
- trimStart,
- Math.min(
- clipDuration - trimEnd,
- timelineTime - clipStartTime + trimStart
- )
- );
- audio.currentTime = audioTime;
- };
-
- const handleUpdateEvent = (e: CustomEvent) => {
- // Always update audio time, even if outside clip range
- const timelineTime = e.detail.time;
- const targetTime = Math.max(
- trimStart,
- Math.min(
- clipDuration - trimEnd,
- timelineTime - clipStartTime + trimStart
- )
- );
-
- if (Math.abs(audio.currentTime - targetTime) > 0.5) {
- audio.currentTime = targetTime;
- }
- };
-
- const handleSpeed = (e: CustomEvent) => {
- audio.playbackRate = e.detail.speed;
- };
-
- window.addEventListener("playback-seek", handleSeekEvent as EventListener);
- window.addEventListener(
- "playback-update",
- handleUpdateEvent as EventListener
- );
- window.addEventListener("playback-speed", handleSpeed as EventListener);
-
- return () => {
- window.removeEventListener(
- "playback-seek",
- handleSeekEvent as EventListener
- );
- window.removeEventListener(
- "playback-update",
- handleUpdateEvent as EventListener
- );
- window.removeEventListener(
- "playback-speed",
- handleSpeed as EventListener
- );
- };
- }, [clipStartTime, trimStart, trimEnd, clipDuration, isInClipRange]);
-
- // Sync playback state
- useEffect(() => {
- const audio = audioRef.current;
- if (!audio) return;
-
- if (isPlaying && isInClipRange && !trackMuted) {
- audio.play().catch(() => {});
- } else {
- audio.pause();
- }
- }, [isPlaying, isInClipRange, trackMuted]);
-
- // Sync volume and speed
- useEffect(() => {
- const audio = audioRef.current;
- if (!audio) return;
-
- audio.volume = volume;
- audio.muted = muted || trackMuted;
- audio.playbackRate = speed;
- }, [volume, speed, muted, trackMuted]);
-
- return (
- <audio
- ref={audioRef}
- src={src}
- className={className}
- preload="auto"
- controls={false}
- style={{ display: "none" }} // Audio elements don't need visual representation
- onContextMenu={(e) => e.preventDefault()}
- />
- );
-}
+"use client"; + +import { useRef, useEffect } from "react"; +import { usePlaybackStore } from "@/stores/playback-store"; + +interface AudioPlayerProps { + src: string; + className?: string; + clipStartTime: number; + trimStart: number; + trimEnd: number; + clipDuration: number; + trackMuted?: boolean; +} + +export function AudioPlayer({ + src, + className = "", + clipStartTime, + trimStart, + trimEnd, + clipDuration, + trackMuted = false, +}: AudioPlayerProps) { + const audioRef = useRef<HTMLAudioElement>(null); + const { isPlaying, currentTime, volume, speed, muted } = usePlaybackStore(); + + // Calculate if we're within this clip's timeline range + const clipEndTime = clipStartTime + (clipDuration - trimStart - trimEnd); + const isInClipRange = + currentTime >= clipStartTime && currentTime < clipEndTime; + + // Sync playback events + useEffect(() => { + const audio = audioRef.current; + if (!audio || !isInClipRange) return; + + const handleSeekEvent = (e: CustomEvent) => { + // Always update audio time, even if outside clip range + const timelineTime = e.detail.time; + const audioTime = Math.max( + trimStart, + Math.min( + clipDuration - trimEnd, + timelineTime - clipStartTime + trimStart + ) + ); + audio.currentTime = audioTime; + }; + + const handleUpdateEvent = (e: CustomEvent) => { + // Always update audio time, even if outside clip range + const timelineTime = e.detail.time; + const targetTime = Math.max( + trimStart, + Math.min( + clipDuration - trimEnd, + timelineTime - clipStartTime + trimStart + ) + ); + + if (Math.abs(audio.currentTime - targetTime) > 0.5) { + audio.currentTime = targetTime; + } + }; + + const handleSpeed = (e: CustomEvent) => { + audio.playbackRate = e.detail.speed; + }; + + window.addEventListener("playback-seek", handleSeekEvent as EventListener); + window.addEventListener( + "playback-update", + handleUpdateEvent as EventListener + ); + window.addEventListener("playback-speed", handleSpeed as EventListener); + + return () => { + window.removeEventListener( + "playback-seek", + handleSeekEvent as EventListener + ); + window.removeEventListener( + "playback-update", + handleUpdateEvent as EventListener + ); + window.removeEventListener( + "playback-speed", + handleSpeed as EventListener + ); + }; + }, [clipStartTime, trimStart, trimEnd, clipDuration, isInClipRange]); + + // Sync playback state + useEffect(() => { + const audio = audioRef.current; + if (!audio) return; + + if (isPlaying && isInClipRange && !trackMuted) { + audio.play().catch(() => {}); + } else { + audio.pause(); + } + }, [isPlaying, isInClipRange, trackMuted]); + + // Sync volume and speed + useEffect(() => { + const audio = audioRef.current; + if (!audio) return; + + audio.volume = volume; + audio.muted = muted || trackMuted; + audio.playbackRate = speed; + }, [volume, speed, muted, trackMuted]); + + return ( + <audio + ref={audioRef} + src={src} + className={className} + preload="auto" + controls={false} + style={{ display: "none" }} // Audio elements don't need visual representation + onContextMenu={(e) => e.preventDefault()} + /> + ); +} diff --git a/apps/web/src/components/ui/button.tsx b/apps/web/src/components/ui/button.tsx index b8b9ab2f..5902af65 100644 --- a/apps/web/src/components/ui/button.tsx +++ b/apps/web/src/components/ui/button.tsx @@ -9,8 +9,7 @@ const buttonVariants = cva( { variants: { variant: { - default: - "bg-foreground text-background shadow hover:bg-foreground/90", + default: "bg-foreground text-background shadow hover:bg-foreground/90", primary: "bg-primary text-primary-foreground shadow hover:bg-primary/90", destructive: diff --git a/apps/web/src/components/ui/card.tsx b/apps/web/src/components/ui/card.tsx index c5ca9d9f..6d0b37cc 100644 --- a/apps/web/src/components/ui/card.tsx +++ b/apps/web/src/components/ui/card.tsx @@ -8,10 +8,7 @@ const Card = React.forwardRef< >(({ className, ...props }, ref) => ( <div ref={ref} - className={cn( - "rounded-xl border bg-card text-card-foreground", - className - )} + className={cn("rounded-xl border bg-card text-card-foreground", className)} {...props} /> )); diff --git a/apps/web/src/components/ui/carousel.tsx b/apps/web/src/components/ui/carousel.tsx index 3c0efdc6..a9c98b67 100644 --- a/apps/web/src/components/ui/carousel.tsx +++ b/apps/web/src/components/ui/carousel.tsx @@ -124,7 +124,7 @@ const Carousel = React.forwardRef< <CarouselContext.Provider value={{ carouselRef, - api: api, + api, opts, orientation: orientation || (opts?.axis === "y" ? "vertical" : "horizontal"), diff --git a/apps/web/src/components/ui/chart.tsx b/apps/web/src/components/ui/chart.tsx index a2c19116..82d77752 100644 --- a/apps/web/src/components/ui/chart.tsx +++ b/apps/web/src/components/ui/chart.tsx @@ -188,7 +188,7 @@ const ChartTooltipContent = React.forwardRef< className )} > - {!nestLabel ? tooltipLabel : null} + {nestLabel ? null : tooltipLabel} <div className="grid gap-1.5"> {payload.map((item, index) => { const key = `${nameKey || item.name || item.dataKey || "value"}`; @@ -328,7 +328,7 @@ function getPayloadConfigFromPayload( key: string ) { if (typeof payload !== "object" || payload === null) { - return undefined; + return; } const payloadPayload = diff --git a/apps/web/src/components/ui/collapsible.tsx b/apps/web/src/components/ui/collapsible.tsx index 6642d604..acb56414 100644 --- a/apps/web/src/components/ui/collapsible.tsx +++ b/apps/web/src/components/ui/collapsible.tsx @@ -1,11 +1,11 @@ -"use client" +"use client"; -import { Collapsible as CollapsiblePrimitive } from "radix-ui" +import { Collapsible as CollapsiblePrimitive } from "radix-ui"; -const Collapsible = CollapsiblePrimitive.Root +const Collapsible = CollapsiblePrimitive.Root; -const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger +const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger; -const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent +const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent; -export { Collapsible, CollapsibleTrigger, CollapsibleContent } +export { Collapsible, CollapsibleTrigger, CollapsibleContent }; diff --git a/apps/web/src/components/ui/font-picker.tsx b/apps/web/src/components/ui/font-picker.tsx index 9a152fd4..479a5f0c 100644 --- a/apps/web/src/components/ui/font-picker.tsx +++ b/apps/web/src/components/ui/font-picker.tsx @@ -1,40 +1,40 @@ -import {
- Select,
- SelectContent,
- SelectItem,
- SelectTrigger,
- SelectValue,
-} from "@/components/ui/select";
-import { FONT_OPTIONS, FontFamily } from "@/constants/font-constants";
-
-interface FontPickerProps {
- defaultValue?: FontFamily;
- onValueChange?: (value: FontFamily) => void;
- className?: string;
-}
-
-export function FontPicker({
- defaultValue,
- onValueChange,
- className,
-}: FontPickerProps) {
- return (
- <Select defaultValue={defaultValue} onValueChange={onValueChange}>
- <SelectTrigger className={`w-full text-xs ${className || ""}`}>
- <SelectValue placeholder="Select a font" />
- </SelectTrigger>
- <SelectContent>
- {FONT_OPTIONS.map((font) => (
- <SelectItem
- key={font.value}
- value={font.value}
- className="text-xs"
- style={{ fontFamily: font.value }}
- >
- {font.label}
- </SelectItem>
- ))}
- </SelectContent>
- </Select>
- );
-}
+import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { FONT_OPTIONS, FontFamily } from "@/constants/font-constants"; + +interface FontPickerProps { + defaultValue?: FontFamily; + onValueChange?: (value: FontFamily) => void; + className?: string; +} + +export function FontPicker({ + defaultValue, + onValueChange, + className, +}: FontPickerProps) { + return ( + <Select defaultValue={defaultValue} onValueChange={onValueChange}> + <SelectTrigger className={`w-full text-xs ${className || ""}`}> + <SelectValue placeholder="Select a font" /> + </SelectTrigger> + <SelectContent> + {FONT_OPTIONS.map((font) => ( + <SelectItem + key={font.value} + value={font.value} + className="text-xs" + style={{ fontFamily: font.value }} + > + {font.label} + </SelectItem> + ))} + </SelectContent> + </Select> + ); +} diff --git a/apps/web/src/components/ui/form.tsx b/apps/web/src/components/ui/form.tsx index cb4f53a9..cab151e1 100644 --- a/apps/web/src/components/ui/form.tsx +++ b/apps/web/src/components/ui/form.tsx @@ -115,9 +115,7 @@ const FormControl = React.forwardRef< ref={ref} id={formItemId} aria-describedby={ - !error - ? `${formDescriptionId}` - : `${formDescriptionId} ${formMessageId}` + error ? `${formDescriptionId} ${formMessageId}` : `${formDescriptionId}` } aria-invalid={!!error} {...props} diff --git a/apps/web/src/components/ui/image-timeline-treatment.tsx b/apps/web/src/components/ui/image-timeline-treatment.tsx index 31847df5..7a64be18 100644 --- a/apps/web/src/components/ui/image-timeline-treatment.tsx +++ b/apps/web/src/components/ui/image-timeline-treatment.tsx @@ -1,102 +1,102 @@ -"use client";
-
-import { useState } from "react";
-import { cn } from "@/lib/utils";
-import type { BackgroundType } from "@/types/editor";
-
-interface ImageTimelineTreatmentProps {
- src: string;
- alt: string;
- targetAspectRatio?: number; // Default to 16:9 for video
- className?: string;
- backgroundType?: BackgroundType;
- backgroundColor?: string;
-}
-
-export function ImageTimelineTreatment({
- src,
- alt,
- targetAspectRatio = 16 / 9,
- className,
- backgroundType = "blur",
- backgroundColor = "#000000",
-}: ImageTimelineTreatmentProps) {
- const [imageLoaded, setImageLoaded] = useState(false);
- const [imageDimensions, setImageDimensions] = useState<{
- width: number;
- height: number;
- } | null>(null);
-
- const handleImageLoad = (e: React.SyntheticEvent<HTMLImageElement>) => {
- const img = e.currentTarget;
- setImageDimensions({
- width: img.naturalWidth,
- height: img.naturalHeight,
- });
- setImageLoaded(true);
- };
-
- const imageAspectRatio = imageDimensions
- ? imageDimensions.width / imageDimensions.height
- : 1;
-
- const needsAspectRatioTreatment = imageAspectRatio !== targetAspectRatio;
-
- return (
- <div
- className={cn("relative overflow-hidden", className)}
- style={{ aspectRatio: targetAspectRatio }}
- >
- {/* Background Layer */}
- {needsAspectRatioTreatment && imageLoaded && (
- <>
- {backgroundType === "blur" && (
- <div className="absolute inset-0">
- <img
- src={src}
- alt=""
- className="w-full h-full object-cover filter blur-xl scale-110 opacity-60"
- aria-hidden="true"
- />
- <div className="absolute inset-0 bg-black/20" />
- </div>
- )}
-
- {backgroundType === "mirror" && (
- <div className="absolute inset-0">
- <img
- src={src}
- alt=""
- className="w-full h-full object-cover opacity-30"
- aria-hidden="true"
- />
- </div>
- )}
-
- {backgroundType === "color" && (
- <div className="absolute inset-0" style={{ backgroundColor }} />
- )}
- </>
- )}
-
- {/* Main Image Layer */}
- <div className="absolute inset-0">
- <img
- src={src}
- alt={alt}
- className="w-full h-full object-cover"
- onLoad={handleImageLoad}
- />
- </div>
-
- {/* Loading state */}
- {!imageLoaded && (
- <div className="absolute inset-0 flex items-center justify-center bg-muted/30">
- <div className="animate-pulse text-xs text-muted-foreground">
- Loading...
- </div>
- </div>
- )}
- </div>
- );
-}
+"use client"; + +import { useState } from "react"; +import { cn } from "@/lib/utils"; +import type { BackgroundType } from "@/types/editor"; + +interface ImageTimelineTreatmentProps { + src: string; + alt: string; + targetAspectRatio?: number; // Default to 16:9 for video + className?: string; + backgroundType?: BackgroundType; + backgroundColor?: string; +} + +export function ImageTimelineTreatment({ + src, + alt, + targetAspectRatio = 16 / 9, + className, + backgroundType = "blur", + backgroundColor = "#000000", +}: ImageTimelineTreatmentProps) { + const [imageLoaded, setImageLoaded] = useState(false); + const [imageDimensions, setImageDimensions] = useState<{ + width: number; + height: number; + } | null>(null); + + const handleImageLoad = (e: React.SyntheticEvent<HTMLImageElement>) => { + const img = e.currentTarget; + setImageDimensions({ + width: img.naturalWidth, + height: img.naturalHeight, + }); + setImageLoaded(true); + }; + + const imageAspectRatio = imageDimensions + ? imageDimensions.width / imageDimensions.height + : 1; + + const needsAspectRatioTreatment = imageAspectRatio !== targetAspectRatio; + + return ( + <div + className={cn("relative overflow-hidden", className)} + style={{ aspectRatio: targetAspectRatio }} + > + {/* Background Layer */} + {needsAspectRatioTreatment && imageLoaded && ( + <> + {backgroundType === "blur" && ( + <div className="absolute inset-0"> + <img + src={src} + alt="" + className="w-full h-full object-cover filter blur-xl scale-110 opacity-60" + aria-hidden="true" + /> + <div className="absolute inset-0 bg-black/20" /> + </div> + )} + + {backgroundType === "mirror" && ( + <div className="absolute inset-0"> + <img + src={src} + alt="" + className="w-full h-full object-cover opacity-30" + aria-hidden="true" + /> + </div> + )} + + {backgroundType === "color" && ( + <div className="absolute inset-0" style={{ backgroundColor }} /> + )} + </> + )} + + {/* Main Image Layer */} + <div className="absolute inset-0"> + <img + src={src} + alt={alt} + className="w-full h-full object-cover" + onLoad={handleImageLoad} + /> + </div> + + {/* Loading state */} + {!imageLoaded && ( + <div className="absolute inset-0 flex items-center justify-center bg-muted/30"> + <div className="animate-pulse text-xs text-muted-foreground"> + Loading... + </div> + </div> + )} + </div> + ); +} diff --git a/apps/web/src/components/ui/phone-input.tsx b/apps/web/src/components/ui/phone-input.tsx index 95ad9131..ca85df8f 100644 --- a/apps/web/src/components/ui/phone-input.tsx +++ b/apps/web/src/components/ui/phone-input.tsx @@ -1,167 +1,167 @@ -import * as React from "react";
-import { CheckIcon, ChevronsUpDown } from "lucide-react";
-import * as RPNInput from "react-phone-number-input";
-import flags from "react-phone-number-input/flags";
-
-import { Button } from "./button";
-import {
- Command,
- CommandEmpty,
- CommandGroup,
- CommandInput,
- CommandItem,
- CommandList,
-} from "./command";
-import { Input } from "./input";
-import { Popover, PopoverContent, PopoverTrigger } from "./popover";
-import { ScrollArea } from "./scroll-area";
-import { cn } from "../../lib/utils";
-
-type PhoneInputProps = Omit<
- React.ComponentProps<"input">,
- "onChange" | "value" | "ref"
-> &
- Omit<RPNInput.Props<typeof RPNInput.default>, "onChange"> & {
- onChange?: (value: RPNInput.Value) => void;
- };
-
-const PhoneInput: React.ForwardRefExoticComponent<PhoneInputProps> =
- React.forwardRef<React.ElementRef<typeof RPNInput.default>, PhoneInputProps>(
- ({ className, onChange, defaultCountry = "US", ...props }, ref) => {
- return (
- <RPNInput.default
- ref={ref}
- className={cn("flex", className)}
- flagComponent={FlagComponent}
- countrySelectComponent={CountrySelect}
- inputComponent={InputComponent}
- defaultCountry={defaultCountry}
- international
- addInternationalOption
- smartCaret={false}
- /**
- * Handles the onChange event.
- *
- * react-phone-number-input might trigger the onChange event as undefined
- * when a valid phone number is not entered. To prevent this,
- * the value is coerced to an empty string.
- *
- * @param {E164Number | undefined} value - The entered value
- */
- onChange={(value) => onChange?.(value || ("" as RPNInput.Value))}
- {...props}
- />
- );
- }
- );
-PhoneInput.displayName = "PhoneInput";
-
-const InputComponent = React.forwardRef<
- HTMLInputElement,
- React.ComponentProps<"input">
->(({ className, ...props }, ref) => (
- <Input
- className={cn("rounded-e-lg rounded-s-none", className)}
- {...props}
- ref={ref}
- />
-));
-InputComponent.displayName = "InputComponent";
-
-type CountryEntry = { label: string; value: RPNInput.Country | undefined };
-
-type CountrySelectProps = {
- disabled?: boolean;
- value: RPNInput.Country;
- options: CountryEntry[];
- onChange: (country: RPNInput.Country) => void;
-};
-
-const CountrySelect = ({
- disabled,
- value: selectedCountry,
- options: countryList,
- onChange,
-}: CountrySelectProps) => {
- return (
- <Popover>
- <PopoverTrigger asChild>
- <Button
- type="button"
- variant="outline"
- className="flex gap-1 rounded-e-none rounded-s-lg border-r-0 px-3 focus:z-10"
- disabled={disabled}
- >
- <FlagComponent
- country={selectedCountry}
- countryName={selectedCountry}
- />
- <ChevronsUpDown
- className={cn(
- "-mr-2 size-4 opacity-50",
- disabled ? "hidden" : "opacity-100"
- )}
- />
- </Button>
- </PopoverTrigger>
- <PopoverContent className="w-[300px] p-0">
- <Command>
- <CommandInput placeholder="Search country..." />
- <CommandList>
- <ScrollArea className="h-72">
- <CommandEmpty>No country found.</CommandEmpty>
- <CommandGroup>
- {countryList.map(({ value, label }) =>
- value ? (
- <CountrySelectOption
- key={value}
- country={value}
- countryName={label}
- selectedCountry={selectedCountry}
- onChange={onChange}
- />
- ) : null
- )}
- </CommandGroup>
- </ScrollArea>
- </CommandList>
- </Command>
- </PopoverContent>
- </Popover>
- );
-};
-
-interface CountrySelectOptionProps extends RPNInput.FlagProps {
- selectedCountry: RPNInput.Country;
- onChange: (country: RPNInput.Country) => void;
-}
-
-const CountrySelectOption = ({
- country,
- countryName,
- selectedCountry,
- onChange,
-}: CountrySelectOptionProps) => {
- return (
- <CommandItem className="gap-2" onSelect={() => onChange(country)}>
- <FlagComponent country={country} countryName={countryName} />
- <span className="flex-1 text-sm">{countryName}</span>
- <span className="text-sm text-foreground/50">{`+${RPNInput.getCountryCallingCode(country)}`}</span>
- <CheckIcon
- className={`ml-auto size-4 ${country === selectedCountry ? "opacity-100" : "opacity-0"}`}
- />
- </CommandItem>
- );
-};
-
-const FlagComponent = ({ country, countryName }: RPNInput.FlagProps) => {
- const Flag = flags[country];
-
- return (
- <span className="flex h-4 w-6 overflow-hidden rounded-sm bg-foreground/20 [&_svg]:size-full">
- {Flag && <Flag title={countryName} />}
- </span>
- );
-};
-
-export { PhoneInput };
+import * as React from "react"; +import { CheckIcon, ChevronsUpDown } from "lucide-react"; +import * as RPNInput from "react-phone-number-input"; +import flags from "react-phone-number-input/flags"; + +import { Button } from "./button"; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from "./command"; +import { Input } from "./input"; +import { Popover, PopoverContent, PopoverTrigger } from "./popover"; +import { ScrollArea } from "./scroll-area"; +import { cn } from "../../lib/utils"; + +type PhoneInputProps = Omit< + React.ComponentProps<"input">, + "onChange" | "value" | "ref" +> & + Omit<RPNInput.Props<typeof RPNInput.default>, "onChange"> & { + onChange?: (value: RPNInput.Value) => void; + }; + +const PhoneInput: React.ForwardRefExoticComponent<PhoneInputProps> = + React.forwardRef<React.ElementRef<typeof RPNInput.default>, PhoneInputProps>( + ({ className, onChange, defaultCountry = "US", ...props }, ref) => { + return ( + <RPNInput.default + ref={ref} + className={cn("flex", className)} + flagComponent={FlagComponent} + countrySelectComponent={CountrySelect} + inputComponent={InputComponent} + defaultCountry={defaultCountry} + international + addInternationalOption + smartCaret={false} + /** + * Handles the onChange event. + * + * react-phone-number-input might trigger the onChange event as undefined + * when a valid phone number is not entered. To prevent this, + * the value is coerced to an empty string. + * + * @param {E164Number | undefined} value - The entered value + */ + onChange={(value) => onChange?.(value || ("" as RPNInput.Value))} + {...props} + /> + ); + } + ); +PhoneInput.displayName = "PhoneInput"; + +const InputComponent = React.forwardRef< + HTMLInputElement, + React.ComponentProps<"input"> +>(({ className, ...props }, ref) => ( + <Input + className={cn("rounded-e-lg rounded-s-none", className)} + {...props} + ref={ref} + /> +)); +InputComponent.displayName = "InputComponent"; + +type CountryEntry = { label: string; value: RPNInput.Country | undefined }; + +type CountrySelectProps = { + disabled?: boolean; + value: RPNInput.Country; + options: CountryEntry[]; + onChange: (country: RPNInput.Country) => void; +}; + +const CountrySelect = ({ + disabled, + value: selectedCountry, + options: countryList, + onChange, +}: CountrySelectProps) => { + return ( + <Popover> + <PopoverTrigger asChild> + <Button + type="button" + variant="outline" + className="flex gap-1 rounded-e-none rounded-s-lg border-r-0 px-3 focus:z-10" + disabled={disabled} + > + <FlagComponent + country={selectedCountry} + countryName={selectedCountry} + /> + <ChevronsUpDown + className={cn( + "-mr-2 size-4 opacity-50", + disabled ? "hidden" : "opacity-100" + )} + /> + </Button> + </PopoverTrigger> + <PopoverContent className="w-[300px] p-0"> + <Command> + <CommandInput placeholder="Search country..." /> + <CommandList> + <ScrollArea className="h-72"> + <CommandEmpty>No country found.</CommandEmpty> + <CommandGroup> + {countryList.map(({ value, label }) => + value ? ( + <CountrySelectOption + key={value} + country={value} + countryName={label} + selectedCountry={selectedCountry} + onChange={onChange} + /> + ) : null + )} + </CommandGroup> + </ScrollArea> + </CommandList> + </Command> + </PopoverContent> + </Popover> + ); +}; + +interface CountrySelectOptionProps extends RPNInput.FlagProps { + selectedCountry: RPNInput.Country; + onChange: (country: RPNInput.Country) => void; +} + +const CountrySelectOption = ({ + country, + countryName, + selectedCountry, + onChange, +}: CountrySelectOptionProps) => { + return ( + <CommandItem className="gap-2" onSelect={() => onChange(country)}> + <FlagComponent country={country} countryName={countryName} /> + <span className="flex-1 text-sm">{countryName}</span> + <span className="text-sm text-foreground/50">{`+${RPNInput.getCountryCallingCode(country)}`}</span> + <CheckIcon + className={`ml-auto size-4 ${country === selectedCountry ? "opacity-100" : "opacity-0"}`} + /> + </CommandItem> + ); +}; + +const FlagComponent = ({ country, countryName }: RPNInput.FlagProps) => { + const Flag = flags[country]; + + return ( + <span className="flex h-4 w-6 overflow-hidden rounded-sm bg-foreground/20 [&_svg]:size-full"> + {Flag && <Flag title={countryName} />} + </span> + ); +}; + +export { PhoneInput }; diff --git a/apps/web/src/components/ui/separator.tsx b/apps/web/src/components/ui/separator.tsx index 12d81c4a..5b6774dc 100644 --- a/apps/web/src/components/ui/separator.tsx +++ b/apps/web/src/components/ui/separator.tsx @@ -1,9 +1,9 @@ -"use client" +"use client"; -import * as React from "react" -import * as SeparatorPrimitive from "@radix-ui/react-separator" +import * as React from "react"; +import * as SeparatorPrimitive from "@radix-ui/react-separator"; -import { cn } from "@/lib/utils" +import { cn } from "@/lib/utils"; const Separator = React.forwardRef< React.ElementRef<typeof SeparatorPrimitive.Root>, @@ -25,7 +25,7 @@ const Separator = React.forwardRef< {...props} /> ) -) -Separator.displayName = SeparatorPrimitive.Root.displayName +); +Separator.displayName = SeparatorPrimitive.Root.displayName; -export { Separator } +export { Separator }; diff --git a/apps/web/src/components/ui/sonner.tsx b/apps/web/src/components/ui/sonner.tsx index 452f4d9f..549cf841 100644 --- a/apps/web/src/components/ui/sonner.tsx +++ b/apps/web/src/components/ui/sonner.tsx @@ -1,12 +1,12 @@ -"use client" +"use client"; -import { useTheme } from "next-themes" -import { Toaster as Sonner } from "sonner" +import { useTheme } from "next-themes"; +import { Toaster as Sonner } from "sonner"; -type ToasterProps = React.ComponentProps<typeof Sonner> +type ToasterProps = React.ComponentProps<typeof Sonner>; const Toaster = ({ ...props }: ToasterProps) => { - const { theme = "system" } = useTheme() + const { theme = "system" } = useTheme(); return ( <Sonner @@ -25,7 +25,7 @@ const Toaster = ({ ...props }: ToasterProps) => { }} {...props} /> - ) -} + ); +}; -export { Toaster } +export { Toaster }; diff --git a/apps/web/src/components/ui/sponsor-button.tsx b/apps/web/src/components/ui/sponsor-button.tsx index 79c708a2..a060e428 100644 --- a/apps/web/src/components/ui/sponsor-button.tsx +++ b/apps/web/src/components/ui/sponsor-button.tsx @@ -14,7 +14,6 @@ export function SponsorButton({ companyName, className = "", }: SponsorButtonProps) { - return ( <motion.a href={href} diff --git a/apps/web/src/components/ui/toaster.tsx b/apps/web/src/components/ui/toaster.tsx index 3eb8a720..baf623f0 100644 --- a/apps/web/src/components/ui/toaster.tsx +++ b/apps/web/src/components/ui/toaster.tsx @@ -15,20 +15,16 @@ export function Toaster() { return ( <ToastProvider> - {toasts.map(function ({ id, title, description, action, ...props }) { - return ( - <Toast key={id} {...props}> - <div className="grid gap-1"> - {title && <ToastTitle>{title}</ToastTitle>} - {description && ( - <ToastDescription>{description}</ToastDescription> - )} - </div> - {action} - <ToastClose /> - </Toast> - ); - })} + {toasts.map(({ id, title, description, action, ...props }) => ( + <Toast key={id} {...props}> + <div className="grid gap-1"> + {title && <ToastTitle>{title}</ToastTitle>} + {description && <ToastDescription>{description}</ToastDescription>} + </div> + {action} + <ToastClose /> + </Toast> + ))} <ToastViewport /> </ToastProvider> ); diff --git a/apps/web/src/constants/actions.ts b/apps/web/src/constants/actions.ts index 5f1883f1..4278ce7e 100644 --- a/apps/web/src/constants/actions.ts +++ b/apps/web/src/constants/actions.ts @@ -191,7 +191,7 @@ export function isActionBound(action: Action): boolean { export function useActionHandler<A extends Action>( action: A, handler: ActionFunc<A>, - isActive: MutableRefObject<boolean> | boolean | undefined = undefined + isActive: MutableRefObject<boolean> | boolean | undefined ) { const handlerRef = useRef(handler); const [isBound, setIsBound] = useState(false); diff --git a/apps/web/src/constants/font-constants.ts b/apps/web/src/constants/font-constants.ts index bfddc182..a1c4e4d5 100644 --- a/apps/web/src/constants/font-constants.ts +++ b/apps/web/src/constants/font-constants.ts @@ -1,79 +1,79 @@ -export interface FontOption {
- value: string;
- label: string;
- category: "system" | "google" | "custom";
- weights?: number[];
- hasClassName?: boolean;
-}
-
-export const FONT_OPTIONS: FontOption[] = [
- // System fonts (always available)
- { value: "Arial", label: "Arial", category: "system", hasClassName: false },
- {
- value: "Helvetica",
- label: "Helvetica",
- category: "system",
- hasClassName: false,
- },
- {
- value: "Times New Roman",
- label: "Times New Roman",
- category: "system",
- hasClassName: false,
- },
- {
- value: "Georgia",
- label: "Georgia",
- category: "system",
- hasClassName: false,
- },
-
- // Google Fonts (loaded in layout.tsx)
- {
- value: "Inter",
- label: "Inter",
- category: "google",
- weights: [400, 700],
- hasClassName: true,
- },
- {
- value: "Roboto",
- label: "Roboto",
- category: "google",
- weights: [400, 700],
- hasClassName: true,
- },
- {
- value: "Open Sans",
- label: "Open Sans",
- category: "google",
- hasClassName: true,
- },
- {
- value: "Playfair Display",
- label: "Playfair Display",
- category: "google",
- hasClassName: true,
- },
- {
- value: "Comic Neue",
- label: "Comic Neue",
- category: "google",
- hasClassName: false,
- },
-] as const;
-
-export const DEFAULT_FONT = "Arial";
-
-// Type-safe font family union
-export type FontFamily = (typeof FONT_OPTIONS)[number]["value"];
-
-// Helper functions
-export const getFontByValue = (value: string): FontOption | undefined =>
- FONT_OPTIONS.find((font) => font.value === value);
-
-export const getGoogleFonts = (): FontOption[] =>
- FONT_OPTIONS.filter((font) => font.category === "google");
-
-export const getSystemFonts = (): FontOption[] =>
- FONT_OPTIONS.filter((font) => font.category === "system");
+export interface FontOption { + value: string; + label: string; + category: "system" | "google" | "custom"; + weights?: number[]; + hasClassName?: boolean; +} + +export const FONT_OPTIONS: FontOption[] = [ + // System fonts (always available) + { value: "Arial", label: "Arial", category: "system", hasClassName: false }, + { + value: "Helvetica", + label: "Helvetica", + category: "system", + hasClassName: false, + }, + { + value: "Times New Roman", + label: "Times New Roman", + category: "system", + hasClassName: false, + }, + { + value: "Georgia", + label: "Georgia", + category: "system", + hasClassName: false, + }, + + // Google Fonts (loaded in layout.tsx) + { + value: "Inter", + label: "Inter", + category: "google", + weights: [400, 700], + hasClassName: true, + }, + { + value: "Roboto", + label: "Roboto", + category: "google", + weights: [400, 700], + hasClassName: true, + }, + { + value: "Open Sans", + label: "Open Sans", + category: "google", + hasClassName: true, + }, + { + value: "Playfair Display", + label: "Playfair Display", + category: "google", + hasClassName: true, + }, + { + value: "Comic Neue", + label: "Comic Neue", + category: "google", + hasClassName: false, + }, +] as const; + +export const DEFAULT_FONT = "Arial"; + +// Type-safe font family union +export type FontFamily = (typeof FONT_OPTIONS)[number]["value"]; + +// Helper functions +export const getFontByValue = (value: string): FontOption | undefined => + FONT_OPTIONS.find((font) => font.value === value); + +export const getGoogleFonts = (): FontOption[] => + FONT_OPTIONS.filter((font) => font.category === "google"); + +export const getSystemFonts = (): FontOption[] => + FONT_OPTIONS.filter((font) => font.category === "system"); diff --git a/apps/web/src/constants/site.ts b/apps/web/src/constants/site.ts new file mode 100644 index 00000000..f47f6470 --- /dev/null +++ b/apps/web/src/constants/site.ts @@ -0,0 +1,11 @@ +export const SITE_URL = "https://opencut.app"; + +export const SITE_INFO = { + title: "OpenCut", + description: + "A simple but powerful video editor that gets the job done. In your browser.", + url: SITE_URL, + openGraphImage: "/open-graph/default.jpg", + twitterImage: "/open-graph/default.jpg", + favicon: "/favicon.ico", +}; diff --git a/apps/web/src/data/colors.ts b/apps/web/src/data/colors.ts index 3ef094d6..9a12a587 100644 --- a/apps/web/src/data/colors.ts +++ b/apps/web/src/data/colors.ts @@ -1,244 +1,244 @@ -export const colors = [
- "#ffffff",
- "#000000",
- "#ffe2e2",
- "#ffc9c9",
- "#ffa2a2",
- "#ff6467",
- "#fb2c36",
- "#e7000b",
- "#c10007",
- "#9f0712",
- "#82181a",
- "#460809",
- "#fff7ed",
- "#ffedd4",
- "#ffd6a7",
- "#ffb86a",
- "#ff8904",
- "#ff6900",
- "#f54900",
- "#ca3500",
- "#9f2d00",
- "#7e2a0c",
- "#441306",
- "#fffbeb",
- "#fef3c6",
- "#fee685",
- "#ffd230",
- "#ffb900",
- "#fe9a00",
- "#e17100",
- "#bb4d00",
- "#973c00",
- "#7b3306",
- "#461901",
- "#fefce8",
- "#fef9c2",
- "#fff085",
- "#ffdf20",
- "#fdc700",
- "#f0b100",
- "#d08700",
- "#a65f00",
- "#894b00",
- "#733e0a",
- "#432004",
- "#f7fee7",
- "#ecfcca",
- "#d8f999",
- "#bbf451",
- "#9ae600",
- "#7ccf00",
- "#5ea500",
- "#497d00",
- "#3c6300",
- "#35530e",
- "#192e03",
- "#f0fdf4",
- "#dcfce7",
- "#b9f8cf",
- "#7bf1a8",
- "#05df72",
- "#00c950",
- "#00a63e",
- "#008236",
- "#016630",
- "#0d542b",
- "#032e15",
- "#ecfdf5",
- "#d0fae5",
- "#a4f4cf",
- "#5ee9b5",
- "#00d492",
- "#00bc7d",
- "#009966",
- "#007a55",
- "#006045",
- "#004f3b",
- "#002c22",
- "#f0fdfa",
- "#cbfbf1",
- "#96f7e4",
- "#46ecd5",
- "#00d5be",
- "#00bba7",
- "#009689",
- "#00786f",
- "#005f5a",
- "#0b4f4a",
- "#022f2e",
- "#ecfeff",
- "#cefafe",
- "#a2f4fd",
- "#53eafd",
- "#00d3f2",
- "#00b8db",
- "#0092b8",
- "#007595",
- "#005f78",
- "#104e64",
- "#053345",
- "#f0f9ff",
- "#dff2fe",
- "#b8e6fe",
- "#74d4ff",
- "#00bcff",
- "#00a6f4",
- "#0084d1",
- "#0069a8",
- "#00598a",
- "#024a70",
- "#052f4a",
- "#eff6ff",
- "#dbeafe",
- "#bedbff",
- "#8ec5ff",
- "#51a2ff",
- "#2b7fff",
- "#155dfc",
- "#1447e6",
- "#193cb8",
- "#1c398e",
- "#162456",
- "#eef2ff",
- "#e0e7ff",
- "#c6d2ff",
- "#a3b3ff",
- "#7c86ff",
- "#615fff",
- "#4f39f6",
- "#432dd7",
- "#372aac",
- "#312c85",
- "#1e1a4d",
- "#f5f3ff",
- "#ede9fe",
- "#ddd6ff",
- "#c4b4ff",
- "#a684ff",
- "#8e51ff",
- "#7f22fe",
- "#7008e7",
- "#5d0ec0",
- "#4d179a",
- "#2f0d68",
- "#faf5ff",
- "#f3e8ff",
- "#e9d4ff",
- "#dab2ff",
- "#c27aff",
- "#ad46ff",
- "#9810fa",
- "#8200db",
- "#6e11b0",
- "#59168b",
- "#3c0366",
- "#fdf4ff",
- "#fae8ff",
- "#f6cfff",
- "#f4a8ff",
- "#ed6aff",
- "#e12afb",
- "#c800de",
- "#a800b7",
- "#8a0194",
- "#721378",
- "#4b004f",
- "#fdf2f8",
- "#fce7f3",
- "#fccee8",
- "#fda5d5",
- "#fb64b6",
- "#f6339a",
- "#e60076",
- "#c6005c",
- "#a3004c",
- "#861043",
- "#510424",
- "#fff1f2",
- "#ffe4e6",
- "#ffccd3",
- "#ffa1ad",
- "#ff637e",
- "#ff2056",
- "#ec003f",
- "#c70036",
- "#a50036",
- "#8b0836",
- "#4d0218",
- "#f8fafc",
- "#f1f5f9",
- "#e2e8f0",
- "#cad5e2",
- "#90a1b9",
- "#62748e",
- "#45556c",
- "#314158",
- "#1d293d",
- "#0f172b",
- "#020618",
- "#f9fafb",
- "#f3f4f6",
- "#e5e7eb",
- "#d1d5dc",
- "#99a1af",
- "#6a7282",
- "#4a5565",
- "#364153",
- "#1e2939",
- "#101828",
- "#030712",
- "#fafafa",
- "#f4f4f5",
- "#e4e4e7",
- "#d4d4d8",
- "#9f9fa9",
- "#71717b",
- "#52525c",
- "#3f3f46",
- "#27272a",
- "#18181b",
- "#09090b",
- "#f5f5f5",
- "#e5e5e5",
- "#d4d4d4",
- "#a1a1a1",
- "#737373",
- "#525252",
- "#404040",
- "#262626",
- "#171717",
- "#0a0a0a",
- "#fafaf9",
- "#f5f5f4",
- "#e7e5e4",
- "#d6d3d1",
- "#a6a09b",
- "#79716b",
- "#57534d",
- "#44403b",
- "#292524",
- "#1c1917",
- "#0c0a09",
-];
+export const colors = [ + "#ffffff", + "#000000", + "#ffe2e2", + "#ffc9c9", + "#ffa2a2", + "#ff6467", + "#fb2c36", + "#e7000b", + "#c10007", + "#9f0712", + "#82181a", + "#460809", + "#fff7ed", + "#ffedd4", + "#ffd6a7", + "#ffb86a", + "#ff8904", + "#ff6900", + "#f54900", + "#ca3500", + "#9f2d00", + "#7e2a0c", + "#441306", + "#fffbeb", + "#fef3c6", + "#fee685", + "#ffd230", + "#ffb900", + "#fe9a00", + "#e17100", + "#bb4d00", + "#973c00", + "#7b3306", + "#461901", + "#fefce8", + "#fef9c2", + "#fff085", + "#ffdf20", + "#fdc700", + "#f0b100", + "#d08700", + "#a65f00", + "#894b00", + "#733e0a", + "#432004", + "#f7fee7", + "#ecfcca", + "#d8f999", + "#bbf451", + "#9ae600", + "#7ccf00", + "#5ea500", + "#497d00", + "#3c6300", + "#35530e", + "#192e03", + "#f0fdf4", + "#dcfce7", + "#b9f8cf", + "#7bf1a8", + "#05df72", + "#00c950", + "#00a63e", + "#008236", + "#016630", + "#0d542b", + "#032e15", + "#ecfdf5", + "#d0fae5", + "#a4f4cf", + "#5ee9b5", + "#00d492", + "#00bc7d", + "#009966", + "#007a55", + "#006045", + "#004f3b", + "#002c22", + "#f0fdfa", + "#cbfbf1", + "#96f7e4", + "#46ecd5", + "#00d5be", + "#00bba7", + "#009689", + "#00786f", + "#005f5a", + "#0b4f4a", + "#022f2e", + "#ecfeff", + "#cefafe", + "#a2f4fd", + "#53eafd", + "#00d3f2", + "#00b8db", + "#0092b8", + "#007595", + "#005f78", + "#104e64", + "#053345", + "#f0f9ff", + "#dff2fe", + "#b8e6fe", + "#74d4ff", + "#00bcff", + "#00a6f4", + "#0084d1", + "#0069a8", + "#00598a", + "#024a70", + "#052f4a", + "#eff6ff", + "#dbeafe", + "#bedbff", + "#8ec5ff", + "#51a2ff", + "#2b7fff", + "#155dfc", + "#1447e6", + "#193cb8", + "#1c398e", + "#162456", + "#eef2ff", + "#e0e7ff", + "#c6d2ff", + "#a3b3ff", + "#7c86ff", + "#615fff", + "#4f39f6", + "#432dd7", + "#372aac", + "#312c85", + "#1e1a4d", + "#f5f3ff", + "#ede9fe", + "#ddd6ff", + "#c4b4ff", + "#a684ff", + "#8e51ff", + "#7f22fe", + "#7008e7", + "#5d0ec0", + "#4d179a", + "#2f0d68", + "#faf5ff", + "#f3e8ff", + "#e9d4ff", + "#dab2ff", + "#c27aff", + "#ad46ff", + "#9810fa", + "#8200db", + "#6e11b0", + "#59168b", + "#3c0366", + "#fdf4ff", + "#fae8ff", + "#f6cfff", + "#f4a8ff", + "#ed6aff", + "#e12afb", + "#c800de", + "#a800b7", + "#8a0194", + "#721378", + "#4b004f", + "#fdf2f8", + "#fce7f3", + "#fccee8", + "#fda5d5", + "#fb64b6", + "#f6339a", + "#e60076", + "#c6005c", + "#a3004c", + "#861043", + "#510424", + "#fff1f2", + "#ffe4e6", + "#ffccd3", + "#ffa1ad", + "#ff637e", + "#ff2056", + "#ec003f", + "#c70036", + "#a50036", + "#8b0836", + "#4d0218", + "#f8fafc", + "#f1f5f9", + "#e2e8f0", + "#cad5e2", + "#90a1b9", + "#62748e", + "#45556c", + "#314158", + "#1d293d", + "#0f172b", + "#020618", + "#f9fafb", + "#f3f4f6", + "#e5e7eb", + "#d1d5dc", + "#99a1af", + "#6a7282", + "#4a5565", + "#364153", + "#1e2939", + "#101828", + "#030712", + "#fafafa", + "#f4f4f5", + "#e4e4e7", + "#d4d4d8", + "#9f9fa9", + "#71717b", + "#52525c", + "#3f3f46", + "#27272a", + "#18181b", + "#09090b", + "#f5f5f5", + "#e5e5e5", + "#d4d4d4", + "#a1a1a1", + "#737373", + "#525252", + "#404040", + "#262626", + "#171717", + "#0a0a0a", + "#fafaf9", + "#f5f5f4", + "#e7e5e4", + "#d6d3d1", + "#a6a09b", + "#79716b", + "#57534d", + "#44403b", + "#292524", + "#1c1917", + "#0c0a09", +]; diff --git a/apps/web/src/hooks/auth/useLogin.ts b/apps/web/src/hooks/auth/useLogin.ts index 12eddcbf..b2c5ef98 100644 --- a/apps/web/src/hooks/auth/useLogin.ts +++ b/apps/web/src/hooks/auth/useLogin.ts @@ -3,58 +3,58 @@ import { useRouter } from "next/navigation"; import { signIn } from "@opencut/auth/client"; export function useLogin() { - const router = useRouter(); - const [email, setEmail] = useState(""); - const [password, setPassword] = useState(""); - const [error, setError] = useState<string | null>(null); - const [isEmailLoading, setIsEmailLoading] = useState(false); - const [isGoogleLoading, setIsGoogleLoading] = useState(false); + const router = useRouter(); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [error, setError] = useState<string | null>(null); + const [isEmailLoading, setIsEmailLoading] = useState(false); + const [isGoogleLoading, setIsGoogleLoading] = useState(false); - const handleLogin = useCallback(async () => { - setError(null); - setIsEmailLoading(true); + const handleLogin = useCallback(async () => { + setError(null); + setIsEmailLoading(true); - const { error } = await signIn.email({ - email, - password, - }); + const { error } = await signIn.email({ + email, + password, + }); - if (error) { - setError(error.message || "An unexpected error occurred."); - setIsEmailLoading(false); - return; - } + if (error) { + setError(error.message || "An unexpected error occurred."); + setIsEmailLoading(false); + return; + } - router.push("/projects"); - }, [router, email, password]); + router.push("/projects"); + }, [router, email, password]); - const handleGoogleLogin = async () => { - setError(null); - setIsGoogleLoading(true); + const handleGoogleLogin = async () => { + setError(null); + setIsGoogleLoading(true); - try { - await signIn.social({ - provider: "google", - callbackURL: "/projects", - }); - } catch (error) { - setError("Failed to sign in with Google. Please try again."); - setIsGoogleLoading(false); - } - }; + try { + await signIn.social({ + provider: "google", + callbackURL: "/projects", + }); + } catch (error) { + setError("Failed to sign in with Google. Please try again."); + setIsGoogleLoading(false); + } + }; - const isAnyLoading = isEmailLoading || isGoogleLoading; + const isAnyLoading = isEmailLoading || isGoogleLoading; - return { - email, - setEmail, - password, - setPassword, - error, - isEmailLoading, - isGoogleLoading, - isAnyLoading, - handleLogin, - handleGoogleLogin, - }; + return { + email, + setEmail, + password, + setPassword, + error, + isEmailLoading, + isGoogleLoading, + isAnyLoading, + handleLogin, + handleGoogleLogin, + }; } diff --git a/apps/web/src/hooks/auth/useSignUp.ts b/apps/web/src/hooks/auth/useSignUp.ts index 4cd2850a..b6039f85 100644 --- a/apps/web/src/hooks/auth/useSignUp.ts +++ b/apps/web/src/hooks/auth/useSignUp.ts @@ -3,63 +3,63 @@ import { useRouter } from "next/navigation"; import { signUp, signIn } from "@opencut/auth/client"; export function useSignUp() { - const router = useRouter(); - const [name, setName] = useState(""); - const [email, setEmail] = useState(""); - const [password, setPassword] = useState(""); - const [error, setError] = useState<string | null>(null); - const [isEmailLoading, setIsEmailLoading] = useState(false); - const [isGoogleLoading, setIsGoogleLoading] = useState(false); + const router = useRouter(); + const [name, setName] = useState(""); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [error, setError] = useState<string | null>(null); + const [isEmailLoading, setIsEmailLoading] = useState(false); + const [isGoogleLoading, setIsGoogleLoading] = useState(false); - const handleSignUp = useCallback(async () => { - setError(null); - setIsEmailLoading(true); + const handleSignUp = useCallback(async () => { + setError(null); + setIsEmailLoading(true); - const { error } = await signUp.email({ - name, - email, - password, - }); + const { error } = await signUp.email({ + name, + email, + password, + }); - if (error) { - setError(error.message || "An unexpected error occurred."); - setIsEmailLoading(false); - return; - } + if (error) { + setError(error.message || "An unexpected error occurred."); + setIsEmailLoading(false); + return; + } - router.push("/login"); - }, [name, email, password, router]); + router.push("/login"); + }, [name, email, password, router]); - const handleGoogleSignUp = useCallback(async () => { - setError(null); - setIsGoogleLoading(true); + const handleGoogleSignUp = useCallback(async () => { + setError(null); + setIsGoogleLoading(true); - try { - await signIn.social({ - provider: "google", - }); + try { + await signIn.social({ + provider: "google", + }); - router.push("/editor"); - } catch (error) { - setError("Failed to sign up with Google. Please try again."); - setIsGoogleLoading(false); - } - }, [router]); + router.push("/editor"); + } catch (error) { + setError("Failed to sign up with Google. Please try again."); + setIsGoogleLoading(false); + } + }, [router]); - const isAnyLoading = isEmailLoading || isGoogleLoading; + const isAnyLoading = isEmailLoading || isGoogleLoading; - return { - name, - setName, - email, - setEmail, - password, - setPassword, - error, - isEmailLoading, - isGoogleLoading, - isAnyLoading, - handleSignUp, - handleGoogleSignUp, - }; -}
\ No newline at end of file + return { + name, + setName, + email, + setEmail, + password, + setPassword, + error, + isEmailLoading, + isGoogleLoading, + isAnyLoading, + handleSignUp, + handleGoogleSignUp, + }; +} diff --git a/apps/web/src/hooks/use-aspect-ratio.ts b/apps/web/src/hooks/use-aspect-ratio.ts index 40de8454..e3e85141 100644 --- a/apps/web/src/hooks/use-aspect-ratio.ts +++ b/apps/web/src/hooks/use-aspect-ratio.ts @@ -1,92 +1,92 @@ -import { useEditorStore } from "@/stores/editor-store";
-import { useMediaStore, getMediaAspectRatio } from "@/stores/media-store";
-import { useTimelineStore } from "@/stores/timeline-store";
-
-export function useAspectRatio() {
- const { canvasSize, canvasMode, canvasPresets } = useEditorStore();
- const { mediaItems } = useMediaStore();
- const { tracks } = useTimelineStore();
-
- // Find the current preset based on canvas size
- const currentPreset = canvasPresets.find(
- (preset) =>
- preset.width === canvasSize.width && preset.height === canvasSize.height
- );
-
- // Get the original aspect ratio from the first video/image in timeline
- const getOriginalAspectRatio = (): number => {
- // Find first video or image in timeline
- for (const track of tracks) {
- for (const element of track.elements) {
- if (element.type === "media") {
- const mediaItem = mediaItems.find(
- (item) => item.id === element.mediaId
- );
- if (
- mediaItem &&
- (mediaItem.type === "video" || mediaItem.type === "image")
- ) {
- return getMediaAspectRatio(mediaItem);
- }
- }
- }
- }
- return 16 / 9; // Default aspect ratio
- };
-
- // Get current aspect ratio
- const getCurrentAspectRatio = (): number => {
- return canvasSize.width / canvasSize.height;
- };
-
- // Format aspect ratio as a readable string
- const formatAspectRatio = (aspectRatio: number): string => {
- // Check if it matches a common aspect ratio
- const ratios = [
- { ratio: 16 / 9, label: "16:9" },
- { ratio: 9 / 16, label: "9:16" },
- { ratio: 1, label: "1:1" },
- { ratio: 4 / 3, label: "4:3" },
- { ratio: 3 / 4, label: "3:4" },
- { ratio: 21 / 9, label: "21:9" },
- ];
-
- for (const { ratio, label } of ratios) {
- if (Math.abs(aspectRatio - ratio) < 0.01) {
- return label;
- }
- }
-
- // If not a common ratio, format as decimal
- return aspectRatio.toFixed(2);
- };
-
- // Check if current mode is "Original"
- const isOriginal = canvasMode === "original";
-
- // Get display name for current aspect ratio
- const getDisplayName = (): string => {
- // If explicitly set to original mode, always show "Original"
- if (canvasMode === "original") {
- return "Original";
- }
-
- if (currentPreset) {
- return currentPreset.name;
- }
-
- return formatAspectRatio(getCurrentAspectRatio());
- };
-
- return {
- currentPreset,
- canvasMode,
- isOriginal,
- getCurrentAspectRatio,
- getOriginalAspectRatio,
- formatAspectRatio,
- getDisplayName,
- canvasSize,
- canvasPresets,
- };
-}
+import { useEditorStore } from "@/stores/editor-store"; +import { useMediaStore, getMediaAspectRatio } from "@/stores/media-store"; +import { useTimelineStore } from "@/stores/timeline-store"; + +export function useAspectRatio() { + const { canvasSize, canvasMode, canvasPresets } = useEditorStore(); + const { mediaItems } = useMediaStore(); + const { tracks } = useTimelineStore(); + + // Find the current preset based on canvas size + const currentPreset = canvasPresets.find( + (preset) => + preset.width === canvasSize.width && preset.height === canvasSize.height + ); + + // Get the original aspect ratio from the first video/image in timeline + const getOriginalAspectRatio = (): number => { + // Find first video or image in timeline + for (const track of tracks) { + for (const element of track.elements) { + if (element.type === "media") { + const mediaItem = mediaItems.find( + (item) => item.id === element.mediaId + ); + if ( + mediaItem && + (mediaItem.type === "video" || mediaItem.type === "image") + ) { + return getMediaAspectRatio(mediaItem); + } + } + } + } + return 16 / 9; // Default aspect ratio + }; + + // Get current aspect ratio + const getCurrentAspectRatio = (): number => { + return canvasSize.width / canvasSize.height; + }; + + // Format aspect ratio as a readable string + const formatAspectRatio = (aspectRatio: number): string => { + // Check if it matches a common aspect ratio + const ratios = [ + { ratio: 16 / 9, label: "16:9" }, + { ratio: 9 / 16, label: "9:16" }, + { ratio: 1, label: "1:1" }, + { ratio: 4 / 3, label: "4:3" }, + { ratio: 3 / 4, label: "3:4" }, + { ratio: 21 / 9, label: "21:9" }, + ]; + + for (const { ratio, label } of ratios) { + if (Math.abs(aspectRatio - ratio) < 0.01) { + return label; + } + } + + // If not a common ratio, format as decimal + return aspectRatio.toFixed(2); + }; + + // Check if current mode is "Original" + const isOriginal = canvasMode === "original"; + + // Get display name for current aspect ratio + const getDisplayName = (): string => { + // If explicitly set to original mode, always show "Original" + if (canvasMode === "original") { + return "Original"; + } + + if (currentPreset) { + return currentPreset.name; + } + + return formatAspectRatio(getCurrentAspectRatio()); + }; + + return { + currentPreset, + canvasMode, + isOriginal, + getCurrentAspectRatio, + getOriginalAspectRatio, + formatAspectRatio, + getDisplayName, + canvasSize, + canvasPresets, + }; +} diff --git a/apps/web/src/hooks/use-drag-drop.ts b/apps/web/src/hooks/use-drag-drop.ts index eaab89d8..0b1d4008 100644 --- a/apps/web/src/hooks/use-drag-drop.ts +++ b/apps/web/src/hooks/use-drag-drop.ts @@ -1,85 +1,85 @@ -import { useState, useRef } from "react";
-
-interface UseDragDropOptions {
- onDrop?: (files: FileList) => void;
-}
-
-// Helper function to check if drag contains files from external sources (not internal app drags)
-const containsFiles = (dataTransfer: DataTransfer): boolean => {
- // Check if this is an internal app drag (media item)
- if (dataTransfer.types.includes("application/x-media-item")) {
- return false;
- }
-
- // Only show overlay for external file drags
- return dataTransfer.types.includes("Files");
-};
-
-export function useDragDrop(options: UseDragDropOptions = {}) {
- const [isDragOver, setIsDragOver] = useState(false);
- const dragCounterRef = useRef(0);
-
- const handleDragEnter = (e: React.DragEvent) => {
- e.preventDefault();
-
- // Only handle external file drags, not internal app element drags
- if (!containsFiles(e.dataTransfer)) {
- return;
- }
-
- dragCounterRef.current += 1;
- if (!isDragOver) {
- setIsDragOver(true);
- }
- };
-
- const handleDragOver = (e: React.DragEvent) => {
- e.preventDefault();
-
- // Only handle file drags
- if (!containsFiles(e.dataTransfer)) {
- return;
- }
- };
-
- const handleDragLeave = (e: React.DragEvent) => {
- e.preventDefault();
-
- // Only handle file drags
- if (!containsFiles(e.dataTransfer)) {
- return;
- }
-
- dragCounterRef.current -= 1;
- if (dragCounterRef.current === 0) {
- setIsDragOver(false);
- }
- };
-
- const handleDrop = (e: React.DragEvent) => {
- e.preventDefault();
- setIsDragOver(false);
- dragCounterRef.current = 0;
-
- // Only handle file drops
- if (
- options.onDrop &&
- e.dataTransfer.files &&
- containsFiles(e.dataTransfer)
- ) {
- options.onDrop(e.dataTransfer.files);
- }
- };
-
- const dragProps = {
- onDragEnter: handleDragEnter,
- onDragOver: handleDragOver,
- onDragLeave: handleDragLeave,
- onDrop: handleDrop,
- };
-
- return {
- isDragOver,
- dragProps,
- };
-}
+import { useState, useRef } from "react"; + +interface UseDragDropOptions { + onDrop?: (files: FileList) => void; +} + +// Helper function to check if drag contains files from external sources (not internal app drags) +const containsFiles = (dataTransfer: DataTransfer): boolean => { + // Check if this is an internal app drag (media item) + if (dataTransfer.types.includes("application/x-media-item")) { + return false; + } + + // Only show overlay for external file drags + return dataTransfer.types.includes("Files"); +}; + +export function useDragDrop(options: UseDragDropOptions = {}) { + const [isDragOver, setIsDragOver] = useState(false); + const dragCounterRef = useRef(0); + + const handleDragEnter = (e: React.DragEvent) => { + e.preventDefault(); + + // Only handle external file drags, not internal app element drags + if (!containsFiles(e.dataTransfer)) { + return; + } + + dragCounterRef.current += 1; + if (!isDragOver) { + setIsDragOver(true); + } + }; + + const handleDragOver = (e: React.DragEvent) => { + e.preventDefault(); + + // Only handle file drags + if (!containsFiles(e.dataTransfer)) { + return; + } + }; + + const handleDragLeave = (e: React.DragEvent) => { + e.preventDefault(); + + // Only handle file drags + if (!containsFiles(e.dataTransfer)) { + return; + } + + dragCounterRef.current -= 1; + if (dragCounterRef.current === 0) { + setIsDragOver(false); + } + }; + + const handleDrop = (e: React.DragEvent) => { + e.preventDefault(); + setIsDragOver(false); + dragCounterRef.current = 0; + + // Only handle file drops + if ( + options.onDrop && + e.dataTransfer.files && + containsFiles(e.dataTransfer) + ) { + options.onDrop(e.dataTransfer.files); + } + }; + + const dragProps = { + onDragEnter: handleDragEnter, + onDragOver: handleDragOver, + onDragLeave: handleDragLeave, + onDrop: handleDrop, + }; + + return { + isDragOver, + dragProps, + }; +} diff --git a/apps/web/src/hooks/use-editor-actions.ts b/apps/web/src/hooks/use-editor-actions.ts index 4e8f6aef..b2fad55f 100644 --- a/apps/web/src/hooks/use-editor-actions.ts +++ b/apps/web/src/hooks/use-editor-actions.ts @@ -28,52 +28,52 @@ export function useEditorActions() { // Playback actions useActionHandler("toggle-play", () => { toggle(); - }); + }, undefined); useActionHandler("stop-playback", () => { if (isPlaying) { toggle(); } seek(0); - }); + }, undefined); useActionHandler("seek-forward", (args) => { const seconds = args?.seconds ?? 1; seek(Math.min(duration, currentTime + seconds)); - }); + }, undefined); useActionHandler("seek-backward", (args) => { const seconds = args?.seconds ?? 1; seek(Math.max(0, currentTime - seconds)); - }); + }, undefined); useActionHandler("frame-step-forward", () => { const projectFps = activeProject?.fps || 30; seek(Math.min(duration, currentTime + 1 / projectFps)); - }); + }, undefined); useActionHandler("frame-step-backward", () => { const projectFps = activeProject?.fps || 30; seek(Math.max(0, currentTime - 1 / projectFps)); - }); + }, undefined); useActionHandler("jump-forward", (args) => { const seconds = args?.seconds ?? 5; seek(Math.min(duration, currentTime + seconds)); - }); + }, undefined); useActionHandler("jump-backward", (args) => { const seconds = args?.seconds ?? 5; seek(Math.max(0, currentTime - seconds)); - }); + }, undefined); useActionHandler("goto-start", () => { seek(0); - }); + }, undefined); useActionHandler("goto-end", () => { seek(duration); - }); + }, undefined); // Timeline editing actions useActionHandler("split-element", () => { @@ -98,7 +98,7 @@ export function useEditorActions() { toast.error("Playhead must be within selected element"); } } - }); + }, undefined); useActionHandler("delete-selected", () => { if (selectedElements.length === 0) { @@ -110,7 +110,7 @@ export function useEditorActions() { } ); clearSelectedElements(); - }); + }, undefined); useActionHandler("select-all", () => { const allElements = tracks.flatMap((track: any) => @@ -120,7 +120,7 @@ export function useEditorActions() { })) ); setSelectedElements(allElements); - }); + }, undefined); useActionHandler("duplicate-selected", () => { if (selectedElements.length !== 1) { @@ -144,18 +144,18 @@ export function useEditorActions() { startTime: newStartTime, }); } - }); + }, undefined); useActionHandler("toggle-snapping", () => { toggleSnapping(); - }); + }, undefined); // History actions useActionHandler("undo", () => { undo(); - }); + }, undefined); useActionHandler("redo", () => { redo(); - }); + }, undefined); } diff --git a/apps/web/src/hooks/use-keybindings.ts b/apps/web/src/hooks/use-keybindings.ts index 7887f3f1..7224c1c8 100644 --- a/apps/web/src/hooks/use-keybindings.ts +++ b/apps/web/src/hooks/use-keybindings.ts @@ -25,7 +25,7 @@ export function useKeybindingsListener() { ev.preventDefault(); // Handle actions with default arguments - let actionArgs: any = undefined; + let actionArgs: any; if (boundAction === "seek-forward") { actionArgs = { seconds: 1 }; diff --git a/apps/web/src/hooks/use-mobile.tsx b/apps/web/src/hooks/use-mobile.tsx index 2b0fe1df..48fab93c 100644 --- a/apps/web/src/hooks/use-mobile.tsx +++ b/apps/web/src/hooks/use-mobile.tsx @@ -1,19 +1,21 @@ -import * as React from "react" +import * as React from "react"; -const MOBILE_BREAKPOINT = 768 +const MOBILE_BREAKPOINT = 768; export function useIsMobile() { - const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined) + const [isMobile, setIsMobile] = React.useState<boolean | undefined>( + undefined + ); React.useEffect(() => { - const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) + const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`); const onChange = () => { - setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) - } - mql.addEventListener("change", onChange) - setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) - return () => mql.removeEventListener("change", onChange) - }, []) + setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); + }; + mql.addEventListener("change", onChange); + setIsMobile(window.innerWidth < MOBILE_BREAKPOINT); + return () => mql.removeEventListener("change", onChange); + }, []); - return !!isMobile + return !!isMobile; } diff --git a/apps/web/src/hooks/use-selection-box.ts b/apps/web/src/hooks/use-selection-box.ts index c40617c1..46e77fa9 100644 --- a/apps/web/src/hooks/use-selection-box.ts +++ b/apps/web/src/hooks/use-selection-box.ts @@ -1,199 +1,199 @@ -import { useState, useEffect, useCallback } from "react";
-
-interface UseSelectionBoxProps {
- containerRef: React.RefObject<HTMLElement>;
- playheadRef?: React.RefObject<HTMLElement>;
- onSelectionComplete: (
- elements: { trackId: string; elementId: string }[]
- ) => void;
- isEnabled?: boolean;
-}
-
-interface SelectionBoxState {
- startPos: { x: number; y: number };
- currentPos: { x: number; y: number };
- isActive: boolean;
-}
-
-export function useSelectionBox({
- containerRef,
- playheadRef,
- onSelectionComplete,
- isEnabled = true,
-}: UseSelectionBoxProps) {
- const [selectionBox, setSelectionBox] = useState<SelectionBoxState | null>(
- null
- );
- const [justFinishedSelecting, setJustFinishedSelecting] = useState(false);
-
- // Mouse down handler to start selection
- const handleMouseDown = useCallback(
- (e: React.MouseEvent) => {
- if (!isEnabled) return;
-
- // Only start selection on empty space clicks
- if ((e.target as HTMLElement).closest(".timeline-element")) {
- return;
- }
- if (playheadRef?.current?.contains(e.target as Node)) {
- return;
- }
- if ((e.target as HTMLElement).closest("[data-track-labels]")) {
- return;
- }
- // Don't start selection when clicking in the ruler area - this interferes with playhead dragging
- if ((e.target as HTMLElement).closest("[data-ruler-area]")) {
- return;
- }
-
- setSelectionBox({
- startPos: { x: e.clientX, y: e.clientY },
- currentPos: { x: e.clientX, y: e.clientY },
- isActive: false, // Will become active when mouse moves
- });
- },
- [isEnabled, playheadRef]
- );
-
- // Function to select elements within the selection box
- const selectElementsInBox = useCallback(
- (startPos: { x: number; y: number }, endPos: { x: number; y: number }) => {
- if (!containerRef.current) return;
-
- const container = containerRef.current;
- const containerRect = container.getBoundingClientRect();
-
- // Calculate selection rectangle in container coordinates
- const startX = startPos.x - containerRect.left;
- const startY = startPos.y - containerRect.top;
- const endX = endPos.x - containerRect.left;
- const endY = endPos.y - containerRect.top;
-
- const selectionRect = {
- left: Math.min(startX, endX),
- top: Math.min(startY, endY),
- right: Math.max(startX, endX),
- bottom: Math.max(startY, endY),
- };
-
- // Find all timeline elements within the selection rectangle
- const timelineElements = container.querySelectorAll(".timeline-element");
-
- const selectedElements: { trackId: string; elementId: string }[] = [];
-
- timelineElements.forEach((element) => {
- const elementRect = element.getBoundingClientRect();
- // Use absolute coordinates for more accurate intersection detection
- const elementAbsolute = {
- left: elementRect.left,
- top: elementRect.top,
- right: elementRect.right,
- bottom: elementRect.bottom,
- };
-
- const selectionAbsolute = {
- left: startPos.x,
- top: startPos.y,
- right: endPos.x,
- bottom: endPos.y,
- };
-
- // Normalize selection rectangle (handle dragging in any direction)
- const normalizedSelection = {
- left: Math.min(selectionAbsolute.left, selectionAbsolute.right),
- top: Math.min(selectionAbsolute.top, selectionAbsolute.bottom),
- right: Math.max(selectionAbsolute.left, selectionAbsolute.right),
- bottom: Math.max(selectionAbsolute.top, selectionAbsolute.bottom),
- };
-
- const elementId = element.getAttribute("data-element-id");
- const trackId = element.getAttribute("data-track-id");
-
- // Check if element intersects with selection rectangle (any overlap)
- // Using absolute coordinates for more precise detection
- const intersects = !(
- elementAbsolute.right < normalizedSelection.left ||
- elementAbsolute.left > normalizedSelection.right ||
- elementAbsolute.bottom < normalizedSelection.top ||
- elementAbsolute.top > normalizedSelection.bottom
- );
-
- if (intersects && elementId && trackId) {
- selectedElements.push({ trackId, elementId });
- }
- });
-
- // Always call the callback - with elements or empty array to clear selection
- console.log(
- JSON.stringify({ selectElementsInBox: selectedElements.length })
- );
- onSelectionComplete(selectedElements);
- },
- [containerRef, onSelectionComplete]
- );
-
- // Effect to track selection box movement
- useEffect(() => {
- if (!selectionBox) return;
-
- const handleMouseMove = (e: MouseEvent) => {
- const deltaX = Math.abs(e.clientX - selectionBox.startPos.x);
- const deltaY = Math.abs(e.clientY - selectionBox.startPos.y);
-
- // Start selection if mouse moved more than 5px
- const shouldActivate = deltaX > 5 || deltaY > 5;
-
- const newSelectionBox = {
- ...selectionBox,
- currentPos: { x: e.clientX, y: e.clientY },
- isActive: shouldActivate || selectionBox.isActive,
- };
-
- setSelectionBox(newSelectionBox);
-
- // Real-time visual feedback: update selection as we drag
- if (newSelectionBox.isActive) {
- selectElementsInBox(
- newSelectionBox.startPos,
- newSelectionBox.currentPos
- );
- }
- };
-
- const handleMouseUp = () => {
- console.log(
- JSON.stringify({ mouseUp: { wasActive: selectionBox?.isActive } })
- );
-
- // If we had an active selection, mark that we just finished selecting
- if (selectionBox?.isActive) {
- console.log(JSON.stringify({ settingJustFinishedSelecting: true }));
- setJustFinishedSelecting(true);
- // Clear the flag after a short delay to allow click events to check it
- setTimeout(() => {
- console.log(JSON.stringify({ clearingJustFinishedSelecting: true }));
- setJustFinishedSelecting(false);
- }, 50);
- }
-
- // Don't call selectElementsInBox again - real-time selection already handled it
- // Just clean up the selection box visual
- setSelectionBox(null);
- };
-
- window.addEventListener("mousemove", handleMouseMove);
- window.addEventListener("mouseup", handleMouseUp);
-
- return () => {
- window.removeEventListener("mousemove", handleMouseMove);
- window.removeEventListener("mouseup", handleMouseUp);
- };
- }, [selectionBox, selectElementsInBox]);
-
- return {
- selectionBox,
- handleMouseDown,
- isSelecting: selectionBox?.isActive || false,
- justFinishedSelecting,
- };
-}
+import { useState, useEffect, useCallback } from "react"; + +interface UseSelectionBoxProps { + containerRef: React.RefObject<HTMLElement>; + playheadRef?: React.RefObject<HTMLElement>; + onSelectionComplete: ( + elements: { trackId: string; elementId: string }[] + ) => void; + isEnabled?: boolean; +} + +interface SelectionBoxState { + startPos: { x: number; y: number }; + currentPos: { x: number; y: number }; + isActive: boolean; +} + +export function useSelectionBox({ + containerRef, + playheadRef, + onSelectionComplete, + isEnabled = true, +}: UseSelectionBoxProps) { + const [selectionBox, setSelectionBox] = useState<SelectionBoxState | null>( + null + ); + const [justFinishedSelecting, setJustFinishedSelecting] = useState(false); + + // Mouse down handler to start selection + const handleMouseDown = useCallback( + (e: React.MouseEvent) => { + if (!isEnabled) return; + + // Only start selection on empty space clicks + if ((e.target as HTMLElement).closest(".timeline-element")) { + return; + } + if (playheadRef?.current?.contains(e.target as Node)) { + return; + } + if ((e.target as HTMLElement).closest("[data-track-labels]")) { + return; + } + // Don't start selection when clicking in the ruler area - this interferes with playhead dragging + if ((e.target as HTMLElement).closest("[data-ruler-area]")) { + return; + } + + setSelectionBox({ + startPos: { x: e.clientX, y: e.clientY }, + currentPos: { x: e.clientX, y: e.clientY }, + isActive: false, // Will become active when mouse moves + }); + }, + [isEnabled, playheadRef] + ); + + // Function to select elements within the selection box + const selectElementsInBox = useCallback( + (startPos: { x: number; y: number }, endPos: { x: number; y: number }) => { + if (!containerRef.current) return; + + const container = containerRef.current; + const containerRect = container.getBoundingClientRect(); + + // Calculate selection rectangle in container coordinates + const startX = startPos.x - containerRect.left; + const startY = startPos.y - containerRect.top; + const endX = endPos.x - containerRect.left; + const endY = endPos.y - containerRect.top; + + const selectionRect = { + left: Math.min(startX, endX), + top: Math.min(startY, endY), + right: Math.max(startX, endX), + bottom: Math.max(startY, endY), + }; + + // Find all timeline elements within the selection rectangle + const timelineElements = container.querySelectorAll(".timeline-element"); + + const selectedElements: { trackId: string; elementId: string }[] = []; + + timelineElements.forEach((element) => { + const elementRect = element.getBoundingClientRect(); + // Use absolute coordinates for more accurate intersection detection + const elementAbsolute = { + left: elementRect.left, + top: elementRect.top, + right: elementRect.right, + bottom: elementRect.bottom, + }; + + const selectionAbsolute = { + left: startPos.x, + top: startPos.y, + right: endPos.x, + bottom: endPos.y, + }; + + // Normalize selection rectangle (handle dragging in any direction) + const normalizedSelection = { + left: Math.min(selectionAbsolute.left, selectionAbsolute.right), + top: Math.min(selectionAbsolute.top, selectionAbsolute.bottom), + right: Math.max(selectionAbsolute.left, selectionAbsolute.right), + bottom: Math.max(selectionAbsolute.top, selectionAbsolute.bottom), + }; + + const elementId = element.getAttribute("data-element-id"); + const trackId = element.getAttribute("data-track-id"); + + // Check if element intersects with selection rectangle (any overlap) + // Using absolute coordinates for more precise detection + const intersects = !( + elementAbsolute.right < normalizedSelection.left || + elementAbsolute.left > normalizedSelection.right || + elementAbsolute.bottom < normalizedSelection.top || + elementAbsolute.top > normalizedSelection.bottom + ); + + if (intersects && elementId && trackId) { + selectedElements.push({ trackId, elementId }); + } + }); + + // Always call the callback - with elements or empty array to clear selection + console.log( + JSON.stringify({ selectElementsInBox: selectedElements.length }) + ); + onSelectionComplete(selectedElements); + }, + [containerRef, onSelectionComplete] + ); + + // Effect to track selection box movement + useEffect(() => { + if (!selectionBox) return; + + const handleMouseMove = (e: MouseEvent) => { + const deltaX = Math.abs(e.clientX - selectionBox.startPos.x); + const deltaY = Math.abs(e.clientY - selectionBox.startPos.y); + + // Start selection if mouse moved more than 5px + const shouldActivate = deltaX > 5 || deltaY > 5; + + const newSelectionBox = { + ...selectionBox, + currentPos: { x: e.clientX, y: e.clientY }, + isActive: shouldActivate || selectionBox.isActive, + }; + + setSelectionBox(newSelectionBox); + + // Real-time visual feedback: update selection as we drag + if (newSelectionBox.isActive) { + selectElementsInBox( + newSelectionBox.startPos, + newSelectionBox.currentPos + ); + } + }; + + const handleMouseUp = () => { + console.log( + JSON.stringify({ mouseUp: { wasActive: selectionBox?.isActive } }) + ); + + // If we had an active selection, mark that we just finished selecting + if (selectionBox?.isActive) { + console.log(JSON.stringify({ settingJustFinishedSelecting: true })); + setJustFinishedSelecting(true); + // Clear the flag after a short delay to allow click events to check it + setTimeout(() => { + console.log(JSON.stringify({ clearingJustFinishedSelecting: true })); + setJustFinishedSelecting(false); + }, 50); + } + + // Don't call selectElementsInBox again - real-time selection already handled it + // Just clean up the selection box visual + setSelectionBox(null); + }; + + window.addEventListener("mousemove", handleMouseMove); + window.addEventListener("mouseup", handleMouseUp); + + return () => { + window.removeEventListener("mousemove", handleMouseMove); + window.removeEventListener("mouseup", handleMouseUp); + }; + }, [selectionBox, selectElementsInBox]); + + return { + selectionBox, + handleMouseDown, + isSelecting: selectionBox?.isActive || false, + justFinishedSelecting, + }; +} diff --git a/apps/web/src/hooks/use-timeline-playhead.ts b/apps/web/src/hooks/use-timeline-playhead.ts index 9a82c23f..008f61a4 100644 --- a/apps/web/src/hooks/use-timeline-playhead.ts +++ b/apps/web/src/hooks/use-timeline-playhead.ts @@ -1,157 +1,157 @@ -import { snapTimeToFrame } from "@/constants/timeline-constants";
-import { useProjectStore } from "@/stores/project-store";
-import { useState, useEffect, useCallback } from "react";
-
-interface UseTimelinePlayheadProps {
- currentTime: number;
- duration: number;
- zoomLevel: number;
- seek: (time: number) => void;
- rulerRef: React.RefObject<HTMLDivElement>;
- rulerScrollRef: React.RefObject<HTMLDivElement>;
- tracksScrollRef: React.RefObject<HTMLDivElement>;
- playheadRef?: React.RefObject<HTMLDivElement>;
-}
-
-export function useTimelinePlayhead({
- currentTime,
- duration,
- zoomLevel,
- seek,
- rulerRef,
- rulerScrollRef,
- tracksScrollRef,
- playheadRef,
-}: UseTimelinePlayheadProps) {
- // Playhead scrubbing state
- const [isScrubbing, setIsScrubbing] = useState(false);
- const [scrubTime, setScrubTime] = useState<number | null>(null);
-
- // Ruler drag detection state
- const [isDraggingRuler, setIsDraggingRuler] = useState(false);
- const [hasDraggedRuler, setHasDraggedRuler] = useState(false);
-
- const playheadPosition =
- isScrubbing && scrubTime !== null ? scrubTime : currentTime;
-
- // --- Playhead Scrubbing Handlers ---
- const handlePlayheadMouseDown = useCallback(
- (e: React.MouseEvent) => {
- e.preventDefault();
- e.stopPropagation(); // Prevent ruler drag from triggering
- setIsScrubbing(true);
- handleScrub(e);
- },
- [duration, zoomLevel]
- );
-
- // Ruler mouse down handler
- const handleRulerMouseDown = useCallback(
- (e: React.MouseEvent) => {
- // Only handle left mouse button
- if (e.button !== 0) return;
-
- // Don't interfere if clicking on the playhead itself
- if (playheadRef?.current?.contains(e.target as Node)) return;
-
- e.preventDefault();
- setIsDraggingRuler(true);
- setHasDraggedRuler(false);
-
- // Start scrubbing immediately
- setIsScrubbing(true);
- handleScrub(e);
- },
- [duration, zoomLevel]
- );
-
- const handleScrub = useCallback(
- (e: MouseEvent | React.MouseEvent) => {
- const ruler = rulerRef.current;
- if (!ruler) return;
- const rect = ruler.getBoundingClientRect();
- const x = e.clientX - rect.left;
- const rawTime = Math.max(0, Math.min(duration, x / (50 * zoomLevel)));
- // Use frame snapping for playhead scrubbing
- const projectStore = useProjectStore.getState();
- const projectFps = projectStore.activeProject?.fps || 30;
- const time = snapTimeToFrame(rawTime, projectFps);
- setScrubTime(time);
- seek(time); // update video preview in real time
- },
- [duration, zoomLevel, seek, rulerRef]
- );
-
- // Mouse move/up event handlers
- useEffect(() => {
- if (!isScrubbing) return;
- const onMouseMove = (e: MouseEvent) => {
- handleScrub(e);
- // Mark that we've dragged if ruler drag is active
- if (isDraggingRuler) {
- setHasDraggedRuler(true);
- }
- };
- const onMouseUp = (e: MouseEvent) => {
- setIsScrubbing(false);
- if (scrubTime !== null) seek(scrubTime); // finalize seek
- setScrubTime(null);
-
- // Handle ruler click vs drag
- if (isDraggingRuler) {
- setIsDraggingRuler(false);
- // If we didn't drag, treat it as a click-to-seek
- if (!hasDraggedRuler) {
- handleScrub(e);
- }
- setHasDraggedRuler(false);
- }
- };
- window.addEventListener("mousemove", onMouseMove);
- window.addEventListener("mouseup", onMouseUp);
- return () => {
- window.removeEventListener("mousemove", onMouseMove);
- window.removeEventListener("mouseup", onMouseUp);
- };
- }, [
- isScrubbing,
- scrubTime,
- seek,
- handleScrub,
- isDraggingRuler,
- hasDraggedRuler,
- ]);
-
- // --- Playhead auto-scroll effect ---
- useEffect(() => {
- const rulerViewport = rulerScrollRef.current?.querySelector(
- "[data-radix-scroll-area-viewport]"
- ) as HTMLElement;
- const tracksViewport = tracksScrollRef.current?.querySelector(
- "[data-radix-scroll-area-viewport]"
- ) as HTMLElement;
- if (!rulerViewport || !tracksViewport) return;
- const playheadPx = playheadPosition * 50 * zoomLevel; // TIMELINE_CONSTANTS.PIXELS_PER_SECOND = 50
- const viewportWidth = rulerViewport.clientWidth;
- const scrollMin = 0;
- const scrollMax = rulerViewport.scrollWidth - viewportWidth;
- // Center the playhead if it's not visible (100px buffer)
- const desiredScroll = Math.max(
- scrollMin,
- Math.min(scrollMax, playheadPx - viewportWidth / 2)
- );
- if (
- playheadPx < rulerViewport.scrollLeft + 100 ||
- playheadPx > rulerViewport.scrollLeft + viewportWidth - 100
- ) {
- rulerViewport.scrollLeft = tracksViewport.scrollLeft = desiredScroll;
- }
- }, [playheadPosition, duration, zoomLevel, rulerScrollRef, tracksScrollRef]);
-
- return {
- playheadPosition,
- handlePlayheadMouseDown,
- handleRulerMouseDown,
- isDraggingRuler,
- };
-}
+import { snapTimeToFrame } from "@/constants/timeline-constants"; +import { useProjectStore } from "@/stores/project-store"; +import { useState, useEffect, useCallback } from "react"; + +interface UseTimelinePlayheadProps { + currentTime: number; + duration: number; + zoomLevel: number; + seek: (time: number) => void; + rulerRef: React.RefObject<HTMLDivElement>; + rulerScrollRef: React.RefObject<HTMLDivElement>; + tracksScrollRef: React.RefObject<HTMLDivElement>; + playheadRef?: React.RefObject<HTMLDivElement>; +} + +export function useTimelinePlayhead({ + currentTime, + duration, + zoomLevel, + seek, + rulerRef, + rulerScrollRef, + tracksScrollRef, + playheadRef, +}: UseTimelinePlayheadProps) { + // Playhead scrubbing state + const [isScrubbing, setIsScrubbing] = useState(false); + const [scrubTime, setScrubTime] = useState<number | null>(null); + + // Ruler drag detection state + const [isDraggingRuler, setIsDraggingRuler] = useState(false); + const [hasDraggedRuler, setHasDraggedRuler] = useState(false); + + const playheadPosition = + isScrubbing && scrubTime !== null ? scrubTime : currentTime; + + // --- Playhead Scrubbing Handlers --- + const handlePlayheadMouseDown = useCallback( + (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); // Prevent ruler drag from triggering + setIsScrubbing(true); + handleScrub(e); + }, + [duration, zoomLevel] + ); + + // Ruler mouse down handler + const handleRulerMouseDown = useCallback( + (e: React.MouseEvent) => { + // Only handle left mouse button + if (e.button !== 0) return; + + // Don't interfere if clicking on the playhead itself + if (playheadRef?.current?.contains(e.target as Node)) return; + + e.preventDefault(); + setIsDraggingRuler(true); + setHasDraggedRuler(false); + + // Start scrubbing immediately + setIsScrubbing(true); + handleScrub(e); + }, + [duration, zoomLevel] + ); + + const handleScrub = useCallback( + (e: MouseEvent | React.MouseEvent) => { + const ruler = rulerRef.current; + if (!ruler) return; + const rect = ruler.getBoundingClientRect(); + const x = e.clientX - rect.left; + const rawTime = Math.max(0, Math.min(duration, x / (50 * zoomLevel))); + // Use frame snapping for playhead scrubbing + const projectStore = useProjectStore.getState(); + const projectFps = projectStore.activeProject?.fps || 30; + const time = snapTimeToFrame(rawTime, projectFps); + setScrubTime(time); + seek(time); // update video preview in real time + }, + [duration, zoomLevel, seek, rulerRef] + ); + + // Mouse move/up event handlers + useEffect(() => { + if (!isScrubbing) return; + const onMouseMove = (e: MouseEvent) => { + handleScrub(e); + // Mark that we've dragged if ruler drag is active + if (isDraggingRuler) { + setHasDraggedRuler(true); + } + }; + const onMouseUp = (e: MouseEvent) => { + setIsScrubbing(false); + if (scrubTime !== null) seek(scrubTime); // finalize seek + setScrubTime(null); + + // Handle ruler click vs drag + if (isDraggingRuler) { + setIsDraggingRuler(false); + // If we didn't drag, treat it as a click-to-seek + if (!hasDraggedRuler) { + handleScrub(e); + } + setHasDraggedRuler(false); + } + }; + window.addEventListener("mousemove", onMouseMove); + window.addEventListener("mouseup", onMouseUp); + return () => { + window.removeEventListener("mousemove", onMouseMove); + window.removeEventListener("mouseup", onMouseUp); + }; + }, [ + isScrubbing, + scrubTime, + seek, + handleScrub, + isDraggingRuler, + hasDraggedRuler, + ]); + + // --- Playhead auto-scroll effect --- + useEffect(() => { + const rulerViewport = rulerScrollRef.current?.querySelector( + "[data-radix-scroll-area-viewport]" + ) as HTMLElement; + const tracksViewport = tracksScrollRef.current?.querySelector( + "[data-radix-scroll-area-viewport]" + ) as HTMLElement; + if (!rulerViewport || !tracksViewport) return; + const playheadPx = playheadPosition * 50 * zoomLevel; // TIMELINE_CONSTANTS.PIXELS_PER_SECOND = 50 + const viewportWidth = rulerViewport.clientWidth; + const scrollMin = 0; + const scrollMax = rulerViewport.scrollWidth - viewportWidth; + // Center the playhead if it's not visible (100px buffer) + const desiredScroll = Math.max( + scrollMin, + Math.min(scrollMax, playheadPx - viewportWidth / 2) + ); + if ( + playheadPx < rulerViewport.scrollLeft + 100 || + playheadPx > rulerViewport.scrollLeft + viewportWidth - 100 + ) { + rulerViewport.scrollLeft = tracksViewport.scrollLeft = desiredScroll; + } + }, [playheadPosition, duration, zoomLevel, rulerScrollRef, tracksScrollRef]); + + return { + playheadPosition, + handlePlayheadMouseDown, + handleRulerMouseDown, + isDraggingRuler, + }; +} diff --git a/apps/web/src/hooks/use-timeline-zoom.ts b/apps/web/src/hooks/use-timeline-zoom.ts index 4f5e0af0..e764c550 100644 --- a/apps/web/src/hooks/use-timeline-zoom.ts +++ b/apps/web/src/hooks/use-timeline-zoom.ts @@ -1,60 +1,60 @@ -import { useState, useCallback, useEffect, RefObject } from "react";
-
-interface UseTimelineZoomProps {
- containerRef: RefObject<HTMLDivElement>;
- isInTimeline?: boolean;
-}
-
-interface UseTimelineZoomReturn {
- zoomLevel: number;
- setZoomLevel: (zoomLevel: number | ((prev: number) => number)) => void;
- handleWheel: (e: React.WheelEvent) => void;
-}
-
-export function useTimelineZoom({
- containerRef,
- isInTimeline = false,
-}: UseTimelineZoomProps): UseTimelineZoomReturn {
- const [zoomLevel, setZoomLevel] = useState(1);
-
- const handleWheel = useCallback((e: React.WheelEvent) => {
- // Only zoom if user is using pinch gesture (ctrlKey or metaKey is true)
- if (e.ctrlKey || e.metaKey) {
- e.preventDefault();
- const delta = e.deltaY > 0 ? -0.15 : 0.15;
- setZoomLevel((prev) => Math.max(0.1, Math.min(10, prev + delta)));
- }
- // For horizontal scrolling (when shift is held or horizontal wheel movement),
- // let the event bubble up to allow ScrollArea to handle it
- else if (e.shiftKey || Math.abs(e.deltaX) > Math.abs(e.deltaY)) {
- // Don't prevent default - let ScrollArea handle horizontal scrolling
- return;
- }
- // Otherwise, allow normal scrolling
- }, []);
-
- // Prevent browser zooming in/out when in timeline
- useEffect(() => {
- const preventZoom = (e: WheelEvent) => {
- if (
- isInTimeline &&
- (e.ctrlKey || e.metaKey) &&
- containerRef.current?.contains(e.target as Node)
- ) {
- e.preventDefault();
- }
- };
-
- document.addEventListener("wheel", preventZoom, { passive: false });
-
- return () => {
- document.removeEventListener("wheel", preventZoom);
- };
- }, [isInTimeline, containerRef]);
-
- return {
- zoomLevel,
- setZoomLevel,
- handleWheel,
- };
-}
+import { useState, useCallback, useEffect, RefObject } from "react"; + +interface UseTimelineZoomProps { + containerRef: RefObject<HTMLDivElement>; + isInTimeline?: boolean; +} + +interface UseTimelineZoomReturn { + zoomLevel: number; + setZoomLevel: (zoomLevel: number | ((prev: number) => number)) => void; + handleWheel: (e: React.WheelEvent) => void; +} + +export function useTimelineZoom({ + containerRef, + isInTimeline = false, +}: UseTimelineZoomProps): UseTimelineZoomReturn { + const [zoomLevel, setZoomLevel] = useState(1); + + const handleWheel = useCallback((e: React.WheelEvent) => { + // Only zoom if user is using pinch gesture (ctrlKey or metaKey is true) + if (e.ctrlKey || e.metaKey) { + e.preventDefault(); + const delta = e.deltaY > 0 ? -0.15 : 0.15; + setZoomLevel((prev) => Math.max(0.1, Math.min(10, prev + delta))); + } + // For horizontal scrolling (when shift is held or horizontal wheel movement), + // let the event bubble up to allow ScrollArea to handle it + else if (e.shiftKey || Math.abs(e.deltaX) > Math.abs(e.deltaY)) { + // Don't prevent default - let ScrollArea handle horizontal scrolling + return; + } + // Otherwise, allow normal scrolling + }, []); + + // Prevent browser zooming in/out when in timeline + useEffect(() => { + const preventZoom = (e: WheelEvent) => { + if ( + isInTimeline && + (e.ctrlKey || e.metaKey) && + containerRef.current?.contains(e.target as Node) + ) { + e.preventDefault(); + } + }; + + document.addEventListener("wheel", preventZoom, { passive: false }); + + return () => { + document.removeEventListener("wheel", preventZoom); + }; + }, [isInTimeline, containerRef]); + + return { + zoomLevel, + setZoomLevel, + handleWheel, + }; +} diff --git a/apps/web/src/hooks/use-toast.ts b/apps/web/src/hooks/use-toast.ts index c682cd1f..dcc02dcd 100644 --- a/apps/web/src/hooks/use-toast.ts +++ b/apps/web/src/hooks/use-toast.ts @@ -6,7 +6,7 @@ import * as React from "react"; import type { ToastActionElement, ToastProps } from "../components/ui/toast"; const TOAST_LIMIT = 1; -const TOAST_REMOVE_DELAY = 1000000; +const TOAST_REMOVE_DELAY = 1_000_000; type ToasterToast = ToastProps & { id: string; @@ -64,7 +64,7 @@ const addToRemoveQueue = (toastId: string) => { toastTimeouts.delete(toastId); dispatch({ type: "REMOVE_TOAST", - toastId: toastId, + toastId, }); }, TOAST_REMOVE_DELAY); @@ -162,7 +162,7 @@ function toast({ ...props }: Toast) { }); return { - id: id, + id, dismiss, update, }; diff --git a/apps/web/src/lib/blog-query.ts b/apps/web/src/lib/blog-query.ts index 430f58bf..5cba0cf3 100644 --- a/apps/web/src/lib/blog-query.ts +++ b/apps/web/src/lib/blog-query.ts @@ -1,4 +1,10 @@ -import type { MarbleAuthorList, MarbleCategoryList, MarblePost, MarblePostList, MarbleTagList } from '@/types/post'; +import type { + MarbleAuthorList, + MarbleCategoryList, + MarblePost, + MarblePostList, + MarbleTagList, +} from "@/types/post"; import { unified } from "unified"; import rehypeParse from "rehype-parse"; import rehypeStringify from "rehype-stringify"; @@ -6,50 +12,53 @@ import rehypeSlug from "rehype-slug"; import rehypeAutolinkHeadings from "rehype-autolink-headings"; import rehypeSanitize from "rehype-sanitize"; -const url = process.env.NEXT_PUBLIC_MARBLE_API_URL ?? "https://api.marblecms.com"; +const url = + process.env.NEXT_PUBLIC_MARBLE_API_URL ?? "https://api.marblecms.com"; const key = process.env.MARBLE_WORKSPACE_KEY ?? "cmd4iw9mm0006l804kwqv0k46"; async function fetchFromMarble<T>(endpoint: string): Promise<T> { - try { - const response = await fetch(`${url}/${key}/${endpoint}`); - if (!response.ok) { - throw new Error(`Failed to fetch ${endpoint}: ${response.status} ${response.statusText}`); - } - return await response.json() as T; - } catch (error) { - console.error(`Error fetching ${endpoint}:`, error); - throw error; + try { + const response = await fetch(`${url}/${key}/${endpoint}`); + if (!response.ok) { + throw new Error( + `Failed to fetch ${endpoint}: ${response.status} ${response.statusText}` + ); } + return (await response.json()) as T; + } catch (error) { + console.error(`Error fetching ${endpoint}:`, error); + throw error; } - - export async function getPosts() { - return fetchFromMarble<MarblePostList>('posts'); - } - - export async function getTags() { - return fetchFromMarble<MarbleTagList>('tags'); - } - - export async function getSinglePost(slug: string) { - return fetchFromMarble<MarblePost>(`posts/${slug}`); - } - - export async function getCategories() { - return fetchFromMarble<MarbleCategoryList>('categories'); - } - - export async function getAuthors() { - return fetchFromMarble<MarbleAuthorList>('authors'); - } +} + +export async function getPosts() { + return fetchFromMarble<MarblePostList>("posts"); +} + +export async function getTags() { + return fetchFromMarble<MarbleTagList>("tags"); +} + +export async function getSinglePost(slug: string) { + return fetchFromMarble<MarblePost>(`posts/${slug}`); +} + +export async function getCategories() { + return fetchFromMarble<MarbleCategoryList>("categories"); +} + +export async function getAuthors() { + return fetchFromMarble<MarbleAuthorList>("authors"); +} export async function processHtmlContent(html: string): Promise<string> { - const processor = unified() - .use(rehypeSanitize) - .use(rehypeParse, { fragment: true }) - .use(rehypeSlug) - .use(rehypeAutolinkHeadings, { behavior: "append" }) - .use(rehypeStringify); + const processor = unified() + .use(rehypeSanitize) + .use(rehypeParse, { fragment: true }) + .use(rehypeSlug) + .use(rehypeAutolinkHeadings, { behavior: "append" }) + .use(rehypeStringify); - const file = await processor.process(html); - return String(file); + const file = await processor.process(html); + return String(file); } diff --git a/apps/web/src/lib/fetch-github-stars.ts b/apps/web/src/lib/fetch-github-stars.ts index c4444a62..0372f25b 100644 --- a/apps/web/src/lib/fetch-github-stars.ts +++ b/apps/web/src/lib/fetch-github-stars.ts @@ -19,8 +19,8 @@ export async function getStars(): Promise<string> { if (count >= 1_000_000) return (count / 1_000_000).toFixed(1).replace(/\.0$/, "") + "M"; - if (count >= 1_000) - return (count / 1_000).toFixed(1).replace(/\.0$/, "") + "k"; + if (count >= 1000) + return (count / 1000).toFixed(1).replace(/\.0$/, "") + "k"; return count.toString(); } catch (error) { console.error("Failed to fetch GitHub stars:", error); diff --git a/apps/web/src/lib/ffmpeg-utils.ts b/apps/web/src/lib/ffmpeg-utils.ts index ae0c267b..c34200f6 100644 --- a/apps/web/src/lib/ffmpeg-utils.ts +++ b/apps/web/src/lib/ffmpeg-utils.ts @@ -1,5 +1,5 @@ -import { FFmpeg } from '@ffmpeg/ffmpeg'; -import { toBlobURL } from '@ffmpeg/util'; +import { FFmpeg } from "@ffmpeg/ffmpeg"; +import { toBlobURL } from "@ffmpeg/util"; let ffmpeg: FFmpeg | null = null; @@ -7,13 +7,13 @@ export const initFFmpeg = async (): Promise<FFmpeg> => { if (ffmpeg) return ffmpeg; ffmpeg = new FFmpeg(); - + // Use locally hosted files instead of CDN - const baseURL = '/ffmpeg'; - + const baseURL = "/ffmpeg"; + await ffmpeg.load({ - coreURL: await toBlobURL(`${baseURL}/ffmpeg-core.js`, 'text/javascript'), - wasmURL: await toBlobURL(`${baseURL}/ffmpeg-core.wasm`, 'application/wasm'), + coreURL: await toBlobURL(`${baseURL}/ffmpeg-core.js`, "text/javascript"), + wasmURL: await toBlobURL(`${baseURL}/ffmpeg-core.wasm`, "application/wasm"), }); return ffmpeg; @@ -21,34 +21,42 @@ export const initFFmpeg = async (): Promise<FFmpeg> => { export const generateThumbnail = async ( videoFile: File, - timeInSeconds: number = 1 + timeInSeconds = 1 ): Promise<string> => { const ffmpeg = await initFFmpeg(); - - const inputName = 'input.mp4'; - const outputName = 'thumbnail.jpg'; - + + const inputName = "input.mp4"; + const outputName = "thumbnail.jpg"; + // Write input file - await ffmpeg.writeFile(inputName, new Uint8Array(await videoFile.arrayBuffer())); - + await ffmpeg.writeFile( + inputName, + new Uint8Array(await videoFile.arrayBuffer()) + ); + // Generate thumbnail at specific time await ffmpeg.exec([ - '-i', inputName, - '-ss', timeInSeconds.toString(), - '-vframes', '1', - '-vf', 'scale=320:240', - '-q:v', '2', - outputName + "-i", + inputName, + "-ss", + timeInSeconds.toString(), + "-vframes", + "1", + "-vf", + "scale=320:240", + "-q:v", + "2", + outputName, ]); - + // Read output file const data = await ffmpeg.readFile(outputName); - const blob = new Blob([data], { type: 'image/jpeg' }); - + const blob = new Blob([data], { type: "image/jpeg" }); + // Cleanup await ffmpeg.deleteFile(inputName); await ffmpeg.deleteFile(outputName); - + return URL.createObjectURL(blob); }; @@ -59,43 +67,52 @@ export const trimVideo = async ( onProgress?: (progress: number) => void ): Promise<Blob> => { const ffmpeg = await initFFmpeg(); - - const inputName = 'input.mp4'; - const outputName = 'output.mp4'; - + + const inputName = "input.mp4"; + const outputName = "output.mp4"; + // Set up progress callback if (onProgress) { - ffmpeg.on('progress', ({ progress }) => { + ffmpeg.on("progress", ({ progress }) => { onProgress(progress * 100); }); } - + // Write input file - await ffmpeg.writeFile(inputName, new Uint8Array(await videoFile.arrayBuffer())); - + await ffmpeg.writeFile( + inputName, + new Uint8Array(await videoFile.arrayBuffer()) + ); + const duration = endTime - startTime; - + // Trim video await ffmpeg.exec([ - '-i', inputName, - '-ss', startTime.toString(), - '-t', duration.toString(), - '-c', 'copy', // Use stream copy for faster processing - outputName + "-i", + inputName, + "-ss", + startTime.toString(), + "-t", + duration.toString(), + "-c", + "copy", // Use stream copy for faster processing + outputName, ]); - + // Read output file const data = await ffmpeg.readFile(outputName); - const blob = new Blob([data], { type: 'video/mp4' }); - + const blob = new Blob([data], { type: "video/mp4" }); + // Cleanup await ffmpeg.deleteFile(inputName); await ffmpeg.deleteFile(outputName); - + return blob; }; -export const getVideoInfo = async (videoFile: File): Promise<{ +export const getVideoInfo = async ( + videoFile: File +): Promise<{ duration: number; width: number; height: number; @@ -103,27 +120,32 @@ export const getVideoInfo = async (videoFile: File): Promise<{ }> => { const ffmpeg = await initFFmpeg(); - const inputName = 'input.mp4'; + const inputName = "input.mp4"; // Write input file - await ffmpeg.writeFile(inputName, new Uint8Array(await videoFile.arrayBuffer())); + await ffmpeg.writeFile( + inputName, + new Uint8Array(await videoFile.arrayBuffer()) + ); // Capture FFmpeg stderr output with a one-time listener pattern - let ffmpegOutput = ''; + let ffmpegOutput = ""; let listening = true; const listener = (data: string) => { if (listening) ffmpegOutput += data; }; - ffmpeg.on('log', ({ message }) => listener(message)); + ffmpeg.on("log", ({ message }) => listener(message)); // Run ffmpeg to get info (stderr will contain the info) try { - await ffmpeg.exec(['-i', inputName, '-f', 'null', '-']); + await ffmpeg.exec(["-i", inputName, "-f", "null", "-"]); } catch (error) { listening = false; await ffmpeg.deleteFile(inputName); - console.error('FFmpeg execution failed:', error); - throw new Error('Failed to extract video info. The file may be corrupted or in an unsupported format.'); + console.error("FFmpeg execution failed:", error); + throw new Error( + "Failed to extract video info. The file may be corrupted or in an unsupported format." + ); } // Disable listener after exec completes @@ -143,8 +165,12 @@ export const getVideoInfo = async (videoFile: File): Promise<{ duration = parseInt(h) * 3600 + parseInt(m) * 60 + parseFloat(s); } - const videoStreamMatch = ffmpegOutput.match(/Video:.* (\d+)x(\d+)[^,]*, ([\d.]+) fps/); - let width = 0, height = 0, fps = 0; + const videoStreamMatch = ffmpegOutput.match( + /Video:.* (\d+)x(\d+)[^,]*, ([\d.]+) fps/ + ); + let width = 0, + height = 0, + fps = 0; if (videoStreamMatch) { width = parseInt(videoStreamMatch[1]); height = parseInt(videoStreamMatch[2]); @@ -155,7 +181,7 @@ export const getVideoInfo = async (videoFile: File): Promise<{ duration, width, height, - fps + fps, }; }; @@ -164,68 +190,81 @@ export const convertToWebM = async ( onProgress?: (progress: number) => void ): Promise<Blob> => { const ffmpeg = await initFFmpeg(); - - const inputName = 'input.mp4'; - const outputName = 'output.webm'; - + + const inputName = "input.mp4"; + const outputName = "output.webm"; + // Set up progress callback if (onProgress) { - ffmpeg.on('progress', ({ progress }) => { + ffmpeg.on("progress", ({ progress }) => { onProgress(progress * 100); }); } - + // Write input file - await ffmpeg.writeFile(inputName, new Uint8Array(await videoFile.arrayBuffer())); - + await ffmpeg.writeFile( + inputName, + new Uint8Array(await videoFile.arrayBuffer()) + ); + // Convert to WebM await ffmpeg.exec([ - '-i', inputName, - '-c:v', 'libvpx-vp9', - '-crf', '30', - '-b:v', '0', - '-c:a', 'libopus', - outputName + "-i", + inputName, + "-c:v", + "libvpx-vp9", + "-crf", + "30", + "-b:v", + "0", + "-c:a", + "libopus", + outputName, ]); - + // Read output file const data = await ffmpeg.readFile(outputName); - const blob = new Blob([data], { type: 'video/webm' }); - + const blob = new Blob([data], { type: "video/webm" }); + // Cleanup await ffmpeg.deleteFile(inputName); await ffmpeg.deleteFile(outputName); - + return blob; }; export const extractAudio = async ( videoFile: File, - format: 'mp3' | 'wav' = 'mp3' + format: "mp3" | "wav" = "mp3" ): Promise<Blob> => { const ffmpeg = await initFFmpeg(); - - const inputName = 'input.mp4'; + + const inputName = "input.mp4"; const outputName = `output.${format}`; - + // Write input file - await ffmpeg.writeFile(inputName, new Uint8Array(await videoFile.arrayBuffer())); - + await ffmpeg.writeFile( + inputName, + new Uint8Array(await videoFile.arrayBuffer()) + ); + // Extract audio await ffmpeg.exec([ - '-i', inputName, - '-vn', // Disable video - '-acodec', format === 'mp3' ? 'libmp3lame' : 'pcm_s16le', - outputName + "-i", + inputName, + "-vn", // Disable video + "-acodec", + format === "mp3" ? "libmp3lame" : "pcm_s16le", + outputName, ]); - + // Read output file const data = await ffmpeg.readFile(outputName); const blob = new Blob([data], { type: `audio/${format}` }); - + // Cleanup await ffmpeg.deleteFile(inputName); await ffmpeg.deleteFile(outputName); - + return blob; -};
\ No newline at end of file +}; diff --git a/apps/web/src/lib/font-config.ts b/apps/web/src/lib/font-config.ts index 0389054a..b47b3c3e 100644 --- a/apps/web/src/lib/font-config.ts +++ b/apps/web/src/lib/font-config.ts @@ -1,39 +1,39 @@ -import {
- Inter,
- Roboto,
- Open_Sans,
- Playfair_Display,
- Comic_Neue,
-} from "next/font/google";
-
-// Configure all fonts
-const inter = Inter({ subsets: ["latin"] });
-const roboto = Roboto({ subsets: ["latin"], weight: ["400", "700"] });
-const openSans = Open_Sans({ subsets: ["latin"] });
-const playfairDisplay = Playfair_Display({ subsets: ["latin"] });
-const comicNeue = Comic_Neue({ subsets: ["latin"], weight: ["400", "700"] });
-
-// Export font class mapping for use in components
-export const FONT_CLASS_MAP = {
- Inter: inter.className,
- Roboto: roboto.className,
- "Open Sans": openSans.className,
- "Playfair Display": playfairDisplay.className,
- "Comic Neue": comicNeue.className,
- Arial: "",
- Helvetica: "",
- "Times New Roman": "",
- Georgia: "",
-} as const;
-
-// Export individual fonts for use in layout
-export const fonts = {
- inter,
- roboto,
- openSans,
- playfairDisplay,
- comicNeue,
-};
-
-// Default font for the body
-export const defaultFont = inter;
+import { + Inter, + Roboto, + Open_Sans, + Playfair_Display, + Comic_Neue, +} from "next/font/google"; + +// Configure all fonts +const inter = Inter({ subsets: ["latin"] }); +const roboto = Roboto({ subsets: ["latin"], weight: ["400", "700"] }); +const openSans = Open_Sans({ subsets: ["latin"] }); +const playfairDisplay = Playfair_Display({ subsets: ["latin"] }); +const comicNeue = Comic_Neue({ subsets: ["latin"], weight: ["400", "700"] }); + +// Export font class mapping for use in components +export const FONT_CLASS_MAP = { + Inter: inter.className, + Roboto: roboto.className, + "Open Sans": openSans.className, + "Playfair Display": playfairDisplay.className, + "Comic Neue": comicNeue.className, + Arial: "", + Helvetica: "", + "Times New Roman": "", + Georgia: "", +} as const; + +// Export individual fonts for use in layout +export const fonts = { + inter, + roboto, + openSans, + playfairDisplay, + comicNeue, +}; + +// Default font for the body +export const defaultFont = inter; diff --git a/apps/web/src/lib/rate-limit.ts b/apps/web/src/lib/rate-limit.ts index ac63a64c..e1996cf5 100644 --- a/apps/web/src/lib/rate-limit.ts +++ b/apps/web/src/lib/rate-limit.ts @@ -1,16 +1,16 @@ -// lib/rate-limit.ts
-import { Ratelimit } from "@upstash/ratelimit";
-import { Redis } from "@upstash/redis";
-import { env } from "@/env";
-
-const redis = new Redis({
- url: env.UPSTASH_REDIS_REST_URL,
- token: env.UPSTASH_REDIS_REST_TOKEN,
-});
-
-export const waitlistRateLimit = new Ratelimit({
- redis,
- limiter: Ratelimit.slidingWindow(5, "1 m"), // 5 requests per minute
- analytics: true,
- prefix: "waitlist-rate-limit",
-});
+// lib/rate-limit.ts +import { Ratelimit } from "@upstash/ratelimit"; +import { Redis } from "@upstash/redis"; +import { env } from "@/env"; + +const redis = new Redis({ + url: env.UPSTASH_REDIS_REST_URL, + token: env.UPSTASH_REDIS_REST_TOKEN, +}); + +export const waitlistRateLimit = new Ratelimit({ + redis, + limiter: Ratelimit.slidingWindow(5, "1 m"), // 5 requests per minute + analytics: true, + prefix: "waitlist-rate-limit", +}); diff --git a/apps/web/src/lib/storage/indexeddb-adapter.ts b/apps/web/src/lib/storage/indexeddb-adapter.ts index f43a8798..597305c7 100644 --- a/apps/web/src/lib/storage/indexeddb-adapter.ts +++ b/apps/web/src/lib/storage/indexeddb-adapter.ts @@ -1,89 +1,89 @@ -import { StorageAdapter } from "./types";
-
-export class IndexedDBAdapter<T> implements StorageAdapter<T> {
- private dbName: string;
- private storeName: string;
- private version: number;
-
- constructor(dbName: string, storeName: string, version: number = 1) {
- this.dbName = dbName;
- this.storeName = storeName;
- this.version = version;
- }
-
- private async getDB(): Promise<IDBDatabase> {
- return new Promise((resolve, reject) => {
- const request = indexedDB.open(this.dbName, this.version);
-
- request.onerror = () => reject(request.error);
- request.onsuccess = () => resolve(request.result);
-
- request.onupgradeneeded = (event) => {
- const db = (event.target as IDBOpenDBRequest).result;
- if (!db.objectStoreNames.contains(this.storeName)) {
- db.createObjectStore(this.storeName, { keyPath: "id" });
- }
- };
- });
- }
-
- async get(key: string): Promise<T | null> {
- const db = await this.getDB();
- const transaction = db.transaction([this.storeName], "readonly");
- const store = transaction.objectStore(this.storeName);
-
- return new Promise((resolve, reject) => {
- const request = store.get(key);
- request.onerror = () => reject(request.error);
- request.onsuccess = () => resolve(request.result || null);
- });
- }
-
- async set(key: string, value: T): Promise<void> {
- const db = await this.getDB();
- const transaction = db.transaction([this.storeName], "readwrite");
- const store = transaction.objectStore(this.storeName);
-
- return new Promise((resolve, reject) => {
- const request = store.put({ id: key, ...value });
- request.onerror = () => reject(request.error);
- request.onsuccess = () => resolve();
- });
- }
-
- async remove(key: string): Promise<void> {
- const db = await this.getDB();
- const transaction = db.transaction([this.storeName], "readwrite");
- const store = transaction.objectStore(this.storeName);
-
- return new Promise((resolve, reject) => {
- const request = store.delete(key);
- request.onerror = () => reject(request.error);
- request.onsuccess = () => resolve();
- });
- }
-
- async list(): Promise<string[]> {
- const db = await this.getDB();
- const transaction = db.transaction([this.storeName], "readonly");
- const store = transaction.objectStore(this.storeName);
-
- return new Promise((resolve, reject) => {
- const request = store.getAllKeys();
- request.onerror = () => reject(request.error);
- request.onsuccess = () => resolve(request.result as string[]);
- });
- }
-
- async clear(): Promise<void> {
- const db = await this.getDB();
- const transaction = db.transaction([this.storeName], "readwrite");
- const store = transaction.objectStore(this.storeName);
-
- return new Promise((resolve, reject) => {
- const request = store.clear();
- request.onerror = () => reject(request.error);
- request.onsuccess = () => resolve();
- });
- }
-}
+import { StorageAdapter } from "./types"; + +export class IndexedDBAdapter<T> implements StorageAdapter<T> { + private dbName: string; + private storeName: string; + private version: number; + + constructor(dbName: string, storeName: string, version = 1) { + this.dbName = dbName; + this.storeName = storeName; + this.version = version; + } + + private async getDB(): Promise<IDBDatabase> { + return new Promise((resolve, reject) => { + const request = indexedDB.open(this.dbName, this.version); + + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(request.result); + + request.onupgradeneeded = (event) => { + const db = (event.target as IDBOpenDBRequest).result; + if (!db.objectStoreNames.contains(this.storeName)) { + db.createObjectStore(this.storeName, { keyPath: "id" }); + } + }; + }); + } + + async get(key: string): Promise<T | null> { + const db = await this.getDB(); + const transaction = db.transaction([this.storeName], "readonly"); + const store = transaction.objectStore(this.storeName); + + return new Promise((resolve, reject) => { + const request = store.get(key); + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(request.result || null); + }); + } + + async set(key: string, value: T): Promise<void> { + const db = await this.getDB(); + const transaction = db.transaction([this.storeName], "readwrite"); + const store = transaction.objectStore(this.storeName); + + return new Promise((resolve, reject) => { + const request = store.put({ id: key, ...value }); + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(); + }); + } + + async remove(key: string): Promise<void> { + const db = await this.getDB(); + const transaction = db.transaction([this.storeName], "readwrite"); + const store = transaction.objectStore(this.storeName); + + return new Promise((resolve, reject) => { + const request = store.delete(key); + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(); + }); + } + + async list(): Promise<string[]> { + const db = await this.getDB(); + const transaction = db.transaction([this.storeName], "readonly"); + const store = transaction.objectStore(this.storeName); + + return new Promise((resolve, reject) => { + const request = store.getAllKeys(); + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(request.result as string[]); + }); + } + + async clear(): Promise<void> { + const db = await this.getDB(); + const transaction = db.transaction([this.storeName], "readwrite"); + const store = transaction.objectStore(this.storeName); + + return new Promise((resolve, reject) => { + const request = store.clear(); + request.onerror = () => reject(request.error); + request.onsuccess = () => resolve(); + }); + } +} diff --git a/apps/web/src/lib/storage/opfs-adapter.ts b/apps/web/src/lib/storage/opfs-adapter.ts index c01954e5..87b5c886 100644 --- a/apps/web/src/lib/storage/opfs-adapter.ts +++ b/apps/web/src/lib/storage/opfs-adapter.ts @@ -3,7 +3,7 @@ import { StorageAdapter } from "./types"; export class OPFSAdapter implements StorageAdapter<File> { private directoryName: string; - constructor(directoryName: string = "media") { + constructor(directoryName = "media") { this.directoryName = directoryName; } diff --git a/apps/web/src/lib/time.ts b/apps/web/src/lib/time.ts index b3147946..df02d837 100644 --- a/apps/web/src/lib/time.ts +++ b/apps/web/src/lib/time.ts @@ -1,25 +1,25 @@ -// Time-related utility functions
-
-// Helper function to format time in various formats (MM:SS, HH:MM:SS, HH:MM:SS:CS, HH:MM:SS:FF)
-export const formatTimeCode = (
- timeInSeconds: number,
- format: "MM:SS" | "HH:MM:SS" | "HH:MM:SS:CS" | "HH:MM:SS:FF" = "HH:MM:SS:CS",
- fps: number = 30
-): string => {
- const hours = Math.floor(timeInSeconds / 3600);
- const minutes = Math.floor((timeInSeconds % 3600) / 60);
- const seconds = Math.floor(timeInSeconds % 60);
- const centiseconds = Math.floor((timeInSeconds % 1) * 100);
- const frames = Math.floor((timeInSeconds % 1) * fps);
-
- switch (format) {
- case "MM:SS":
- return `${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`;
- case "HH:MM:SS":
- return `${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`;
- case "HH:MM:SS:CS":
- return `${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}:${centiseconds.toString().padStart(2, "0")}`;
- case "HH:MM:SS:FF":
- return `${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}:${frames.toString().padStart(2, "0")}`;
- }
-};
+// Time-related utility functions + +// Helper function to format time in various formats (MM:SS, HH:MM:SS, HH:MM:SS:CS, HH:MM:SS:FF) +export const formatTimeCode = ( + timeInSeconds: number, + format: "MM:SS" | "HH:MM:SS" | "HH:MM:SS:CS" | "HH:MM:SS:FF" = "HH:MM:SS:CS", + fps = 30 +): string => { + const hours = Math.floor(timeInSeconds / 3600); + const minutes = Math.floor((timeInSeconds % 3600) / 60); + const seconds = Math.floor(timeInSeconds % 60); + const centiseconds = Math.floor((timeInSeconds % 1) * 100); + const frames = Math.floor((timeInSeconds % 1) * fps); + + switch (format) { + case "MM:SS": + return `${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`; + case "HH:MM:SS": + return `${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`; + case "HH:MM:SS:CS": + return `${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}:${centiseconds.toString().padStart(2, "0")}`; + case "HH:MM:SS:FF": + return `${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}:${frames.toString().padStart(2, "0")}`; + } +}; diff --git a/apps/web/src/lib/timeline.ts b/apps/web/src/lib/timeline.ts index 531defac..85fcabe6 100644 --- a/apps/web/src/lib/timeline.ts +++ b/apps/web/src/lib/timeline.ts @@ -1,54 +1,54 @@ -import { TimelineElement } from "@/types/timeline";
-
-// Helper function to check for element overlaps and prevent invalid timeline states
-export const checkElementOverlaps = (elements: TimelineElement[]): boolean => {
- // Sort elements by start time
- const sortedElements = [...elements].sort(
- (a, b) => a.startTime - b.startTime
- );
-
- for (let i = 0; i < sortedElements.length - 1; i++) {
- const current = sortedElements[i];
- const next = sortedElements[i + 1];
-
- const currentEnd =
- current.startTime +
- (current.duration - current.trimStart - current.trimEnd);
-
- // Check if current element overlaps with next element
- if (currentEnd > next.startTime) return true; // Overlap detected
- }
-
- return false; // No overlaps
-};
-
-// Helper function to resolve overlaps by adjusting element positions
-export const resolveElementOverlaps = (
- elements: TimelineElement[]
-): TimelineElement[] => {
- // Sort elements by start time
- const sortedElements = [...elements].sort(
- (a, b) => a.startTime - b.startTime
- );
- const resolvedElements: TimelineElement[] = [];
-
- for (let i = 0; i < sortedElements.length; i++) {
- const current = { ...sortedElements[i] };
-
- if (resolvedElements.length > 0) {
- const previous = resolvedElements[resolvedElements.length - 1];
- const previousEnd =
- previous.startTime +
- (previous.duration - previous.trimStart - previous.trimEnd);
-
- // If current element would overlap with previous, push it after previous ends
- if (current.startTime < previousEnd) {
- current.startTime = previousEnd;
- }
- }
-
- resolvedElements.push(current);
- }
-
- return resolvedElements;
-};
+import { TimelineElement } from "@/types/timeline"; + +// Helper function to check for element overlaps and prevent invalid timeline states +export const checkElementOverlaps = (elements: TimelineElement[]): boolean => { + // Sort elements by start time + const sortedElements = [...elements].sort( + (a, b) => a.startTime - b.startTime + ); + + for (let i = 0; i < sortedElements.length - 1; i++) { + const current = sortedElements[i]; + const next = sortedElements[i + 1]; + + const currentEnd = + current.startTime + + (current.duration - current.trimStart - current.trimEnd); + + // Check if current element overlaps with next element + if (currentEnd > next.startTime) return true; // Overlap detected + } + + return false; // No overlaps +}; + +// Helper function to resolve overlaps by adjusting element positions +export const resolveElementOverlaps = ( + elements: TimelineElement[] +): TimelineElement[] => { + // Sort elements by start time + const sortedElements = [...elements].sort( + (a, b) => a.startTime - b.startTime + ); + const resolvedElements: TimelineElement[] = []; + + for (let i = 0; i < sortedElements.length; i++) { + const current = { ...sortedElements[i] }; + + if (resolvedElements.length > 0) { + const previous = resolvedElements[resolvedElements.length - 1]; + const previousEnd = + previous.startTime + + (previous.duration - previous.trimStart - previous.trimEnd); + + // If current element would overlap with previous, push it after previous ends + if (current.startTime < previousEnd) { + current.startTime = previousEnd; + } + } + + resolvedElements.push(current); + } + + return resolvedElements; +}; diff --git a/apps/web/src/lib/waitlist.ts b/apps/web/src/lib/waitlist.ts index 22b15b78..43a620b0 100644 --- a/apps/web/src/lib/waitlist.ts +++ b/apps/web/src/lib/waitlist.ts @@ -1,13 +1,13 @@ -import { db, sql, waitlist } from "@opencut/db";
-
-export async function getWaitlistCount() {
- try {
- const result = await db
- .select({ count: sql<number>`count(*)` })
- .from(waitlist);
- return result[0]?.count || 0;
- } catch (error) {
- console.error("Failed to fetch waitlist count:", error);
- return 0;
- }
-}
+import { db, sql, waitlist } from "@opencut/db"; + +export async function getWaitlistCount() { + try { + const result = await db + .select({ count: sql<number>`count(*)` }) + .from(waitlist); + return result[0]?.count || 0; + } catch (error) { + console.error("Failed to fetch waitlist count:", error); + return 0; + } +} diff --git a/apps/web/src/middleware.ts b/apps/web/src/middleware.ts index e2562ef1..b5fc2b4b 100644 --- a/apps/web/src/middleware.ts +++ b/apps/web/src/middleware.ts @@ -1,24 +1,24 @@ -import { NextResponse } from "next/server";
-import type { NextRequest } from "next/server";
-
-export async function middleware(request: NextRequest) {
- // Handle fuckcapcut.com domain redirect
- if (request.headers.get("host") === "fuckcapcut.com") {
- return NextResponse.redirect("https://opencut.app/why-not-capcut", 301);
- }
-
- return NextResponse.next();
-}
-
-export const config = {
- matcher: [
- /*
- * Match all request paths except for the ones starting with:
- * - api (API routes)
- * - _next/static (static files)
- * - _next/image (image optimization files)
- * - favicon.ico (favicon file)
- */
- "/((?!api|_next/static|_next/image|favicon.ico).*)",
- ],
-};
+import { NextResponse } from "next/server"; +import type { NextRequest } from "next/server"; + +export async function middleware(request: NextRequest) { + // Handle fuckcapcut.com domain redirect + if (request.headers.get("host") === "fuckcapcut.com") { + return NextResponse.redirect("https://opencut.app/why-not-capcut", 301); + } + + return NextResponse.next(); +} + +export const config = { + matcher: [ + /* + * Match all request paths except for the ones starting with: + * - api (API routes) + * - _next/static (static files) + * - _next/image (image optimization files) + * - favicon.ico (favicon file) + */ + "/((?!api|_next/static|_next/image|favicon.ico).*)", + ], +}; diff --git a/apps/web/src/stores/editor-store.ts b/apps/web/src/stores/editor-store.ts index c24929a2..aac7077e 100644 --- a/apps/web/src/stores/editor-store.ts +++ b/apps/web/src/stores/editor-store.ts @@ -1,105 +1,104 @@ -import { create } from "zustand";
-import { CanvasSize, CanvasPreset } from "@/types/editor";
-
-type CanvasMode = "preset" | "original" | "custom";
-
-interface EditorState {
- // Loading states
- isInitializing: boolean;
- isPanelsReady: boolean;
-
- // Canvas/Project settings
- canvasSize: CanvasSize;
- canvasMode: CanvasMode;
- canvasPresets: CanvasPreset[];
-
- // Actions
- setInitializing: (loading: boolean) => void;
- setPanelsReady: (ready: boolean) => void;
- initializeApp: () => Promise<void>;
- setCanvasSize: (size: CanvasSize) => void;
- setCanvasSizeToOriginal: (aspectRatio: number) => void;
- setCanvasSizeFromAspectRatio: (aspectRatio: number) => void;
-}
-
-const DEFAULT_CANVAS_PRESETS: CanvasPreset[] = [
- { name: "16:9", width: 1920, height: 1080 },
- { name: "9:16", width: 1080, height: 1920 },
- { name: "1:1", width: 1080, height: 1080 },
- { name: "4:3", width: 1440, height: 1080 },
-];
-
-// Helper function to find the best matching canvas preset for an aspect ratio
-const findBestCanvasPreset = (aspectRatio: number): CanvasSize => {
- // Calculate aspect ratio for each preset and find the closest match
- let bestMatch = DEFAULT_CANVAS_PRESETS[0]; // Default to 16:9 HD
- let smallestDifference = Math.abs(
- aspectRatio - bestMatch.width / bestMatch.height
- );
-
- for (const preset of DEFAULT_CANVAS_PRESETS) {
- const presetAspectRatio = preset.width / preset.height;
- const difference = Math.abs(aspectRatio - presetAspectRatio);
-
- if (difference < smallestDifference) {
- smallestDifference = difference;
- bestMatch = preset;
- }
- }
-
- // If the difference is still significant (> 0.1), create a custom size
- // based on the media aspect ratio with a reasonable resolution
- const bestAspectRatio = bestMatch.width / bestMatch.height;
- if (Math.abs(aspectRatio - bestAspectRatio) > 0.1) {
- // Create custom dimensions based on the aspect ratio
- if (aspectRatio > 1) {
- // Landscape - use 1920 width
- return { width: 1920, height: Math.round(1920 / aspectRatio) };
- } else {
- // Portrait or square - use 1080 height
- return { width: Math.round(1080 * aspectRatio), height: 1080 };
- }
- }
-
- return { width: bestMatch.width, height: bestMatch.height };
-};
-
-export const useEditorStore = create<EditorState>((set, get) => ({
- // Initial states
- isInitializing: true,
- isPanelsReady: false,
- canvasSize: { width: 1920, height: 1080 }, // Default 16:9 HD
- canvasMode: "preset" as CanvasMode,
- canvasPresets: DEFAULT_CANVAS_PRESETS,
-
- // Actions
- setInitializing: (loading) => {
- set({ isInitializing: loading });
- },
-
- setPanelsReady: (ready) => {
- set({ isPanelsReady: ready });
- },
-
- initializeApp: async () => {
- console.log("Initializing video editor...");
- set({ isInitializing: true, isPanelsReady: false });
-
- set({ isPanelsReady: true, isInitializing: false });
- console.log("Video editor ready");
- },
-
- setCanvasSize: (size) => {
- set({ canvasSize: size, canvasMode: "preset" });
- },
-
- setCanvasSizeToOriginal: (aspectRatio) => {
- const newCanvasSize = findBestCanvasPreset(aspectRatio);
- set({ canvasSize: newCanvasSize, canvasMode: "original" });
- },
-
- setCanvasSizeFromAspectRatio: (aspectRatio) => {
- const newCanvasSize = findBestCanvasPreset(aspectRatio);
- set({ canvasSize: newCanvasSize, canvasMode: "custom" });
- },
-}));
+import { create } from "zustand"; +import { CanvasSize, CanvasPreset } from "@/types/editor"; + +type CanvasMode = "preset" | "original" | "custom"; + +interface EditorState { + // Loading states + isInitializing: boolean; + isPanelsReady: boolean; + + // Canvas/Project settings + canvasSize: CanvasSize; + canvasMode: CanvasMode; + canvasPresets: CanvasPreset[]; + + // Actions + setInitializing: (loading: boolean) => void; + setPanelsReady: (ready: boolean) => void; + initializeApp: () => Promise<void>; + setCanvasSize: (size: CanvasSize) => void; + setCanvasSizeToOriginal: (aspectRatio: number) => void; + setCanvasSizeFromAspectRatio: (aspectRatio: number) => void; +} + +const DEFAULT_CANVAS_PRESETS: CanvasPreset[] = [ + { name: "16:9", width: 1920, height: 1080 }, + { name: "9:16", width: 1080, height: 1920 }, + { name: "1:1", width: 1080, height: 1080 }, + { name: "4:3", width: 1440, height: 1080 }, +]; + +// Helper function to find the best matching canvas preset for an aspect ratio +const findBestCanvasPreset = (aspectRatio: number): CanvasSize => { + // Calculate aspect ratio for each preset and find the closest match + let bestMatch = DEFAULT_CANVAS_PRESETS[0]; // Default to 16:9 HD + let smallestDifference = Math.abs( + aspectRatio - bestMatch.width / bestMatch.height + ); + + for (const preset of DEFAULT_CANVAS_PRESETS) { + const presetAspectRatio = preset.width / preset.height; + const difference = Math.abs(aspectRatio - presetAspectRatio); + + if (difference < smallestDifference) { + smallestDifference = difference; + bestMatch = preset; + } + } + + // If the difference is still significant (> 0.1), create a custom size + // based on the media aspect ratio with a reasonable resolution + const bestAspectRatio = bestMatch.width / bestMatch.height; + if (Math.abs(aspectRatio - bestAspectRatio) > 0.1) { + // Create custom dimensions based on the aspect ratio + if (aspectRatio > 1) { + // Landscape - use 1920 width + return { width: 1920, height: Math.round(1920 / aspectRatio) }; + } + // Portrait or square - use 1080 height + return { width: Math.round(1080 * aspectRatio), height: 1080 }; + } + + return { width: bestMatch.width, height: bestMatch.height }; +}; + +export const useEditorStore = create<EditorState>((set, get) => ({ + // Initial states + isInitializing: true, + isPanelsReady: false, + canvasSize: { width: 1920, height: 1080 }, // Default 16:9 HD + canvasMode: "preset" as CanvasMode, + canvasPresets: DEFAULT_CANVAS_PRESETS, + + // Actions + setInitializing: (loading) => { + set({ isInitializing: loading }); + }, + + setPanelsReady: (ready) => { + set({ isPanelsReady: ready }); + }, + + initializeApp: async () => { + console.log("Initializing video editor..."); + set({ isInitializing: true, isPanelsReady: false }); + + set({ isPanelsReady: true, isInitializing: false }); + console.log("Video editor ready"); + }, + + setCanvasSize: (size) => { + set({ canvasSize: size, canvasMode: "preset" }); + }, + + setCanvasSizeToOriginal: (aspectRatio) => { + const newCanvasSize = findBestCanvasPreset(aspectRatio); + set({ canvasSize: newCanvasSize, canvasMode: "original" }); + }, + + setCanvasSizeFromAspectRatio: (aspectRatio) => { + const newCanvasSize = findBestCanvasPreset(aspectRatio); + set({ canvasSize: newCanvasSize, canvasMode: "custom" }); + }, +})); diff --git a/apps/web/src/stores/media-store.ts b/apps/web/src/stores/media-store.ts index c4ee5f3e..029307d9 100644 --- a/apps/web/src/stores/media-store.ts +++ b/apps/web/src/stores/media-store.ts @@ -219,15 +219,19 @@ export const useMediaStore = create<MediaStore>((set, get) => ({ mediaItems.map(async (item) => { if (item.type === "video" && item.file) { try { - const { thumbnailUrl, width, height } = await generateVideoThumbnail(item.file); + const { thumbnailUrl, width, height } = + await generateVideoThumbnail(item.file); return { ...item, thumbnailUrl, width: width || item.width, - height: height || item.height + height: height || item.height, }; } catch (error) { - console.error(`Failed to regenerate thumbnail for video ${item.id}:`, error); + console.error( + `Failed to regenerate thumbnail for video ${item.id}:`, + error + ); return item; } } diff --git a/apps/web/src/stores/panel-store.ts b/apps/web/src/stores/panel-store.ts index 450b6a6e..b97235fa 100644 --- a/apps/web/src/stores/panel-store.ts +++ b/apps/web/src/stores/panel-store.ts @@ -1,45 +1,45 @@ -import { create } from "zustand";
-import { persist } from "zustand/middleware";
-
-const DEFAULT_PANEL_SIZES = {
- toolsPanel: 45,
- previewPanel: 75,
- propertiesPanel: 20,
- mainContent: 70,
- timeline: 30,
-} as const;
-
-interface PanelState {
- // Panel sizes as percentages
- toolsPanel: number;
- previewPanel: number;
- propertiesPanel: number;
- mainContent: number;
- timeline: number;
-
- // Actions
- setToolsPanel: (size: number) => void;
- setPreviewPanel: (size: number) => void;
- setPropertiesPanel: (size: number) => void;
- setMainContent: (size: number) => void;
- setTimeline: (size: number) => void;
-}
-
-export const usePanelStore = create<PanelState>()(
- persist(
- (set) => ({
- // Default sizes - optimized for responsiveness
- ...DEFAULT_PANEL_SIZES,
-
- // Actions
- setToolsPanel: (size) => set({ toolsPanel: size }),
- setPreviewPanel: (size) => set({ previewPanel: size }),
- setPropertiesPanel: (size) => set({ propertiesPanel: size }),
- setMainContent: (size) => set({ mainContent: size }),
- setTimeline: (size) => set({ timeline: size }),
- }),
- {
- name: "panel-sizes",
- }
- )
-);
+import { create } from "zustand"; +import { persist } from "zustand/middleware"; + +const DEFAULT_PANEL_SIZES = { + toolsPanel: 45, + previewPanel: 75, + propertiesPanel: 20, + mainContent: 70, + timeline: 30, +} as const; + +interface PanelState { + // Panel sizes as percentages + toolsPanel: number; + previewPanel: number; + propertiesPanel: number; + mainContent: number; + timeline: number; + + // Actions + setToolsPanel: (size: number) => void; + setPreviewPanel: (size: number) => void; + setPropertiesPanel: (size: number) => void; + setMainContent: (size: number) => void; + setTimeline: (size: number) => void; +} + +export const usePanelStore = create<PanelState>()( + persist( + (set) => ({ + // Default sizes - optimized for responsiveness + ...DEFAULT_PANEL_SIZES, + + // Actions + setToolsPanel: (size) => set({ toolsPanel: size }), + setPreviewPanel: (size) => set({ previewPanel: size }), + setPropertiesPanel: (size) => set({ propertiesPanel: size }), + setMainContent: (size) => set({ mainContent: size }), + setTimeline: (size) => set({ timeline: size }), + }), + { + name: "panel-sizes", + } + ) +); diff --git a/apps/web/src/stores/project-store.ts b/apps/web/src/stores/project-store.ts index a8833982..7bb38039 100644 --- a/apps/web/src/stores/project-store.ts +++ b/apps/web/src/stores/project-store.ts @@ -1,361 +1,360 @@ -import { TProject } from "@/types/project";
-import { create } from "zustand";
-import { storageService } from "@/lib/storage/storage-service";
-import { toast } from "sonner";
-import { useMediaStore } from "./media-store";
-import { useTimelineStore } from "./timeline-store";
-import { generateUUID } from "@/lib/utils";
-
-interface ProjectStore {
- activeProject: TProject | null;
- savedProjects: TProject[];
- isLoading: boolean;
- isInitialized: boolean;
-
- // Actions
- createNewProject: (name: string) => Promise<string>;
- loadProject: (id: string) => Promise<void>;
- saveCurrentProject: () => Promise<void>;
- loadAllProjects: () => Promise<void>;
- deleteProject: (id: string) => Promise<void>;
- closeProject: () => void;
- renameProject: (projectId: string, name: string) => Promise<void>;
- duplicateProject: (projectId: string) => Promise<string>;
- updateProjectBackground: (backgroundColor: string) => Promise<void>;
- updateBackgroundType: (
- type: "color" | "blur",
- options?: { backgroundColor?: string; blurIntensity?: number }
- ) => Promise<void>;
- updateProjectFps: (fps: number) => Promise<void>;
-
- getFilteredAndSortedProjects: (
- searchQuery: string,
- sortOption: string
- ) => TProject[];
-}
-
-export const useProjectStore = create<ProjectStore>((set, get) => ({
- activeProject: null,
- savedProjects: [],
- isLoading: true,
- isInitialized: false,
-
- createNewProject: async (name: string) => {
- const newProject: TProject = {
- id: generateUUID(),
- name,
- thumbnail: "",
- createdAt: new Date(),
- updatedAt: new Date(),
- backgroundColor: "#000000",
- backgroundType: "color",
- blurIntensity: 8,
- };
-
- set({ activeProject: newProject });
-
- try {
- await storageService.saveProject(newProject);
- // Reload all projects to update the list
- await get().loadAllProjects();
- return newProject.id;
- } catch (error) {
- toast.error("Failed to save new project");
- throw error;
- }
- },
-
- loadProject: async (id: string) => {
- if (!get().isInitialized) {
- set({ isLoading: true });
- }
-
- // Clear media and timeline immediately to prevent flickering when switching projects
- const mediaStore = useMediaStore.getState();
- const timelineStore = useTimelineStore.getState();
- mediaStore.clearAllMedia();
- timelineStore.clearTimeline();
-
- try {
- const project = await storageService.loadProject(id);
- if (project) {
- set({ activeProject: project });
-
- // Load project-specific data in parallel
- await Promise.all([
- mediaStore.loadProjectMedia(id),
- timelineStore.loadProjectTimeline(id),
- ]);
- } else {
- throw new Error(`Project with id ${id} not found`);
- }
- } catch (error) {
- console.error("Failed to load project:", error);
- throw error; // Re-throw so the editor page can handle it
- } finally {
- set({ isLoading: false });
- }
- },
-
- saveCurrentProject: async () => {
- const { activeProject } = get();
- if (!activeProject) return;
-
- try {
- // Save project metadata and timeline data in parallel
- const timelineStore = useTimelineStore.getState();
- await Promise.all([
- storageService.saveProject(activeProject),
- timelineStore.saveProjectTimeline(activeProject.id),
- ]);
- await get().loadAllProjects(); // Refresh the list
- } catch (error) {
- console.error("Failed to save project:", error);
- }
- },
-
- loadAllProjects: async () => {
- if (!get().isInitialized) {
- set({ isLoading: true });
- }
-
- try {
- const projects = await storageService.loadAllProjects();
- set({ savedProjects: projects });
- } catch (error) {
- console.error("Failed to load projects:", error);
- } finally {
- set({ isLoading: false, isInitialized: true });
- }
- },
-
- deleteProject: async (id: string) => {
- try {
- // Delete project data in parallel
- await Promise.all([
- storageService.deleteProjectMedia(id),
- storageService.deleteProjectTimeline(id),
- storageService.deleteProject(id),
- ]);
- await get().loadAllProjects(); // Refresh the list
-
- // If we deleted the active project, close it and clear data
- const { activeProject } = get();
- if (activeProject?.id === id) {
- set({ activeProject: null });
- const mediaStore = useMediaStore.getState();
- const timelineStore = useTimelineStore.getState();
- mediaStore.clearAllMedia();
- timelineStore.clearTimeline();
- }
- } catch (error) {
- console.error("Failed to delete project:", error);
- }
- },
-
- closeProject: () => {
- set({ activeProject: null });
-
- // Clear data from stores when closing project
- const mediaStore = useMediaStore.getState();
- const timelineStore = useTimelineStore.getState();
- mediaStore.clearAllMedia();
- timelineStore.clearTimeline();
- },
-
- renameProject: async (id: string, name: string) => {
- const { savedProjects } = get();
-
- // Find the project to rename
- const projectToRename = savedProjects.find((p) => p.id === id);
- if (!projectToRename) {
- toast.error("Project not found", {
- description: "Please try again",
- });
- return;
- }
-
- const updatedProject = {
- ...projectToRename,
- name,
- updatedAt: new Date(),
- };
-
- try {
- // Save to storage
- await storageService.saveProject(updatedProject);
-
- await get().loadAllProjects();
-
- // Update activeProject if it's the same project
- const { activeProject } = get();
- if (activeProject?.id === id) {
- set({ activeProject: updatedProject });
- }
- } catch (error) {
- console.error("Failed to rename project:", error);
- toast.error("Failed to rename project", {
- description:
- error instanceof Error ? error.message : "Please try again",
- });
- }
- },
-
- duplicateProject: async (projectId: string) => {
- try {
- const project = await storageService.loadProject(projectId);
- if (!project) {
- toast.error("Project not found", {
- description: "Please try again",
- });
- throw new Error("Project not found");
- }
-
- const { savedProjects } = get();
-
- // Extract the base name (remove any existing numbering)
- const numberMatch = project.name.match(/^\((\d+)\)\s+(.+)$/);
- const baseName = numberMatch ? numberMatch[2] : project.name;
- const existingNumbers: number[] = [];
-
- // Check for pattern "(number) baseName" in existing projects
- savedProjects.forEach((p) => {
- const match = p.name.match(/^\((\d+)\)\s+(.+)$/);
- if (match && match[2] === baseName) {
- existingNumbers.push(parseInt(match[1], 10));
- }
- });
-
- const nextNumber =
- existingNumbers.length > 0 ? Math.max(...existingNumbers) + 1 : 1;
-
- const newProject: TProject = {
- id: generateUUID(),
- name: `(${nextNumber}) ${baseName}`,
- thumbnail: project.thumbnail,
- createdAt: new Date(),
- updatedAt: new Date(),
- };
-
- await storageService.saveProject(newProject);
- await get().loadAllProjects();
- return newProject.id;
- } catch (error) {
- console.error("Failed to duplicate project:", error);
- toast.error("Failed to duplicate project", {
- description:
- error instanceof Error ? error.message : "Please try again",
- });
- throw error;
- }
- },
-
- updateProjectBackground: async (backgroundColor: string) => {
- const { activeProject } = get();
- if (!activeProject) return;
-
- const updatedProject = {
- ...activeProject,
- backgroundColor,
- updatedAt: new Date(),
- };
-
- try {
- await storageService.saveProject(updatedProject);
- set({ activeProject: updatedProject });
- await get().loadAllProjects(); // Refresh the list
- } catch (error) {
- console.error("Failed to update project background:", error);
- toast.error("Failed to update background", {
- description: "Please try again",
- });
- }
- },
-
- updateBackgroundType: async (
- type: "color" | "blur",
- options?: { backgroundColor?: string; blurIntensity?: number }
- ) => {
- const { activeProject } = get();
- if (!activeProject) return;
-
- const updatedProject = {
- ...activeProject,
- backgroundType: type,
- ...(options?.backgroundColor && {
- backgroundColor: options.backgroundColor,
- }),
- ...(options?.blurIntensity && { blurIntensity: options.blurIntensity }),
- updatedAt: new Date(),
- };
-
- try {
- await storageService.saveProject(updatedProject);
- set({ activeProject: updatedProject });
- await get().loadAllProjects(); // Refresh the list
- } catch (error) {
- console.error("Failed to update background type:", error);
- toast.error("Failed to update background", {
- description: "Please try again",
- });
- }
- },
-
- updateProjectFps: async (fps: number) => {
- const { activeProject } = get();
- if (!activeProject) return;
-
- const updatedProject = {
- ...activeProject,
- fps,
- updatedAt: new Date(),
- };
-
- try {
- await storageService.saveProject(updatedProject);
- set({ activeProject: updatedProject });
- await get().loadAllProjects(); // Refresh the list
- } catch (error) {
- console.error("Failed to update project FPS:", error);
- toast.error("Failed to update project FPS", {
- description: "Please try again",
- });
- }
- },
-
- getFilteredAndSortedProjects: (searchQuery: string, sortOption: string) => {
- const { savedProjects } = get();
-
- // Filter projects by search query
- const filteredProjects = savedProjects.filter((project) =>
- project.name.toLowerCase().includes(searchQuery.toLowerCase())
- );
-
- // Sort filtered projects
- const sortedProjects = [...filteredProjects].sort((a, b) => {
- const [key, order] = sortOption.split("-");
-
- if (key !== "createdAt" && key !== "name") {
- console.warn(`Invalid sort key: ${key}`);
- return 0;
- }
-
- const aValue = a[key];
- const bValue = b[key];
-
- if (aValue === undefined || bValue === undefined) return 0;
-
- if (order === "asc") {
- if (aValue < bValue) return -1;
- if (aValue > bValue) return 1;
- return 0;
- } else {
- if (aValue > bValue) return -1;
- if (aValue < bValue) return 1;
- return 0;
- }
- });
-
- return sortedProjects;
- },
-}));
+import { TProject } from "@/types/project"; +import { create } from "zustand"; +import { storageService } from "@/lib/storage/storage-service"; +import { toast } from "sonner"; +import { useMediaStore } from "./media-store"; +import { useTimelineStore } from "./timeline-store"; +import { generateUUID } from "@/lib/utils"; + +interface ProjectStore { + activeProject: TProject | null; + savedProjects: TProject[]; + isLoading: boolean; + isInitialized: boolean; + + // Actions + createNewProject: (name: string) => Promise<string>; + loadProject: (id: string) => Promise<void>; + saveCurrentProject: () => Promise<void>; + loadAllProjects: () => Promise<void>; + deleteProject: (id: string) => Promise<void>; + closeProject: () => void; + renameProject: (projectId: string, name: string) => Promise<void>; + duplicateProject: (projectId: string) => Promise<string>; + updateProjectBackground: (backgroundColor: string) => Promise<void>; + updateBackgroundType: ( + type: "color" | "blur", + options?: { backgroundColor?: string; blurIntensity?: number } + ) => Promise<void>; + updateProjectFps: (fps: number) => Promise<void>; + + getFilteredAndSortedProjects: ( + searchQuery: string, + sortOption: string + ) => TProject[]; +} + +export const useProjectStore = create<ProjectStore>((set, get) => ({ + activeProject: null, + savedProjects: [], + isLoading: true, + isInitialized: false, + + createNewProject: async (name: string) => { + const newProject: TProject = { + id: generateUUID(), + name, + thumbnail: "", + createdAt: new Date(), + updatedAt: new Date(), + backgroundColor: "#000000", + backgroundType: "color", + blurIntensity: 8, + }; + + set({ activeProject: newProject }); + + try { + await storageService.saveProject(newProject); + // Reload all projects to update the list + await get().loadAllProjects(); + return newProject.id; + } catch (error) { + toast.error("Failed to save new project"); + throw error; + } + }, + + loadProject: async (id: string) => { + if (!get().isInitialized) { + set({ isLoading: true }); + } + + // Clear media and timeline immediately to prevent flickering when switching projects + const mediaStore = useMediaStore.getState(); + const timelineStore = useTimelineStore.getState(); + mediaStore.clearAllMedia(); + timelineStore.clearTimeline(); + + try { + const project = await storageService.loadProject(id); + if (project) { + set({ activeProject: project }); + + // Load project-specific data in parallel + await Promise.all([ + mediaStore.loadProjectMedia(id), + timelineStore.loadProjectTimeline(id), + ]); + } else { + throw new Error(`Project with id ${id} not found`); + } + } catch (error) { + console.error("Failed to load project:", error); + throw error; // Re-throw so the editor page can handle it + } finally { + set({ isLoading: false }); + } + }, + + saveCurrentProject: async () => { + const { activeProject } = get(); + if (!activeProject) return; + + try { + // Save project metadata and timeline data in parallel + const timelineStore = useTimelineStore.getState(); + await Promise.all([ + storageService.saveProject(activeProject), + timelineStore.saveProjectTimeline(activeProject.id), + ]); + await get().loadAllProjects(); // Refresh the list + } catch (error) { + console.error("Failed to save project:", error); + } + }, + + loadAllProjects: async () => { + if (!get().isInitialized) { + set({ isLoading: true }); + } + + try { + const projects = await storageService.loadAllProjects(); + set({ savedProjects: projects }); + } catch (error) { + console.error("Failed to load projects:", error); + } finally { + set({ isLoading: false, isInitialized: true }); + } + }, + + deleteProject: async (id: string) => { + try { + // Delete project data in parallel + await Promise.all([ + storageService.deleteProjectMedia(id), + storageService.deleteProjectTimeline(id), + storageService.deleteProject(id), + ]); + await get().loadAllProjects(); // Refresh the list + + // If we deleted the active project, close it and clear data + const { activeProject } = get(); + if (activeProject?.id === id) { + set({ activeProject: null }); + const mediaStore = useMediaStore.getState(); + const timelineStore = useTimelineStore.getState(); + mediaStore.clearAllMedia(); + timelineStore.clearTimeline(); + } + } catch (error) { + console.error("Failed to delete project:", error); + } + }, + + closeProject: () => { + set({ activeProject: null }); + + // Clear data from stores when closing project + const mediaStore = useMediaStore.getState(); + const timelineStore = useTimelineStore.getState(); + mediaStore.clearAllMedia(); + timelineStore.clearTimeline(); + }, + + renameProject: async (id: string, name: string) => { + const { savedProjects } = get(); + + // Find the project to rename + const projectToRename = savedProjects.find((p) => p.id === id); + if (!projectToRename) { + toast.error("Project not found", { + description: "Please try again", + }); + return; + } + + const updatedProject = { + ...projectToRename, + name, + updatedAt: new Date(), + }; + + try { + // Save to storage + await storageService.saveProject(updatedProject); + + await get().loadAllProjects(); + + // Update activeProject if it's the same project + const { activeProject } = get(); + if (activeProject?.id === id) { + set({ activeProject: updatedProject }); + } + } catch (error) { + console.error("Failed to rename project:", error); + toast.error("Failed to rename project", { + description: + error instanceof Error ? error.message : "Please try again", + }); + } + }, + + duplicateProject: async (projectId: string) => { + try { + const project = await storageService.loadProject(projectId); + if (!project) { + toast.error("Project not found", { + description: "Please try again", + }); + throw new Error("Project not found"); + } + + const { savedProjects } = get(); + + // Extract the base name (remove any existing numbering) + const numberMatch = project.name.match(/^\((\d+)\)\s+(.+)$/); + const baseName = numberMatch ? numberMatch[2] : project.name; + const existingNumbers: number[] = []; + + // Check for pattern "(number) baseName" in existing projects + savedProjects.forEach((p) => { + const match = p.name.match(/^\((\d+)\)\s+(.+)$/); + if (match && match[2] === baseName) { + existingNumbers.push(parseInt(match[1], 10)); + } + }); + + const nextNumber = + existingNumbers.length > 0 ? Math.max(...existingNumbers) + 1 : 1; + + const newProject: TProject = { + id: generateUUID(), + name: `(${nextNumber}) ${baseName}`, + thumbnail: project.thumbnail, + createdAt: new Date(), + updatedAt: new Date(), + }; + + await storageService.saveProject(newProject); + await get().loadAllProjects(); + return newProject.id; + } catch (error) { + console.error("Failed to duplicate project:", error); + toast.error("Failed to duplicate project", { + description: + error instanceof Error ? error.message : "Please try again", + }); + throw error; + } + }, + + updateProjectBackground: async (backgroundColor: string) => { + const { activeProject } = get(); + if (!activeProject) return; + + const updatedProject = { + ...activeProject, + backgroundColor, + updatedAt: new Date(), + }; + + try { + await storageService.saveProject(updatedProject); + set({ activeProject: updatedProject }); + await get().loadAllProjects(); // Refresh the list + } catch (error) { + console.error("Failed to update project background:", error); + toast.error("Failed to update background", { + description: "Please try again", + }); + } + }, + + updateBackgroundType: async ( + type: "color" | "blur", + options?: { backgroundColor?: string; blurIntensity?: number } + ) => { + const { activeProject } = get(); + if (!activeProject) return; + + const updatedProject = { + ...activeProject, + backgroundType: type, + ...(options?.backgroundColor && { + backgroundColor: options.backgroundColor, + }), + ...(options?.blurIntensity && { blurIntensity: options.blurIntensity }), + updatedAt: new Date(), + }; + + try { + await storageService.saveProject(updatedProject); + set({ activeProject: updatedProject }); + await get().loadAllProjects(); // Refresh the list + } catch (error) { + console.error("Failed to update background type:", error); + toast.error("Failed to update background", { + description: "Please try again", + }); + } + }, + + updateProjectFps: async (fps: number) => { + const { activeProject } = get(); + if (!activeProject) return; + + const updatedProject = { + ...activeProject, + fps, + updatedAt: new Date(), + }; + + try { + await storageService.saveProject(updatedProject); + set({ activeProject: updatedProject }); + await get().loadAllProjects(); // Refresh the list + } catch (error) { + console.error("Failed to update project FPS:", error); + toast.error("Failed to update project FPS", { + description: "Please try again", + }); + } + }, + + getFilteredAndSortedProjects: (searchQuery: string, sortOption: string) => { + const { savedProjects } = get(); + + // Filter projects by search query + const filteredProjects = savedProjects.filter((project) => + project.name.toLowerCase().includes(searchQuery.toLowerCase()) + ); + + // Sort filtered projects + const sortedProjects = [...filteredProjects].sort((a, b) => { + const [key, order] = sortOption.split("-"); + + if (key !== "createdAt" && key !== "name") { + console.warn(`Invalid sort key: ${key}`); + return 0; + } + + const aValue = a[key]; + const bValue = b[key]; + + if (aValue === undefined || bValue === undefined) return 0; + + if (order === "asc") { + if (aValue < bValue) return -1; + if (aValue > bValue) return 1; + return 0; + } + if (aValue > bValue) return -1; + if (aValue < bValue) return 1; + return 0; + }); + + return sortedProjects; + }, +})); diff --git a/apps/web/src/stores/timeline-store.ts b/apps/web/src/stores/timeline-store.ts index 8a4abc6a..820025cc 100644 --- a/apps/web/src/stores/timeline-store.ts +++ b/apps/web/src/stores/timeline-store.ts @@ -295,9 +295,8 @@ export const useTimelineStore = create<TimelineStore>((set, get) => { { trackId, elementId }, ], }; - } else { - return { selectedElements: [{ trackId, elementId }] }; } + return { selectedElements: [{ trackId, elementId }] }; }); }, @@ -680,7 +679,8 @@ export const useTimelineStore = create<TimelineStore>((set, get) => { (element) => element.id !== elementId ), }; - } else if (track.id === toTrackId) { + } + if (track.id === toTrackId) { return { ...track, elements: [...track.elements, elementToMove], @@ -1091,7 +1091,7 @@ export const useTimelineStore = create<TimelineStore>((set, get) => { if (!fileType) return false; // Process the new media file - let mediaData: any = { + const mediaData: any = { name: newFile.name, type: fileType, file: newFile, @@ -1204,7 +1204,8 @@ export const useTimelineStore = create<TimelineStore>((set, get) => { ); const { thumbnailUrl } = await generateVideoThumbnail(mediaItem.file); return thumbnailUrl; - } else if (mediaItem.type === "image" && mediaItem.url) { + } + if (mediaItem.type === "image" && mediaItem.url) { return mediaItem.url; } diff --git a/apps/web/src/types/editor.ts b/apps/web/src/types/editor.ts index dce7ac50..b0449991 100644 --- a/apps/web/src/types/editor.ts +++ b/apps/web/src/types/editor.ts @@ -1,12 +1,12 @@ -export type BackgroundType = "blur" | "mirror" | "color";
-
-export interface CanvasSize {
- width: number;
- height: number;
-}
-
-export interface CanvasPreset {
- name: string;
- width: number;
- height: number;
-}
+export type BackgroundType = "blur" | "mirror" | "color"; + +export interface CanvasSize { + width: number; + height: number; +} + +export interface CanvasPreset { + name: string; + width: number; + height: number; +} diff --git a/apps/web/src/types/keybinding.ts b/apps/web/src/types/keybinding.ts index d97c88da..831f3abd 100644 --- a/apps/web/src/types/keybinding.ts +++ b/apps/web/src/types/keybinding.ts @@ -16,12 +16,58 @@ export type ModifierKeys = /* eslint-disable prettier/prettier */ // prettier-ignore export type Key = - | "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" | "0" | "1" | "2" | "3" - | "4" | "5" | "6" | "7" | "8" | "9" | "up" | "down" | "left" - | "right" | "/" | "?" | "." | "enter" | "tab" | "space" - | "escape" | "esc" | "backspace" | "delete" | "home" | "end" + | "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" + | "0" + | "1" + | "2" + | "3" + | "4" + | "5" + | "6" + | "7" + | "8" + | "9" + | "up" + | "down" + | "left" + | "right" + | "/" + | "?" + | "." + | "enter" + | "tab" + | "space" + | "escape" + | "esc" + | "backspace" + | "delete" + | "home" + | "end"; /* eslint-enable */ export type ModifierBasedShortcutKey = `${ModifierKeys}+${Key}`; diff --git a/apps/web/src/types/post.ts b/apps/web/src/types/post.ts index c3436847..fbee239e 100644 --- a/apps/web/src/types/post.ts +++ b/apps/web/src/types/post.ts @@ -1,93 +1,92 @@ export type Post = { - id: string; - slug: string; - title: string; - content: string; - description: string; - coverImage: string; - publishedAt: Date; - updatedAt: Date; - authors: { - id: string; - name: string; - image: string; - }[]; - category: { - id: string; - slug: string; - name: string; - }; - tags: { - id: string; - slug: string; - name: string; - }[]; - attribution: { - author: string; - url: string; - } | null; - }; - - export type Pagination = { - limit: number; - currpage: number; - nextPage: number | null; - prevPage: number | null; - totalItems: number; - totalPages: number; - }; - - export type MarblePostList = { - posts: Post[]; - pagination: Pagination; - }; - - export type MarblePost = { - post: Post; - }; - - export type Tag = { + id: string; + slug: string; + title: string; + content: string; + description: string; + coverImage: string; + publishedAt: Date; + updatedAt: Date; + authors: { id: string; name: string; - slug: string; - }; - - export type MarbleTag = { - tag: Tag; - }; - - export type MarbleTagList = { - tags: Tag[]; - pagination: Pagination; - }; - - export type Category = { + image: string; + }[]; + category: { id: string; - name: string; slug: string; + name: string; }; - - export type MarbleCategory = { - category: Category; - }; - - export type MarbleCategoryList = { - categories: Category[]; - pagination: Pagination; - }; - - export type Author = { + tags: { id: string; + slug: string; name: string; - image: string; - }; - - export type MarbleAuthor = { - author: Author; - }; - - export type MarbleAuthorList = { - authors: Author[]; - pagination: Pagination; - }; -
\ No newline at end of file + }[]; + attribution: { + author: string; + url: string; + } | null; +}; + +export type Pagination = { + limit: number; + currpage: number; + nextPage: number | null; + prevPage: number | null; + totalItems: number; + totalPages: number; +}; + +export type MarblePostList = { + posts: Post[]; + pagination: Pagination; +}; + +export type MarblePost = { + post: Post; +}; + +export type Tag = { + id: string; + name: string; + slug: string; +}; + +export type MarbleTag = { + tag: Tag; +}; + +export type MarbleTagList = { + tags: Tag[]; + pagination: Pagination; +}; + +export type Category = { + id: string; + name: string; + slug: string; +}; + +export type MarbleCategory = { + category: Category; +}; + +export type MarbleCategoryList = { + categories: Category[]; + pagination: Pagination; +}; + +export type Author = { + id: string; + name: string; + image: string; +}; + +export type MarbleAuthor = { + author: Author; +}; + +export type MarbleAuthorList = { + authors: Author[]; + pagination: Pagination; +}; diff --git a/apps/web/src/types/timeline.ts b/apps/web/src/types/timeline.ts index f8a79d03..ef20c642 100644 --- a/apps/web/src/types/timeline.ts +++ b/apps/web/src/types/timeline.ts @@ -138,7 +138,8 @@ export function canElementGoOnTrack( ): boolean { if (elementType === "text") { return trackType === "text"; - } else if (elementType === "media") { + } + if (elementType === "media") { return trackType === "media" || trackType === "audio"; } return false; diff --git a/apps/web/tailwind.config.ts b/apps/web/tailwind.config.ts index d992b7b4..67a24946 100644 --- a/apps/web/tailwind.config.ts +++ b/apps/web/tailwind.config.ts @@ -1,6 +1,5 @@ import type { Config } from "tailwindcss"; - export default { darkMode: ["class"], content: [ @@ -110,11 +109,11 @@ export default { plugins: [ require("@tailwindcss/typography"), require("tailwindcss-animate"), - function ({ + ({ addUtilities, }: { addUtilities: (utilities: Record<string, any>) => void; - }) { + }) => { addUtilities({ ".scrollbar-hidden": { "-ms-overflow-style": "none", diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json index e291637a..0a966d20 100644 --- a/apps/web/tsconfig.json +++ b/apps/web/tsconfig.json @@ -1,11 +1,7 @@ { "compilerOptions": { "target": "ES2017", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], + "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -23,9 +19,7 @@ } ], "paths": { - "@/*": [ - "./src/*" - ] + "@/*": ["./src/*"] }, "forceConsistentCasingInFileNames": true }, @@ -37,7 +31,5 @@ ".next/types/**/*.ts", "src/types/**/*.d.ts" ], - "exclude": [ - "node_modules" - ] + "exclude": ["node_modules"] } diff --git a/apps/web/tsconfig.tsbuildinfo b/apps/web/tsconfig.tsbuildinfo new file mode 100644 index 00000000..37dfbac9 --- /dev/null +++ b/apps/web/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"fileNames":["../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.collection.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.object.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.promise.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.string.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.promise.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.iterator.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.float16.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.bun/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.bun/drizzle-kit@0.31.4/node_modules/drizzle-kit/index-baurj6ib.d.mts","../../node_modules/.bun/drizzle-kit@0.31.4/node_modules/drizzle-kit/index.d.mts","../../node_modules/@types/node/compatibility/disposable.d.ts","../../node_modules/@types/node/compatibility/indexable.d.ts","../../node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/@types/node/compatibility/index.d.ts","../../node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/undici-types/header.d.ts","../../node_modules/undici-types/readable.d.ts","../../node_modules/undici-types/file.d.ts","../../node_modules/undici-types/fetch.d.ts","../../node_modules/undici-types/formdata.d.ts","../../node_modules/undici-types/connector.d.ts","../../node_modules/undici-types/client.d.ts","../../node_modules/undici-types/errors.d.ts","../../node_modules/undici-types/dispatcher.d.ts","../../node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/undici-types/global-origin.d.ts","../../node_modules/undici-types/pool-stats.d.ts","../../node_modules/undici-types/pool.d.ts","../../node_modules/undici-types/handlers.d.ts","../../node_modules/undici-types/balanced-pool.d.ts","../../node_modules/undici-types/agent.d.ts","../../node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/undici-types/mock-agent.d.ts","../../node_modules/undici-types/mock-client.d.ts","../../node_modules/undici-types/mock-pool.d.ts","../../node_modules/undici-types/mock-errors.d.ts","../../node_modules/undici-types/proxy-agent.d.ts","../../node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/undici-types/retry-handler.d.ts","../../node_modules/undici-types/retry-agent.d.ts","../../node_modules/undici-types/api.d.ts","../../node_modules/undici-types/interceptors.d.ts","../../node_modules/undici-types/util.d.ts","../../node_modules/undici-types/cookies.d.ts","../../node_modules/undici-types/patch.d.ts","../../node_modules/undici-types/websocket.d.ts","../../node_modules/undici-types/eventsource.d.ts","../../node_modules/undici-types/filereader.d.ts","../../node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/undici-types/content-type.d.ts","../../node_modules/undici-types/cache.d.ts","../../node_modules/undici-types/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/sea.d.ts","../../node_modules/@types/node/sqlite.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/.bun/dotenv@16.6.1/node_modules/dotenv/lib/main.d.ts","./drizzle.config.ts","../../node_modules/.bun/@types+react@18.3.23/node_modules/@types/react/global.d.ts","../../node_modules/.bun/csstype@3.1.3/node_modules/csstype/index.d.ts","../../node_modules/.bun/@types+prop-types@15.7.15/node_modules/@types/prop-types/index.d.ts","../../node_modules/.bun/@types+react@18.3.23/node_modules/@types/react/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/styled-jsx/types/css.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/styled-jsx/types/macro.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/styled-jsx/types/style.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/styled-jsx/types/global.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/styled-jsx/types/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/amp.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/amp.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/get-page-files.d.ts","../../node_modules/.bun/@types+react@18.3.23/node_modules/@types/react/canary.d.ts","../../node_modules/.bun/@types+react@18.3.23/node_modules/@types/react/experimental.d.ts","../../node_modules/.bun/@types+react-dom@18.3.7+fccada1f982c16e9/node_modules/@types/react-dom/index.d.ts","../../node_modules/.bun/@types+react-dom@18.3.7+fccada1f982c16e9/node_modules/@types/react-dom/canary.d.ts","../../node_modules/.bun/@types+react-dom@18.3.7+fccada1f982c16e9/node_modules/@types/react-dom/experimental.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/fallback.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/compiled/webpack/webpack.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/config.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/load-custom-routes.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/image-config.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/body-streams.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/cache-control.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/setup-exception-listeners.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/worker.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/constants.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/app-router-headers.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/rendering-mode.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/require-hook.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/experimental/ppr.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/webpack/plugins/app-build-manifest-plugin.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/page-types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/segment-config/app/app-segment-config.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/segment-config/pages/pages-segment-config.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/analysis/get-page-static-info.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/node-polyfill-crypto.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/node-environment-baseline.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/node-environment-extensions/error-inspect.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/node-environment-extensions/random.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/node-environment-extensions/date.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/node-environment-extensions/web-crypto.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/node-environment-extensions/node-crypto.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/node-environment.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/page-extensions-type.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/instrumentation/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/coalesced-function.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/router-utils/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/constants.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/trace/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/trace/trace.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/trace/shared.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/trace/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/load-jsconfig.d.ts","../../node_modules/.bun/@next+env@15.4.3/node_modules/@next/env/dist/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/webpack/plugins/telemetry-plugin/use-cache-tracker-utils.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/webpack/plugins/telemetry-plugin/telemetry-plugin.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/telemetry/storage.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/build-context.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/bloom-filter.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/webpack-config.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-kind.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-definitions/route-definition.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/swc/generated-native.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/swc/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/dev/parse-version-info.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/next-devtools/shared/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/dev/dev-indicator-server-state.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/dev/hot-reloader-types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/cache-handlers/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/response-cache/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/resume-data-cache/cache-store.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/resume-data-cache/resume-data-cache.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/render-result.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/i18n-provider.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/web/next-url.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/web/spec-extension/cookies.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/web/spec-extension/request.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/after/builtin-request-context.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/web/spec-extension/response.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/segment-config/middleware/middleware-config.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/web/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/base-http/node.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-definitions/locale-route-definition.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-definitions/pages-route-definition.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/mitt.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/with-router.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/router.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/route-loader.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/page-loader.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/router/router.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-definitions/app-page-route-definition.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/webpack/loaders/next-app-loader/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/app-dir-module.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/app-render/cache-signal.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/app-render/work-unit-async-storage-instance.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/response-cache/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/request/fallback-params.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/lazy-result.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/implicit-tags.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/app-render/work-unit-async-storage.external.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/deep-readonly.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/router/utils/parse-relative-url.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/app-render/app-render.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/amp-context.shared-runtime.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-modules/app-page/module.compiled.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/error-boundary.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/layout-router.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/render-from-template-context.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/app-render/action-async-storage-instance.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/app-render/action-async-storage.external.d.ts","../../node_modules/.bun/@types+react@18.3.23/node_modules/@types/react/jsx-runtime.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/client-page.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/client-segment.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/request/search-params.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/hooks-server-context.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/http-access-fallback/error-boundary.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/metadata/types/extra-types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/metadata/types/resolvers.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/metadata/types/icons.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/metadata/resolve-metadata.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/lib/metadata/metadata.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/metadata/metadata-boundary.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/app-render/rsc/preloads.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/app-render/rsc/postpone.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/app-render/rsc/taint.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/app-render/collect-segment-data.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/next-devtools/userspace/app/segment-explorer-node.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/app-render/entry-base.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/templates/app-page.d.ts","../../node_modules/.bun/@types+react@18.3.23/node_modules/@types/react/jsx-dev-runtime.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-modules/app-page/vendored/rsc/entrypoints.d.ts","../../node_modules/.bun/@types+react-dom@18.3.7+fccada1f982c16e9/node_modules/@types/react-dom/client.d.ts","../../node_modules/.bun/@types+react-dom@18.3.7+fccada1f982c16e9/node_modules/@types/react-dom/server.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-modules/app-page/vendored/ssr/entrypoints.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-modules/app-page/module.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/web/adapter.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/use-cache/cache-life.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/app-render/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/flight-data-helpers.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-modules/pages/module.compiled.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/templates/pages.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-modules/pages/module.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/next-devtools/userspace/pages/pages-dev-overlay-setup.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/render.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-definitions/pages-api-route-definition.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-matches/pages-api-route-match.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-matchers/route-matcher.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/normalizers/normalizer.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/normalizers/locale-route-normalizer.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/normalizers/request/pathname-normalizer.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/normalizers/request/suffix.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/normalizers/request/rsc.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/normalizers/request/prefetch-rsc.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/normalizers/request/next-data.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/base-server.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/async-callback-set.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","../../node_modules/.bun/sharp@0.34.3/node_modules/sharp/lib/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/image-optimizer.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/next-server.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/lru-cache.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/dev-bundler-service.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/static-paths/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/dev/static-paths-worker.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/dev/next-dev-server.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/next.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/render-server.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/router-server.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/router-utils/router-server-context.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-modules/route-module.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/load-components.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-definitions/app-route-route-definition.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/async-storage/work-store.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/web/http.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-modules/app-route/shared-modules.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/redirect-status-code.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/redirect-error.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/templates/app-route.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-modules/app-route/module.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-modules/app-route/module.compiled.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/segment-config/app/app-segments.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/utils.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/turborepo-access-trace/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/turborepo-access-trace/result.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/turborepo-access-trace/helpers.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/turborepo-access-trace/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/export/routes/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/export/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/export/worker.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/worker.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/build/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/lib/incremental-cache/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/after/after.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/after/after-context.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/app-render/work-async-storage-instance.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/app-render/work-async-storage.external.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/request/params.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/route-matches/route-match.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/request-meta.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/cli/next-test.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/config-shared.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/base-http/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/api-utils/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/utils.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/pages/_app.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/app.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/web/spec-extension/revalidate.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/use-cache/cache-tag.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/cache.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/runtime-config.external.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/config.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/pages/_document.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/document.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/dynamic.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dynamic.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/pages/_error.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/error.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/head.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/head.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/request/cookies.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/request/headers.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/request/draft-mode.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/headers.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/get-img-props.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/image-component.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/shared/lib/image-external.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/image.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/link.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/link.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/redirect.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/not-found.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/forbidden.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/unauthorized.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/unstable-rethrow.server.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/unstable-rethrow.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/navigation.react-server.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/components/navigation.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/navigation.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/router.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/client/script.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/script.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/web/spec-extension/image-response.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/compiled/@vercel/og/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/after/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/request/root-params.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/server/request/connection.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/server.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/types/global.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/types/compiled.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/image-types/global.d.ts","./next-env.d.ts","../../node_modules/.bun/botid@1.4.2+39dd938b2b570c60/node_modules/botid/dist/next/config/index.d.ts","./next.config.ts","../../node_modules/.bun/source-map-js@1.2.1/node_modules/source-map-js/source-map.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/previous-map.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/input.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/css-syntax-error.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/declaration.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/root.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/warning.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/lazy-result.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/no-work-result.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/processor.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/result.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/document.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/rule.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/node.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/comment.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/container.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/at-rule.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/list.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/postcss.d.ts","../../node_modules/.bun/postcss@8.5.6/node_modules/postcss/lib/postcss.d.mts","../../node_modules/.bun/tailwindcss@3.4.17/node_modules/tailwindcss/types/generated/corepluginlist.d.ts","../../node_modules/.bun/tailwindcss@3.4.17/node_modules/tailwindcss/types/generated/colors.d.ts","../../node_modules/.bun/tailwindcss@3.4.17/node_modules/tailwindcss/types/config.d.ts","../../node_modules/.bun/tailwindcss@3.4.17/node_modules/tailwindcss/types/index.d.ts","./tailwind.config.ts","../../node_modules/.bun/@t3-oss+env-core@0.13.8+50555f8ded582d61/node_modules/@t3-oss/env-core/dist/presets-cmsjz_ts.d.ts","../../node_modules/.bun/@t3-oss+env-core@0.13.8+50555f8ded582d61/node_modules/@t3-oss/env-core/dist/presets-zod.d.ts","../../node_modules/.bun/@t3-oss+env-core@0.13.8+50555f8ded582d61/node_modules/@t3-oss/env-core/dist/index.d.ts","../../node_modules/.bun/@t3-oss+env-nextjs@0.13.8+50555f8ded582d61/node_modules/@t3-oss/env-nextjs/dist/index.d.ts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/helpers/typealiases.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/helpers/util.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/index.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/zoderror.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/locales/en.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/errors.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/helpers/parseutil.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/helpers/enumutil.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/helpers/errorutil.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/helpers/partialutil.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/standard-schema.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/types.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v3/external.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/index.d.cts","../../node_modules/.bun/@t3-oss+env-core@0.13.8+b738c2472c9862c9/node_modules/@t3-oss/env-core/dist/index.d.ts","../../node_modules/.bun/@t3-oss+env-nextjs@0.13.8+b738c2472c9862c9/node_modules/@t3-oss/env-nextjs/dist/index.d.ts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/core/standard-schema.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/core/util.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/core/versions.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/core/schemas.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/core/checks.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/core/errors.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/core/core.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/core/parse.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/core/regexes.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/ar.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/az.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/be.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/ca.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/cs.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/de.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/en.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/eo.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/es.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/fa.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/fi.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/fr.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/fr-ca.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/he.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/hu.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/id.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/it.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/ja.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/kh.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/ko.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/mk.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/ms.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/nl.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/no.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/ota.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/ps.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/pl.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/pt.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/ru.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/sl.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/sv.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/ta.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/th.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/tr.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/ua.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/ur.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/vi.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/zh-cn.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/zh-tw.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/locales/index.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/core/registries.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/core/doc.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/core/function.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/core/api.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/core/json-schema.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/core/to-json-schema.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/core/index.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/classic/errors.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/classic/parse.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/classic/schemas.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/classic/checks.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/classic/compat.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/classic/iso.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/classic/coerce.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/v4/classic/external.d.cts","../../node_modules/.bun/zod@4.0.5/node_modules/zod/index.d.cts","../../packages/auth/src/keys.ts","../../packages/db/src/keys.ts","./src/env.ts","./src/middleware.ts","./src/constants/site.ts","./src/app/metadata.ts","./src/app/robots.ts","./src/types/post.ts","../../node_modules/.bun/@types+unist@3.0.3/node_modules/@types/unist/index.d.ts","../../node_modules/.bun/vfile-message@4.0.2/node_modules/vfile-message/lib/index.d.ts","../../node_modules/.bun/vfile-message@4.0.2/node_modules/vfile-message/index.d.ts","../../node_modules/.bun/vfile@6.0.3/node_modules/vfile/lib/index.d.ts","../../node_modules/.bun/vfile@6.0.3/node_modules/vfile/index.d.ts","../../node_modules/.bun/unified@11.0.5/node_modules/unified/lib/callable-instance.d.ts","../../node_modules/.bun/trough@2.2.0/node_modules/trough/lib/index.d.ts","../../node_modules/.bun/trough@2.2.0/node_modules/trough/index.d.ts","../../node_modules/.bun/unified@11.0.5/node_modules/unified/lib/index.d.ts","../../node_modules/.bun/unified@11.0.5/node_modules/unified/index.d.ts","../../node_modules/.bun/@types+hast@3.0.4/node_modules/@types/hast/index.d.ts","../../node_modules/.bun/parse5@7.3.0/node_modules/parse5/dist/common/html.d.ts","../../node_modules/.bun/parse5@7.3.0/node_modules/parse5/dist/common/token.d.ts","../../node_modules/.bun/parse5@7.3.0/node_modules/parse5/dist/common/error-codes.d.ts","../../node_modules/.bun/parse5@7.3.0/node_modules/parse5/dist/tokenizer/preprocessor.d.ts","../../node_modules/.bun/entities@6.0.1/node_modules/entities/dist/esm/generated/decode-data-html.d.ts","../../node_modules/.bun/entities@6.0.1/node_modules/entities/dist/esm/generated/decode-data-xml.d.ts","../../node_modules/.bun/entities@6.0.1/node_modules/entities/dist/esm/decode-codepoint.d.ts","../../node_modules/.bun/entities@6.0.1/node_modules/entities/dist/esm/decode.d.ts","../../node_modules/.bun/parse5@7.3.0/node_modules/parse5/dist/tokenizer/index.d.ts","../../node_modules/.bun/parse5@7.3.0/node_modules/parse5/dist/tree-adapters/interface.d.ts","../../node_modules/.bun/parse5@7.3.0/node_modules/parse5/dist/parser/open-element-stack.d.ts","../../node_modules/.bun/parse5@7.3.0/node_modules/parse5/dist/parser/formatting-element-list.d.ts","../../node_modules/.bun/parse5@7.3.0/node_modules/parse5/dist/parser/index.d.ts","../../node_modules/.bun/parse5@7.3.0/node_modules/parse5/dist/tree-adapters/default.d.ts","../../node_modules/.bun/parse5@7.3.0/node_modules/parse5/dist/serializer/index.d.ts","../../node_modules/.bun/parse5@7.3.0/node_modules/parse5/dist/common/foreign-content.d.ts","../../node_modules/.bun/parse5@7.3.0/node_modules/parse5/dist/index.d.ts","../../node_modules/.bun/property-information@7.1.0/node_modules/property-information/lib/util/info.d.ts","../../node_modules/.bun/property-information@7.1.0/node_modules/property-information/lib/find.d.ts","../../node_modules/.bun/property-information@7.1.0/node_modules/property-information/lib/hast-to-react.d.ts","../../node_modules/.bun/property-information@7.1.0/node_modules/property-information/lib/normalize.d.ts","../../node_modules/.bun/property-information@7.1.0/node_modules/property-information/index.d.ts","../../node_modules/.bun/hast-util-from-parse5@8.0.3/node_modules/hast-util-from-parse5/lib/index.d.ts","../../node_modules/.bun/hast-util-from-parse5@8.0.3/node_modules/hast-util-from-parse5/index.d.ts","../../node_modules/.bun/hast-util-from-html@2.0.3/node_modules/hast-util-from-html/lib/errors.d.ts","../../node_modules/.bun/hast-util-from-html@2.0.3/node_modules/hast-util-from-html/lib/types.d.ts","../../node_modules/.bun/hast-util-from-html@2.0.3/node_modules/hast-util-from-html/lib/index.d.ts","../../node_modules/.bun/hast-util-from-html@2.0.3/node_modules/hast-util-from-html/index.d.ts","../../node_modules/.bun/rehype-parse@9.0.1/node_modules/rehype-parse/lib/index.d.ts","../../node_modules/.bun/rehype-parse@9.0.1/node_modules/rehype-parse/index.d.ts","../../node_modules/.bun/stringify-entities@4.0.4/node_modules/stringify-entities/lib/util/format-smart.d.ts","../../node_modules/.bun/stringify-entities@4.0.4/node_modules/stringify-entities/lib/core.d.ts","../../node_modules/.bun/stringify-entities@4.0.4/node_modules/stringify-entities/lib/index.d.ts","../../node_modules/.bun/stringify-entities@4.0.4/node_modules/stringify-entities/index.d.ts","../../node_modules/.bun/hast-util-to-html@9.0.5/node_modules/hast-util-to-html/lib/index.d.ts","../../node_modules/.bun/hast-util-to-html@9.0.5/node_modules/hast-util-to-html/index.d.ts","../../node_modules/.bun/rehype-stringify@10.0.1/node_modules/rehype-stringify/index.d.ts","../../node_modules/.bun/rehype-slug@6.0.0/node_modules/rehype-slug/lib/index.d.ts","../../node_modules/.bun/rehype-slug@6.0.0/node_modules/rehype-slug/index.d.ts","../../node_modules/.bun/hast-util-is-element@3.0.0/node_modules/hast-util-is-element/lib/index.d.ts","../../node_modules/.bun/hast-util-is-element@3.0.0/node_modules/hast-util-is-element/index.d.ts","../../node_modules/.bun/rehype-autolink-headings@7.1.0/node_modules/rehype-autolink-headings/lib/index.d.ts","../../node_modules/.bun/rehype-autolink-headings@7.1.0/node_modules/rehype-autolink-headings/index.d.ts","../../node_modules/.bun/hast-util-sanitize@5.0.2/node_modules/hast-util-sanitize/lib/index.d.ts","../../node_modules/.bun/hast-util-sanitize@5.0.2/node_modules/hast-util-sanitize/lib/schema.d.ts","../../node_modules/.bun/hast-util-sanitize@5.0.2/node_modules/hast-util-sanitize/index.d.ts","../../node_modules/.bun/rehype-sanitize@6.0.0/node_modules/rehype-sanitize/lib/index.d.ts","../../node_modules/.bun/rehype-sanitize@6.0.0/node_modules/rehype-sanitize/index.d.ts","./src/lib/blog-query.ts","./src/app/sitemap.ts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/core/standard-schema.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/core/util.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/core/versions.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/core/schemas.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/core/checks.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/core/errors.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/core/core.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/core/parse.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/core/regexes.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/ar.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/az.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/be.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/ca.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/cs.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/de.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/en.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/eo.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/es.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/fa.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/fi.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/fr.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/fr-ca.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/he.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/hu.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/id.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/it.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/ja.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/kh.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/ko.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/mk.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/ms.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/nl.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/no.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/ota.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/ps.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/pl.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/pt.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/ru.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/sl.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/sv.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/ta.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/th.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/tr.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/ua.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/ur.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/vi.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/zh-cn.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/zh-tw.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/locales/index.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/core/registries.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/core/doc.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/core/function.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/core/api.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/core/json-schema.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/core/to-json-schema.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/core/index.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/classic/errors.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/classic/parse.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/classic/schemas.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/classic/checks.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/classic/compat.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/classic/iso.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/classic/coerce.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/classic/external.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/classic/index.d.cts","../../node_modules/.bun/zod@3.25.76/node_modules/zod/v4/index.d.cts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/operation-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/identifier-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/check-constraint-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/column-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/default-value-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/generated-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/schemable-identifier-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/table-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/insert-result.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/delete-result.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/update-result.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/util/type-error.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/merge-result.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/util/type-utils.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/references-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/column-definition-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/add-column-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/drop-column-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/rename-column-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/raw-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/alter-column-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/foreign-key-constraint-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/primary-key-constraint-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/unique-constraint-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/constraint-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/add-constraint-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/drop-constraint-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/modify-column-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/drop-index-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/add-index-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/rename-constraint-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/alter-table-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/where-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/create-index-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/create-schema-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/create-table-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/value-list-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/create-type-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/from-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/group-by-item-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/group-by-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/having-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/on-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/join-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/limit-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/offset-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/collate-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/order-by-item-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/order-by-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/alias-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/select-all-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/reference-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/simple-reference-expression-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/selection-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/common-table-expression-name-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/common-table-expression-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/with-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/select-modifier-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/operation-node-source.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/expression/expression.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/util/explainable.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/explain-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/set-operation-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/value-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/fetch-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/top-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/select-query-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/create-view-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/drop-schema-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/drop-table-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/drop-type-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/drop-view-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/output-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/returning-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/when-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/merge-query-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/column-update-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/on-conflict-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/on-duplicate-key-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/or-action-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/insert-query-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/update-query-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/using-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/delete-query-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/query-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/refresh-materialized-view-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/util/query-id.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-compiler/compiled-query.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-compiler/query-compiler.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/driver/database-connection.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/driver/driver.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/database-introspector.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/dialect-adapter.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/dialect.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/driver/connection-provider.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/plugin/kysely-plugin.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-executor/query-executor.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/util/compilable.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/default-value-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/column-definition-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/data-type-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/data-type-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/foreign-key-constraint-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/alter-column-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/alter-table-executor.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/alter-table-add-foreign-key-constraint-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/alter-table-drop-constraint-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/select-query-builder-expression.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/binary-operation-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/operator-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/value-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/util/column-type.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/binary-operation-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/join-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dynamic/dynamic-table-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/table-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/join-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dynamic/dynamic-reference-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/select-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/collate-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/order-by-item-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/order-by-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/group-by-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/where-interface.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/no-result-error.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/having-interface.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/set-operation-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/util/streamable.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/and-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/or-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/parens-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/expression/expression-wrapper.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/order-by-interface.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/select-query-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/coalesce-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/partition-by-item-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/partition-by-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/over-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/aggregate-function-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/partition-by-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/over-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/aggregate-function-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/function-module.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/case-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/case-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/json-path-leg-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/json-path-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/json-operator-chain-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/json-reference-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/json-path-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/tuple-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/select-from-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/expression/expression-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/expression-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/reference-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/alter-table-add-index-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/unique-constraint-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/primary-key-constraint-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/check-constraint-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/alter-table-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/create-index-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/create-schema-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/create-table-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/drop-index-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/drop-schema-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/drop-table-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-executor/query-executor-provider.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/raw-builder/raw-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/create-view-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/drop-view-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/create-type-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/drop-type-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/refresh-materialized-view-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/schema/schema.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dynamic/dynamic.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/primitive-value-list-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/values-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/insert-values-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/update-set-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/returning-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/returning-interface.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/on-conflict-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/output-interface.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/insert-query-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/update-query-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/delete-query-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/cte-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/with-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/delete-from-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/update-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-builder/merge-query-builder.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/merge-into-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-creator.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/util/log.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/savepoint-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/util/provide-controlled-connection.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/kysely.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/raw-builder/sql.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-executor/query-executor-base.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-executor/default-query-executor.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-executor/noop-query-executor.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/list-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/default-insert-value-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/unary-operation-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/function-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/tuple-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/matched-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/cast-node.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/operation-node-visitor.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/query-compiler/default-query-compiler.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/driver/default-connection-provider.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/driver/single-connection-provider.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/driver/dummy-driver.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/dialect-adapter-base.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-dialect-config.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-dialect.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-driver.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/postgres/postgres-query-compiler.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/postgres/postgres-introspector.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/postgres/postgres-adapter.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/mysql/mysql-dialect-config.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/mysql/mysql-dialect.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/mysql/mysql-driver.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/mysql/mysql-query-compiler.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/mysql/mysql-introspector.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/mysql/mysql-adapter.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/postgres/postgres-dialect-config.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/postgres/postgres-driver.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/postgres/postgres-dialect.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-query-compiler.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-introspector.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/sqlite/sqlite-adapter.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/mssql/mssql-adapter.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/mssql/mssql-dialect-config.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/mssql/mssql-dialect.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/mssql/mssql-driver.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/mssql/mssql-introspector.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/dialect/mssql/mssql-query-compiler.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/migration/migrator.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/migration/file-migration-provider.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/plugin/camel-case/camel-case-plugin.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/plugin/deduplicate-joins/deduplicate-joins-plugin.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/plugin/with-schema/with-schema-plugin.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/plugin/parse-json-results/parse-json-results-plugin.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/plugin/handle-empty-in-lists/handle-empty-in-lists-plugin.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/operation-node/operation-node-transformer.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/util/infer-result.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/util/log-once.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/parser/unary-operation-parser.d.ts","../../node_modules/.bun/kysely@0.28.3/node_modules/kysely/dist/esm/index.d.ts","../../node_modules/.bun/better-call@1.0.12/node_modules/better-call/dist/router-bep4ze3q.d.ts","../../node_modules/.bun/better-call@1.0.12/node_modules/better-call/dist/index.d.ts","../../node_modules/.bun/better-auth@1.3.2/node_modules/better-auth/dist/shared/better-auth.zsfsbnqt.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/types.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jwe/compact/decrypt.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jwe/general/decrypt.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jwe/general/encrypt.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jws/compact/verify.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jws/flattened/verify.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jws/general/verify.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jwt/verify.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jwt/decrypt.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jwt/produce.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jwe/compact/encrypt.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jws/compact/sign.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jws/flattened/sign.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jws/general/sign.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jwt/sign.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jwt/encrypt.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jwk/thumbprint.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jwk/embedded.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jwks/local.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jwks/remote.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/jwt/unsecured.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/key/export.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/key/import.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/util/decode_protected_header.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/util/decode_jwt.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/util/errors.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/key/generate_key_pair.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/key/generate_secret.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/util/base64url.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/util/runtime.d.ts","../../node_modules/.bun/jose@5.10.0/node_modules/jose/dist/types/index.d.ts","../../node_modules/.bun/better-auth@1.3.2/node_modules/better-auth/dist/shared/better-auth.dpa2nz5l.d.ts","../../node_modules/.bun/better-auth@1.3.2/node_modules/better-auth/dist/shared/better-auth.dj2hyomw.d.ts","../../node_modules/.bun/@better-fetch+fetch@1.1.18/node_modules/@better-fetch/fetch/dist/index.d.ts","../../node_modules/.bun/nanostores@0.11.4/node_modules/nanostores/atom/index.d.ts","../../node_modules/.bun/nanostores@0.11.4/node_modules/nanostores/map/index.d.ts","../../node_modules/.bun/nanostores@0.11.4/node_modules/nanostores/map-creator/index.d.ts","../../node_modules/.bun/nanostores@0.11.4/node_modules/nanostores/clean-stores/index.d.ts","../../node_modules/.bun/nanostores@0.11.4/node_modules/nanostores/task/index.d.ts","../../node_modules/.bun/nanostores@0.11.4/node_modules/nanostores/computed/index.d.ts","../../node_modules/.bun/nanostores@0.11.4/node_modules/nanostores/deep-map/path.d.ts","../../node_modules/.bun/nanostores@0.11.4/node_modules/nanostores/deep-map/index.d.ts","../../node_modules/.bun/nanostores@0.11.4/node_modules/nanostores/keep-mount/index.d.ts","../../node_modules/.bun/nanostores@0.11.4/node_modules/nanostores/lifecycle/index.d.ts","../../node_modules/.bun/nanostores@0.11.4/node_modules/nanostores/listen-keys/index.d.ts","../../node_modules/.bun/nanostores@0.11.4/node_modules/nanostores/index.d.ts","../../node_modules/.bun/better-auth@1.3.2/node_modules/better-auth/dist/shared/better-auth.b_g094aj.d.ts","../../node_modules/.bun/better-auth@1.3.2/node_modules/better-auth/dist/shared/better-auth.dehjp1rk.d.ts","../../node_modules/.bun/better-auth@1.3.2/node_modules/better-auth/dist/shared/better-auth.bwe61noi.d.ts","../../node_modules/.bun/better-auth@1.3.2/node_modules/better-auth/dist/index.d.ts","../../node_modules/.bun/better-auth@1.3.2/node_modules/better-auth/dist/adapters/drizzle-adapter/index.d.ts","../../node_modules/.bun/postgres@3.4.7/node_modules/postgres/types/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/entity.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/logger.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/casing.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/table.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/operations.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/subquery.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/query-builders/select.types.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sql/sql.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/utils.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sql/expressions/conditions.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sql/expressions/select.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sql/expressions/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sql/functions/aggregate.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/query-builders/query-builder.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sql/functions/vector.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sql/functions/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sql/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/checks.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/sequence.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/int.common.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/bigintt.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/boolean.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/bytes.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/custom.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/date-duration.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/decimal.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/double-precision.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/duration.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/integer.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/json.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/date.common.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/localdate.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/localtime.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/real.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/relative-duration.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/smallint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/text.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/timestamp.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/timestamptz.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/uuid.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/all.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/indexes.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/roles.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/policies.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/primary-keys.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/unique-constraint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/table.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/foreign-keys.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/common.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/bigint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/columns/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/view-base.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/cache/core/types.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/relations.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/session.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/query-builders/count.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/query-promise.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/runnable-query.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/query-builders/query.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/query-builders/raw.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/subquery.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/db.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/session.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/query-builders/delete.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/query-builders/update.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/query-builders/insert.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/query-builders/refresh-materialized-view.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/query-builders/select.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/query-builders/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/dialect.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/query-builders/query-builder.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/view-common.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/view.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/query-builders/select.types.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/alias.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/schema.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/utils.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/gel-core/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/checks.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/binary.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/boolean.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/char.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/custom.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/date.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/datetime.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/decimal.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/double.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/enum.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/float.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/int.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/json.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/mediumint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/real.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/serial.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/smallint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/text.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/time.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/date.common.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/timestamp.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/tinyint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/varbinary.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/varchar.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/year.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/all.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/indexes.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/primary-keys.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/unique-constraint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/table.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/foreign-keys.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/common.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/bigint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/columns/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/migrator.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/query-builders/delete.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/subquery.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/view-base.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/query-builders/select.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/query-builders/query-builder.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/query-builders/update.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/query-builders/insert.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/dialect.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/query-builders/count.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/query-builders/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/query-builders/query.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/db.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/session.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/view-common.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/view.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/query-builders/select.types.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/alias.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/schema.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/utils.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/mysql-core/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/checks.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/bigserial.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/boolean.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/char.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/cidr.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/custom.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/date.common.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/date.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/double-precision.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/inet.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/sequence.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/int.common.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/integer.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/timestamp.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/interval.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/json.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/jsonb.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/line.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/macaddr.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/macaddr8.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/numeric.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/point.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/postgis_extension/geometry.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/real.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/serial.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/smallint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/smallserial.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/text.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/time.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/uuid.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/varchar.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/vector_extension/bit.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/vector_extension/halfvec.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/vector_extension/sparsevec.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/vector_extension/vector.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/all.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/indexes.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/roles.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/policies.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/primary-keys.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/unique-constraint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/table.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/foreign-keys.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/common.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/bigint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/enum.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/columns/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/view-base.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/session.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/query-builders/delete.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/query-builders/update.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/query-builders/insert.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/query-builders/refresh-materialized-view.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/subquery.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/query-builders/select.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/query-builders/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/dialect.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/query-builders/query-builder.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/view-common.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/view.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/query-builders/select.types.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/alias.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/schema.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/utils.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/utils/array.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/utils/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/binary.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/boolean.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/char.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/custom.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/date.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/datetime.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/decimal.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/double.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/enum.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/float.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/int.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/json.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/mediumint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/real.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/serial.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/smallint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/text.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/time.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/date.common.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/timestamp.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/tinyint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/varbinary.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/varchar.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/vector.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/year.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/all.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/indexes.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/primary-keys.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/unique-constraint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/table.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/common.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/bigint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/columns/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/query-builders/delete.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/query-builders/update.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/query-builders/insert.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/dialect.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/cache/core/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore/session.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore/driver.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/query-builders/count.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/subquery.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/query-builders/select.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/query-builders/query-builder.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/query-builders/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/db.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/session.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/query-builders/select.types.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/alias.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/schema.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/utils.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/singlestore-core/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/checks.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/columns/custom.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/indexes.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/primary-keys.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/unique-constraint.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/view-base.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/query-builders/count.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/query-builders/query.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/subquery.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/db.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/query-builders/raw.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/session.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/query-builders/delete.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/query-builders/update.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/query-builders/insert.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/query-builders/select.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/query-builders/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/dialect.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/view.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/utils.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/columns/integer.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/columns/numeric.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/columns/real.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/columns/text.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/columns/all.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/table.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/foreign-keys.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/columns/common.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/columns/blob.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/columns/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/query-builders/select.types.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/alias.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/sqlite-core/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/column-builder.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/column.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/alias.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/errors.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/view-common.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/index.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/cache/core/cache.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/query-builders/count.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/query-builders/query.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/query-builders/raw.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/pg-core/db.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/postgres-js/session.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/postgres-js/driver.d.ts","../../node_modules/.bun/drizzle-orm@0.44.3+8d8af77f431c301f/node_modules/drizzle-orm/postgres-js/index.d.ts","../../packages/db/src/schema.ts","../../packages/db/src/index.ts","../../packages/auth/src/server.ts","../../node_modules/.bun/better-auth@1.3.2/node_modules/better-auth/dist/client/react/index.d.ts","../../packages/auth/src/client.ts","../../packages/auth/src/index.ts","../../node_modules/.bun/better-auth@1.3.2+6dbf9a050bc9aadb/node_modules/better-auth/dist/shared/better-auth.zsfsbnqt.d.ts","../../node_modules/.bun/better-auth@1.3.2+6dbf9a050bc9aadb/node_modules/better-auth/dist/shared/better-auth.dpa2nz5l.d.ts","../../node_modules/.bun/better-auth@1.3.2+6dbf9a050bc9aadb/node_modules/better-auth/dist/shared/better-auth.dj2hyomw.d.ts","../../node_modules/.bun/better-auth@1.3.2+6dbf9a050bc9aadb/node_modules/better-auth/dist/integrations/next-js.d.ts","./src/app/api/auth/[...all]/route.ts","./src/app/api/health/route.ts","../../node_modules/.bun/botid@1.4.2+39dd938b2b570c60/node_modules/botid/dist/server/index.d.ts","../../node_modules/nanoid/index.d.ts","../../node_modules/.bun/@upstash+redis@1.35.1/node_modules/@upstash/redis/zmscore-bsheakn7.d.mts","../../node_modules/.bun/@upstash+redis@1.35.1/node_modules/@upstash/redis/nodejs.d.mts","../../node_modules/.bun/@upstash+core-analytics@0.0.10/node_modules/@upstash/core-analytics/dist/index.d.ts","../../node_modules/.bun/@upstash+ratelimit@2.0.5+eb344dddf3a10dc0/node_modules/@upstash/ratelimit/dist/index.d.ts","./src/lib/rate-limit.ts","./src/app/api/waitlist/route.ts","./src/app/api/waitlist/token/route.ts","../../node_modules/.bun/feed@5.1.0/node_modules/feed/lib/feed.d.ts","./src/app/rss.xml/route.ts","../../node_modules/.bun/lucide-react@0.468.0+f4eacebf2041cd4f/node_modules/lucide-react/dist/lucide-react.d.ts","../../node_modules/.bun/zustand@5.0.6+0e2fb8dbc083adda/node_modules/zustand/esm/vanilla.d.mts","../../node_modules/.bun/zustand@5.0.6+0e2fb8dbc083adda/node_modules/zustand/esm/react.d.mts","../../node_modules/.bun/zustand@5.0.6+0e2fb8dbc083adda/node_modules/zustand/esm/index.d.mts","./src/components/editor/media-panel/store.ts","./src/constants/actions.ts","./src/constants/font-constants.ts","./src/types/project.ts","./src/lib/storage/types.ts","./src/lib/storage/indexeddb-adapter.ts","./src/lib/storage/opfs-adapter.ts","./src/lib/storage/storage-service.ts","./src/types/editor.ts","./src/stores/editor-store.ts","../../node_modules/.bun/sonner@1.7.4+6dbf9a050bc9aadb/node_modules/sonner/dist/index.d.ts","../../node_modules/.bun/clsx@2.1.1/node_modules/clsx/clsx.d.mts","../../node_modules/.bun/tailwind-merge@2.6.0/node_modules/tailwind-merge/dist/types.d.ts","./src/lib/utils.ts","./src/stores/project-store.ts","./src/lib/timeline.ts","./src/stores/timeline-store.ts","./src/stores/media-store.ts","./src/types/timeline.ts","./src/constants/timeline-constants.ts","./src/data/colors.ts","./src/hooks/use-aspect-ratio.ts","./src/hooks/use-drag-drop.ts","./src/types/playback.ts","./src/stores/playback-store.ts","./src/hooks/use-editor-actions.ts","../../node_modules/.bun/zustand@5.0.6+0e2fb8dbc083adda/node_modules/zustand/esm/middleware/redux.d.mts","../../node_modules/.bun/zustand@5.0.6+0e2fb8dbc083adda/node_modules/zustand/esm/middleware/devtools.d.mts","../../node_modules/.bun/zustand@5.0.6+0e2fb8dbc083adda/node_modules/zustand/esm/middleware/subscribewithselector.d.mts","../../node_modules/.bun/zustand@5.0.6+0e2fb8dbc083adda/node_modules/zustand/esm/middleware/combine.d.mts","../../node_modules/.bun/zustand@5.0.6+0e2fb8dbc083adda/node_modules/zustand/esm/middleware/persist.d.mts","../../node_modules/.bun/zustand@5.0.6+0e2fb8dbc083adda/node_modules/zustand/esm/middleware.d.mts","./src/types/keybinding.ts","./src/stores/keybindings-store.ts","./src/hooks/use-keybinding-conflicts.ts","./src/hooks/use-keybindings.ts","./src/hooks/use-keyboard-shortcuts-help.ts","./src/hooks/use-playback-controls.ts","./src/hooks/use-selection-box.ts","./src/hooks/use-timeline-element-resize.ts","./src/hooks/use-timeline-playhead.ts","./src/hooks/use-timeline-snapping.ts","./src/hooks/use-timeline-zoom.ts","../../node_modules/.bun/@radix-ui+react-accessible-icon@1.1.7+b41f8805ee63d2ff/node_modules/@radix-ui/react-accessible-icon/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-context@1.1.2+0e2fb8dbc083adda/node_modules/@radix-ui/react-context/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-primitive@2.1.3+b41f8805ee63d2ff/node_modules/@radix-ui/react-primitive/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-collapsible@1.1.11+b41f8805ee63d2ff/node_modules/@radix-ui/react-collapsible/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-accordion@1.2.11+b41f8805ee63d2ff/node_modules/@radix-ui/react-accordion/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-dismissable-layer@1.1.10+b41f8805ee63d2ff/node_modules/@radix-ui/react-dismissable-layer/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-focus-scope@1.1.7+b41f8805ee63d2ff/node_modules/@radix-ui/react-focus-scope/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-portal@1.1.9+b41f8805ee63d2ff/node_modules/@radix-ui/react-portal/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-dialog@1.1.14+b41f8805ee63d2ff/node_modules/@radix-ui/react-dialog/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-alert-dialog@1.1.14+b41f8805ee63d2ff/node_modules/@radix-ui/react-alert-dialog/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-aspect-ratio@1.1.7+b41f8805ee63d2ff/node_modules/@radix-ui/react-aspect-ratio/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-avatar@1.1.10+b41f8805ee63d2ff/node_modules/@radix-ui/react-avatar/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-checkbox@1.3.2+b41f8805ee63d2ff/node_modules/@radix-ui/react-checkbox/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-arrow@1.1.7+b41f8805ee63d2ff/node_modules/@radix-ui/react-arrow/dist/index.d.mts","../../node_modules/.bun/@radix-ui+rect@1.1.1/node_modules/@radix-ui/rect/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-popper@1.2.7+b41f8805ee63d2ff/node_modules/@radix-ui/react-popper/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-roving-focus@1.1.10+b41f8805ee63d2ff/node_modules/@radix-ui/react-roving-focus/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-menu@2.1.15+b41f8805ee63d2ff/node_modules/@radix-ui/react-menu/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-context-menu@2.2.15+b41f8805ee63d2ff/node_modules/@radix-ui/react-context-menu/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-direction@1.1.1+0e2fb8dbc083adda/node_modules/@radix-ui/react-direction/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-dropdown-menu@2.1.15+b41f8805ee63d2ff/node_modules/@radix-ui/react-dropdown-menu/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-label@2.1.7+b41f8805ee63d2ff/node_modules/@radix-ui/react-label/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-form@0.1.7+b41f8805ee63d2ff/node_modules/@radix-ui/react-form/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-hover-card@1.1.14+b41f8805ee63d2ff/node_modules/@radix-ui/react-hover-card/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-menubar@1.1.15+b41f8805ee63d2ff/node_modules/@radix-ui/react-menubar/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-visually-hidden@1.2.3+b41f8805ee63d2ff/node_modules/@radix-ui/react-visually-hidden/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-navigation-menu@1.2.13+b41f8805ee63d2ff/node_modules/@radix-ui/react-navigation-menu/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-one-time-password-field@0.1.7+b41f8805ee63d2ff/node_modules/@radix-ui/react-one-time-password-field/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-password-toggle-field@0.1.2+b41f8805ee63d2ff/node_modules/@radix-ui/react-password-toggle-field/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-popover@1.1.14+b41f8805ee63d2ff/node_modules/@radix-ui/react-popover/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-progress@1.1.7+b41f8805ee63d2ff/node_modules/@radix-ui/react-progress/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-radio-group@1.3.7+b41f8805ee63d2ff/node_modules/@radix-ui/react-radio-group/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-scroll-area@1.2.9+b41f8805ee63d2ff/node_modules/@radix-ui/react-scroll-area/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-select@2.2.5+b41f8805ee63d2ff/node_modules/@radix-ui/react-select/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-separator@1.1.7+b41f8805ee63d2ff/node_modules/@radix-ui/react-separator/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-slider@1.3.5+b41f8805ee63d2ff/node_modules/@radix-ui/react-slider/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-slot@1.2.3+0e2fb8dbc083adda/node_modules/@radix-ui/react-slot/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-switch@1.2.5+b41f8805ee63d2ff/node_modules/@radix-ui/react-switch/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-tabs@1.1.12+b41f8805ee63d2ff/node_modules/@radix-ui/react-tabs/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-toast@1.2.14+b41f8805ee63d2ff/node_modules/@radix-ui/react-toast/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-toggle@1.1.9+b41f8805ee63d2ff/node_modules/@radix-ui/react-toggle/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-toggle-group@1.1.10+b41f8805ee63d2ff/node_modules/@radix-ui/react-toggle-group/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-toolbar@1.1.10+b41f8805ee63d2ff/node_modules/@radix-ui/react-toolbar/dist/index.d.mts","../../node_modules/.bun/@radix-ui+react-tooltip@1.2.7+b41f8805ee63d2ff/node_modules/@radix-ui/react-tooltip/dist/index.d.mts","../../node_modules/.bun/radix-ui@1.4.2+b41f8805ee63d2ff/node_modules/radix-ui/dist/index.d.mts","../../node_modules/.bun/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/types.d.ts","../../node_modules/.bun/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/index.d.ts","./src/components/ui/toast.tsx","./src/hooks/use-toast.ts","./src/hooks/auth/uselogin.ts","./src/hooks/auth/usesignup.ts","./src/lib/fetch-github-stars.ts","../../node_modules/.bun/@ffmpeg+ffmpeg@0.12.15/node_modules/@ffmpeg/ffmpeg/dist/esm/types.d.ts","../../node_modules/.bun/@ffmpeg+ffmpeg@0.12.15/node_modules/@ffmpeg/ffmpeg/dist/esm/classes.d.ts","../../node_modules/.bun/@ffmpeg+ffmpeg@0.12.15/node_modules/@ffmpeg/ffmpeg/dist/esm/index.d.ts","../../node_modules/.bun/@ffmpeg+util@0.12.2/node_modules/@ffmpeg/util/dist/cjs/types.d.ts","../../node_modules/.bun/@ffmpeg+util@0.12.2/node_modules/@ffmpeg/util/dist/cjs/index.d.ts","./src/lib/ffmpeg-utils.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/compiled/@next/font/dist/types.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/dist/compiled/@next/font/dist/google/index.d.ts","../../node_modules/.bun/next@15.4.3+6dbf9a050bc9aadb/node_modules/next/font/google/index.d.ts","./src/lib/font-config.ts","./src/lib/media-processing.ts","./src/lib/time.ts","./src/lib/waitlist.ts","./src/stores/panel-store.ts","../../node_modules/.bun/next-themes@0.4.6+6dbf9a050bc9aadb/node_modules/next-themes/dist/index.d.ts","../../node_modules/.bun/@vercel+analytics@1.5.0+39dd938b2b570c60/node_modules/@vercel/analytics/dist/react/index.d.mts","./src/components/ui/sonner.tsx","./src/components/ui/tooltip.tsx","./src/components/storage-provider.tsx","../../node_modules/.bun/botid@1.4.2+39dd938b2b570c60/node_modules/botid/dist/client/index.d.ts","./src/app/layout.tsx","../../node_modules/.bun/motion-utils@12.23.6/node_modules/motion-utils/dist/index.d.ts","../../node_modules/.bun/motion-dom@12.23.6/node_modules/motion-dom/dist/index.d.ts","../../node_modules/.bun/framer-motion@12.23.6+6dbf9a050bc9aadb/node_modules/framer-motion/dist/types.d-bq-qm38r.d.ts","../../node_modules/.bun/framer-motion@12.23.6+6dbf9a050bc9aadb/node_modules/framer-motion/dist/types/index.d.ts","../../node_modules/.bun/motion@12.23.6+6dbf9a050bc9aadb/node_modules/motion/dist/react.d.ts","./src/components/ui/button.tsx","./src/components/ui/sponsor-button.tsx","./src/components/icons.tsx","./src/components/landing/handlebars.tsx","./src/components/landing/hero.tsx","./src/components/header-base.tsx","./src/components/header.tsx","../../node_modules/.bun/react-icons@5.5.0+f4eacebf2041cd4f/node_modules/react-icons/lib/iconsmanifest.d.ts","../../node_modules/.bun/react-icons@5.5.0+f4eacebf2041cd4f/node_modules/react-icons/lib/iconbase.d.ts","../../node_modules/.bun/react-icons@5.5.0+f4eacebf2041cd4f/node_modules/react-icons/lib/iconcontext.d.ts","../../node_modules/.bun/react-icons@5.5.0+f4eacebf2041cd4f/node_modules/react-icons/lib/index.d.ts","../../node_modules/.bun/react-icons@5.5.0+f4eacebf2041cd4f/node_modules/react-icons/ri/index.d.ts","../../node_modules/.bun/react-icons@5.5.0+f4eacebf2041cd4f/node_modules/react-icons/fa6/index.d.ts","./src/components/footer.tsx","./src/app/page.tsx","./src/components/ui/card.tsx","./src/components/ui/input.tsx","./src/components/ui/label.tsx","./src/components/ui/separator.tsx","./src/components/ui/alert.tsx","./src/app/(auth)/login/page.tsx","./src/app/(auth)/signup/page.tsx","./src/components/ui/avatar.tsx","./src/app/blog/page.tsx","./src/components/ui/prose.tsx","./src/app/blog/[slug]/page.tsx","./src/components/ui/badge.tsx","./src/app/contributors/page.tsx","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/panel.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/types.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/panelgroup.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/panelresizehandleregistry.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/panelresizehandle.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/constants.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/utils/assert.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/utils/csp.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/utils/cursor.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/utils/dom/getpanelelement.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/utils/dom/getpanelelementsforgroup.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/utils/dom/getpanelgroupelement.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/utils/dom/getresizehandleelement.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/utils/dom/getresizehandleelementindex.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/utils/dom/getresizehandleelementsforgroup.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/utils/dom/getresizehandlepanelids.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/utils/rects/types.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/utils/rects/getintersectingrectangle.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/utils/rects/intersects.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/declarations/src/index.d.ts","../../node_modules/.bun/react-resizable-panels@2.1.9+6dbf9a050bc9aadb/node_modules/react-resizable-panels/dist/react-resizable-panels.cjs.d.mts","./src/components/ui/resizable.tsx","./src/components/editor/media-panel/tabbar.tsx","./src/components/editor/media-panel/drag-overlay.tsx","./src/components/ui/context-menu.tsx","./src/components/ui/select.tsx","./src/components/ui/aspect-ratio.tsx","./src/components/ui/draggable-item.tsx","./src/components/editor/media-panel/views/media.tsx","./src/components/editor/media-panel/views/text.tsx","./src/components/editor/media-panel/views/audio.tsx","./src/components/editor/media-panel/index.tsx","./src/components/ui/scroll-area.tsx","./src/components/editor/properties-panel/audio-properties.tsx","./src/components/editor/properties-panel/media-properties.tsx","./src/components/ui/textarea.tsx","./src/components/ui/font-picker.tsx","./src/components/ui/slider.tsx","./src/components/editor/properties-panel/property-item.tsx","./src/components/editor/properties-panel/text-properties.tsx","./src/components/editor/properties-panel/index.tsx","../../node_modules/.bun/wavesurfer.js@7.10.0/node_modules/wavesurfer.js/dist/event-emitter.d.ts","../../node_modules/.bun/wavesurfer.js@7.10.0/node_modules/wavesurfer.js/dist/base-plugin.d.ts","../../node_modules/.bun/wavesurfer.js@7.10.0/node_modules/wavesurfer.js/dist/dom.d.ts","../../node_modules/.bun/wavesurfer.js@7.10.0/node_modules/wavesurfer.js/dist/player.d.ts","../../node_modules/.bun/wavesurfer.js@7.10.0/node_modules/wavesurfer.js/dist/wavesurfer.d.ts","./src/components/editor/audio-waveform.tsx","./src/components/ui/dropdown-menu.tsx","./src/components/editor/timeline/timeline-element.tsx","./src/components/editor/timeline/timeline-track.tsx","./src/components/editor/timeline/timeline-playhead.tsx","./src/components/editor/selection-box.tsx","./src/components/editor/snap-indicator.tsx","./src/components/editor/timeline/index.tsx","./src/components/ui/video-player.tsx","./src/components/ui/audio-player.tsx","./src/components/ui/popover.tsx","./src/components/background-settings.tsx","./src/components/editor/preview-panel.tsx","./src/components/ui/dialog.tsx","./src/components/keyboard-shortcuts-help.tsx","./src/components/editor-header.tsx","./src/components/editor-provider.tsx","../../node_modules/.bun/@types+mdast@4.0.4/node_modules/@types/mdast/index.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/state.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/footer.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/blockquote.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/break.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/code.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/delete.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/emphasis.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/footnote-reference.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/heading.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/html.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/image-reference.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/image.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/inline-code.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/link-reference.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/link.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/list-item.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/list.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/paragraph.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/root.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/strong.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/table.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/table-cell.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/table-row.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/text.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/thematic-break.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/index.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/index.d.ts","../../node_modules/.bun/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/index.d.ts","../../node_modules/.bun/remark-rehype@11.1.2/node_modules/remark-rehype/lib/index.d.ts","../../node_modules/.bun/remark-rehype@11.1.2/node_modules/remark-rehype/index.d.ts","../../node_modules/.bun/react-markdown@10.1.0+0e2fb8dbc083adda/node_modules/react-markdown/lib/index.d.ts","../../node_modules/.bun/react-markdown@10.1.0+0e2fb8dbc083adda/node_modules/react-markdown/index.d.ts","./src/components/onboarding.tsx","./src/app/editor/[project_id]/page.tsx","./src/app/privacy/page.tsx","./src/components/delete-project-dialog.tsx","./src/components/rename-project-dialog.tsx","./src/components/ui/checkbox.tsx","./src/components/ui/skeleton.tsx","./src/app/projects/page.tsx","./src/app/roadmap/page.tsx","./src/app/terms/page.tsx","./src/app/why-not-capcut/page.tsx","./src/components/editor/speed-control.tsx","./src/components/ui/accordion.tsx","./src/components/ui/alert-dialog.tsx","./src/components/ui/breadcrumb.tsx","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/locale/types.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/fp/types.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/types.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/add.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/addbusinessdays.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/adddays.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/addhours.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/addisoweekyears.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/addmilliseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/addminutes.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/addmonths.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/addquarters.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/addseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/addweeks.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/addyears.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/areintervalsoverlapping.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/clamp.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/closestindexto.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/closestto.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/compareasc.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/comparedesc.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/constructfrom.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/constructnow.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/daystoweeks.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceinbusinessdays.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceincalendardays.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceincalendarisoweekyears.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceincalendarisoweeks.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceincalendarmonths.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceincalendarquarters.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceincalendarweeks.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceincalendaryears.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceindays.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceinhours.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceinisoweekyears.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceinmilliseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceinminutes.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceinmonths.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceinquarters.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceinseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceinweeks.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/differenceinyears.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/eachdayofinterval.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/eachhourofinterval.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/eachminuteofinterval.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/eachmonthofinterval.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/eachquarterofinterval.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/eachweekofinterval.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/eachweekendofinterval.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/eachweekendofmonth.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/eachweekendofyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/eachyearofinterval.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/endofday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/endofdecade.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/endofhour.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/endofisoweek.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/endofisoweekyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/endofminute.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/endofmonth.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/endofquarter.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/endofsecond.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/endoftoday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/endoftomorrow.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/endofweek.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/endofyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/endofyesterday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/_lib/format/formatters.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/_lib/format/longformatters.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/format.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/formatdistance.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/formatdistancestrict.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/formatdistancetonow.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/formatdistancetonowstrict.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/formatduration.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/formatiso.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/formatiso9075.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/formatisoduration.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/formatrfc3339.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/formatrfc7231.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/formatrelative.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/fromunixtime.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getdate.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getdayofyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getdaysinmonth.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getdaysinyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getdecade.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/_lib/defaultoptions.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getdefaultoptions.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/gethours.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getisoday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getisoweek.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getisoweekyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getisoweeksinyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getmilliseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getminutes.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getmonth.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getoverlappingdaysinintervals.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getquarter.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/gettime.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getunixtime.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getweek.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getweekofmonth.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getweekyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getweeksinmonth.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/getyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/hourstomilliseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/hourstominutes.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/hourstoseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/interval.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/intervaltoduration.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/intlformat.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/intlformatdistance.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isafter.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isbefore.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isdate.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isequal.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isexists.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isfirstdayofmonth.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isfriday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isfuture.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/islastdayofmonth.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isleapyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/ismatch.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/ismonday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/ispast.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/issameday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/issamehour.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/issameisoweek.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/issameisoweekyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/issameminute.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/issamemonth.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/issamequarter.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/issamesecond.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/issameweek.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/issameyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/issaturday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/issunday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isthishour.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isthisisoweek.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isthisminute.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isthismonth.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isthisquarter.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isthissecond.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isthisweek.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isthisyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isthursday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/istoday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/istomorrow.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/istuesday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isvalid.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/iswednesday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isweekend.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/iswithininterval.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/isyesterday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/lastdayofdecade.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/lastdayofisoweek.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/lastdayofisoweekyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/lastdayofmonth.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/lastdayofquarter.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/lastdayofweek.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/lastdayofyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/_lib/format/lightformatters.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/lightformat.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/max.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/milliseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/millisecondstohours.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/millisecondstominutes.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/millisecondstoseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/min.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/minutestohours.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/minutestomilliseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/minutestoseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/monthstoquarters.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/monthstoyears.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/nextday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/nextfriday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/nextmonday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/nextsaturday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/nextsunday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/nextthursday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/nexttuesday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/nextwednesday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/parse/_lib/types.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/parse/_lib/setter.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/parse/_lib/parser.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/parse/_lib/parsers.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/parse.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/parseiso.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/parsejson.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/previousday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/previousfriday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/previousmonday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/previoussaturday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/previoussunday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/previousthursday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/previoustuesday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/previouswednesday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/quarterstomonths.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/quarterstoyears.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/roundtonearesthours.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/roundtonearestminutes.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/secondstohours.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/secondstomilliseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/secondstominutes.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/set.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/setdate.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/setday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/setdayofyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/setdefaultoptions.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/sethours.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/setisoday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/setisoweek.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/setisoweekyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/setmilliseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/setminutes.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/setmonth.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/setquarter.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/setseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/setweek.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/setweekyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/setyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/startofday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/startofdecade.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/startofhour.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/startofisoweek.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/startofisoweekyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/startofminute.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/startofmonth.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/startofquarter.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/startofsecond.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/startoftoday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/startoftomorrow.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/startofweek.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/startofweekyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/startofyear.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/startofyesterday.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/sub.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/subbusinessdays.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/subdays.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/subhours.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/subisoweekyears.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/submilliseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/subminutes.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/submonths.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/subquarters.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/subseconds.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/subweeks.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/subyears.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/todate.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/transpose.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/weekstodays.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/yearstodays.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/yearstomonths.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/yearstoquarters.d.ts","../../node_modules/.bun/date-fns@3.6.0/node_modules/date-fns/index.d.mts","../../node_modules/.bun/react-day-picker@8.10.1+97355278ff284068/node_modules/react-day-picker/dist/index.d.ts","./src/components/ui/calendar.tsx","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/alignment.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/noderects.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/axis.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/slidestoscroll.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/limit.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/scrollcontain.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/dragtracker.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/utils.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/animations.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/counter.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/eventhandler.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/eventstore.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/percentofview.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/resizehandler.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/vector1d.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/scrollbody.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/scrollbounds.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/scrolllooper.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/scrollprogress.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/slideregistry.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/scrolltarget.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/scrollto.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/slidefocus.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/translate.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/slidelooper.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/slideshandler.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/slidesinview.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/engine.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/optionshandler.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/plugins.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/emblacarousel.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/draghandler.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/components/options.d.ts","../../node_modules/.bun/embla-carousel@8.6.0/node_modules/embla-carousel/esm/index.d.ts","../../node_modules/.bun/embla-carousel-react@8.6.0+f4eacebf2041cd4f/node_modules/embla-carousel-react/esm/components/useemblacarousel.d.ts","../../node_modules/.bun/embla-carousel-react@8.6.0+f4eacebf2041cd4f/node_modules/embla-carousel-react/esm/index.d.ts","./src/components/ui/carousel.tsx","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/container/surface.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/container/layer.d.ts","../../node_modules/.bun/@types+d3-time@3.0.4/node_modules/@types/d3-time/index.d.ts","../../node_modules/.bun/@types+d3-scale@4.0.9/node_modules/@types/d3-scale/index.d.ts","../../node_modules/.bun/victory-vendor@36.9.2/node_modules/victory-vendor/d3-scale.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/cartesian/xaxis.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/cartesian/yaxis.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/util/types.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/component/defaultlegendcontent.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/util/payload/getuniqpayload.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/component/legend.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/component/defaulttooltipcontent.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/component/tooltip.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/component/responsivecontainer.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/component/cell.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/component/text.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/component/label.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/component/labellist.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/component/customized.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/shape/sector.d.ts","../../node_modules/.bun/@types+d3-path@3.1.1/node_modules/@types/d3-path/index.d.ts","../../node_modules/.bun/@types+d3-shape@3.1.7/node_modules/@types/d3-shape/index.d.ts","../../node_modules/.bun/victory-vendor@36.9.2/node_modules/victory-vendor/d3-shape.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/shape/curve.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/shape/rectangle.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/shape/polygon.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/shape/dot.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/shape/cross.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/shape/symbols.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/polar/polargrid.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/polar/polarradiusaxis.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/polar/polarangleaxis.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/polar/pie.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/polar/radar.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/polar/radialbar.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/cartesian/brush.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/util/ifoverflowmatches.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/cartesian/referenceline.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/cartesian/referencedot.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/cartesian/referencearea.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/cartesian/cartesianaxis.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/cartesian/cartesiangrid.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/cartesian/line.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/cartesian/area.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/util/barutils.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/cartesian/bar.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/cartesian/zaxis.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/cartesian/errorbar.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/cartesian/scatter.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/util/getlegendprops.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/util/chartutils.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/chart/accessibilitymanager.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/chart/types.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/chart/generatecategoricalchart.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/chart/linechart.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/chart/barchart.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/chart/piechart.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/chart/treemap.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/chart/sankey.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/chart/radarchart.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/chart/scatterchart.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/chart/areachart.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/chart/radialbarchart.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/chart/composedchart.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/chart/sunburstchart.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/shape/trapezoid.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/numberaxis/funnel.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/chart/funnelchart.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/util/global.d.ts","../../node_modules/.bun/recharts@2.15.4+6dbf9a050bc9aadb/node_modules/recharts/types/index.d.ts","./src/components/ui/chart.tsx","./src/components/ui/collapsible.tsx","../../node_modules/@radix-ui/react-dialog/dist/index.d.mts","../../node_modules/.bun/cmdk@1.1.1+b41f8805ee63d2ff/node_modules/cmdk/dist/index.d.ts","./src/components/ui/command.tsx","../../node_modules/.bun/vaul@1.1.2+b41f8805ee63d2ff/node_modules/vaul/dist/index.d.mts","./src/components/ui/drawer.tsx","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/constants.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/utils/createsubject.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/types/events.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/types/path/common.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/types/path/eager.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/types/path/index.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/types/fieldarray.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/types/resolvers.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/types/form.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/types/utils.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/types/fields.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/types/errors.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/types/validator.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/types/controller.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/types/index.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/controller.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/form.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/logic/appenderrors.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/logic/createformcontrol.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/logic/index.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/usecontroller.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/usefieldarray.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/useform.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/useformcontext.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/useformstate.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/usewatch.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/utils/get.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/utils/set.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/utils/index.d.ts","../../node_modules/.bun/react-hook-form@7.60.0+f4eacebf2041cd4f/node_modules/react-hook-form/dist/index.d.ts","./src/components/ui/form.tsx","./src/components/ui/hover-card.tsx","./src/components/ui/image-timeline-treatment.tsx","../../node_modules/.bun/input-otp@1.4.2+6dbf9a050bc9aadb/node_modules/input-otp/dist/index.d.ts","./src/components/ui/input-otp.tsx","./src/components/ui/menubar.tsx","./src/components/ui/navigation-menu.tsx","./src/components/ui/pagination.tsx","../../node_modules/.bun/libphonenumber-js@1.12.10/node_modules/libphonenumber-js/types.d.ts","../../node_modules/.bun/libphonenumber-js@1.12.10/node_modules/libphonenumber-js/core/index.d.ts","../../node_modules/.bun/libphonenumber-js@1.12.10/node_modules/libphonenumber-js/min/index.d.ts","../../node_modules/.bun/react-phone-number-input@3.4.12+6dbf9a050bc9aadb/node_modules/react-phone-number-input/index.d.ts","../../node_modules/.bun/react-phone-number-input@3.4.12+6dbf9a050bc9aadb/node_modules/react-phone-number-input/flags/index.d.ts","./src/components/ui/phone-input.tsx","./src/components/ui/progress.tsx","./src/components/ui/radio-group.tsx","./src/components/ui/sheet.tsx","./src/hooks/use-mobile.tsx","./src/components/ui/sidebar.tsx","./src/components/ui/switch.tsx","./src/components/ui/table.tsx","./src/components/ui/tabs.tsx","./src/components/ui/toaster.tsx","./src/components/ui/toggle.tsx","./src/components/ui/toggle-group.tsx","./.next/types/cache-life.d.ts","./.next/types/app/layout.ts","./.next/types/app/page.ts","./.next/types/app/editor/[project_id]/page.ts","./.next/types/app/projects/page.ts","../../node_modules/.bun/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/globals.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/s3.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/fetch.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/bun.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/globals.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/s3.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/fetch.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/bun.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/extensions.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/devserver.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/ffi.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/html-rewriter.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/jsc.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/sqlite.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/test.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/wasm.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/overrides.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/deprecated.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/redis.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/shell.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/experimental.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/bun.ns.d.ts","../../node_modules/.bun/bun-types@1.2.18+fccada1f982c16e9/node_modules/bun-types/index.d.ts","../../node_modules/.bun/@types+bun@1.2.18+fccada1f982c16e9/node_modules/@types/bun/index.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/extensions.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/devserver.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/ffi.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/html-rewriter.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/jsc.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/sqlite.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/test.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/wasm.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/overrides.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/deprecated.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/redis.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/shell.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/experimental.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/bun.ns.d.ts","../../node_modules/.bun/bun-types@1.2.19+fccada1f982c16e9/node_modules/bun-types/index.d.ts","../../node_modules/.bun/@types+bun@1.2.19+fccada1f982c16e9/node_modules/@types/bun/index.d.ts","../../node_modules/.bun/pg-types@2.2.0/node_modules/pg-types/index.d.ts","../../node_modules/.bun/pg-protocol@1.10.3/node_modules/pg-protocol/dist/messages.d.ts","../../node_modules/.bun/pg-protocol@1.10.3/node_modules/pg-protocol/dist/serializer.d.ts","../../node_modules/.bun/pg-protocol@1.10.3/node_modules/pg-protocol/dist/parser.d.ts","../../node_modules/.bun/pg-protocol@1.10.3/node_modules/pg-protocol/dist/index.d.ts","../../node_modules/.bun/@types+pg@8.15.4/node_modules/@types/pg/lib/type-overrides.d.ts","../../node_modules/.bun/@types+pg@8.15.4/node_modules/@types/pg/index.d.ts","../../node_modules/@types/d3-array/index.d.ts","../../node_modules/@types/d3-color/index.d.ts","../../node_modules/@types/d3-ease/index.d.ts","../../node_modules/@types/d3-interpolate/index.d.ts","../../node_modules/@types/d3-path/index.d.ts","../../node_modules/@types/d3-scale/index.d.ts","../../node_modules/@types/d3-shape/index.d.ts","../../node_modules/@types/d3-time/index.d.ts","../../node_modules/@types/d3-timer/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/use-sync-external-store/index.d.ts"],"fileIdsList":[[88,130,331,1616,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,331,1485,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,331,1505,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,331,1622,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,435,436,437,438,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[82,88,130,181,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,485,486,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,485,488,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,459,468,1366,1462,1491,1493,1506,1507,1508,1509,1510,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,459,468,1366,1463,1491,1493,1506,1507,1508,1509,1510,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1348,1352,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,481,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,135,453,481,532,602,1344,1355,1356,1361,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,135,453,481,602,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,457,468,485,667,1497,1509,1515,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,457,459,485,667,1497,1506,1513,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,459,485,1366,1491,1493,1497,1506,1513,1517,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,468,1384,1407,1478,1540,1550,1559,1572,1577,1580,1581,1615,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,471,602,605,1474,1479,1480,1481,1482,1483,1484,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,485,604,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,485,604,1495,1497,1504,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,459,485,1493,1497,1504,1506,1517,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,457,459,468,1366,1373,1384,1386,1491,1506,1507,1544,1566,1618,1619,1620,1621,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,459,485,1383,1493,1497,1504,1517,1614,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,604,667,1364,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,485,604,667,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1497,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,457,1366,1383,1384,1390,1491,1493,1575,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1383,1491,1578,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,459,1366,1384,1386,1476,1491,1496,1507,1579,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1379,1395,1405,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1564,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1366,1491,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1370,1541,1547,1548,1549,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1366,1369,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1370,1383,1491,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1507,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1380,1384,1386,1387,1392,1475,1491,1507,1542,1543,1544,1546,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1386,1388,1389,1546,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1379,1383,1384,1386,1387,1388,1391,1394,1474,1476,1491,1566,1573,1574,1576,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1388,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1384,1386,1387,1389,1391,1508,1544,1551,1552,1553,1558,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1383,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1372,1386,1388,1507,1554,1555,1556,1557,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1388,1389,1411,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1394,1491,1508,1556,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1380,1384,1386,1387,1388,1389,1394,1408,1411,1412,1475,1482,1491,1543,1551,1556,1568,1569,1570,1571,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1380,1386,1387,1388,1389,1394,1409,1491,1543,1565,1566,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1388,1389,1410,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1380,1384,1386,1387,1388,1389,1394,1411,1567,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,457,459,1464,1490,1502,1503,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1383,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,457,459,1366,1491,1496,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1380,1383,1403,1406,1491,1578,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1490,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,457,459,1366,1490,1491,1492,1493,1494,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1491,1578,1614,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1491,1507,1578,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1377,1380,1384,1387,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1383,1457,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1383,1457,1491,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1383,1459,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1457,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1394,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1383,1457,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1383,1457,1459,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1383,1491,1887,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1383,1491,1924,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1383,1937,1995,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1383,1421,1578,1999,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1383,1457,1459,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1383,1457,1551,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,197,198,199,1366,1383,1394,1482,1491,1545,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1383,2001,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1372,1544,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1383,1457,1508,2032,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1378,1383,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1383,2036,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1383,1491,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1383,1491,1507,1551,1575,2000,2044,2045,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1383,1539,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1383,1447,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1366,1383,1457,1459,1482,1491,1507,1509,1621,2049,2050,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1380,1479,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1460,1461,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1383,1457,1459,2056,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,516,518,532,600,601,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,468,1347,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1379,1386,1387,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1371,1380,1384,1386,1394,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1371,1403,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1380,1386,1394,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1386,1387,1388,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1384,1389,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1388,1389,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1460,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,607,617,648,655,657,661,666,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1467,1469,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1473,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1380,1387,1470,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,602,1358,1360,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1374,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1373,1374,1375,1376,1387,1388,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1373,1388,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1381,1382,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1344,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1369,1378,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1369,1371,1383,1401,1402,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1369,1377,1383,1386,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1369,1401,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1369,1393,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1369,1373,1377,1380,1383,1386,1387,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1369,1377,1379,1380,1383,1384,1385,1387,1388,1389,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1371,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1383,1387,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,513,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1465,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1465,1466,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1468,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1414,1415,1416,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1414,1421,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1415,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1414,1415,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,319,1414,1415,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1414,1415,1430,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1414,1415,1418,1419,1420,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,319,1414,1415,1434,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1414,1415,1418,1420,1428,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1414,1415,1418,1419,1420,1428,1429,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,319,1414,1415,1429,1430,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1414,1415,1418,1438,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1415,1429,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1414,1415,1418,1419,1420,1428,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1414,1415,1426,1427,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1414,1415,1429,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1414,1415,1418,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1414,1415,1429,1453,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1414,1415,1429,1447,1454,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,515,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,517,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,533,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2086,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100,2102],[88,130,1928,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1946,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,608,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,142,162,170,180,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2080,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2096,2097,2098,2099,2100,2104,2105,2108,2109,2110],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100,2110],[88,130,186,197,198,199,346,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,197,198,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,198,346,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,190,196,430,477,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,190,195,430,477,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,183,184,185,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1358,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1358,1359,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1357,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,724,734,985,987,1021,1349,1350,1351,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,724,734,985,987,1349,1350,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,734,1021,1349,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,724,734,985,987,988,1021,1022,1023,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,724,734,985,987,988,1021,1022,1023,1024,1036,1037,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,724,734,985,987,988,1021,1022,1023,1024,1036,1037,1038,1039,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,987,988,1023,1024,1036,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1023,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,724,734,985,987,988,1022,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,734,988,1021,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,986,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,319,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,485,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,125,130,135,143,145,170,174,178,2064,2065,2066,2067,2068,2069,2070,2072,2073,2074,2076,2077,2078,2079,2080,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2096,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,125,130,2064,2065,2066,2067,2068,2069,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,135,153,162,165,170,174,178,2064,2065,2066,2067,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,180,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2075,2076,2077,2078,2079,2080,2081,2082,2083,2084,2085,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,135,143,144,151,170,179,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2096,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,143,2064,2065,2066,2067,2068,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,125,130,135,143,145,170,174,178,2064,2065,2066,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2080,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2096,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,125,130,2064,2065,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2092,2093,2094,2095,2097,2098,2099,2100],[88,125,130,135,153,162,165,170,174,178,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,180,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099,2100,2101],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2093,2094,2095,2097,2098,2099,2100],[88,130,135,143,144,151,165,170,179,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2080,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2099,2100],[88,130,143,2064,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2097,2098,2099,2100],[88,130,1381,1458,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1381,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1421,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1632,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1630,1632,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1630,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1632,1696,1697,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1699,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1700,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1717,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,1766,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1794,1795,1796,1797,1798,1799,1800,1801,1802,1803,1804,1805,1806,1807,1808,1809,1810,1811,1812,1813,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1840,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1854,1855,1856,1857,1858,1859,1860,1861,1862,1863,1864,1865,1866,1867,1868,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1793,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1632,1697,1817,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1630,1814,1815,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1816,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1814,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1630,1631,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,173,180,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,170,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2080,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2096,2097,2098,2099,2100],[81,88,130,170,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2080,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2096,2097,2098,2099,2100],[88,130,1043,1046,1050,1096,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1095,1334,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1335,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1120,1175,1242,1294,1328,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1046,1050,1051,1329,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1089,1094,1116,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1059,1089,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1074,1075,1076,1077,1078,1079,1080,1081,1082,1092,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1062,1091,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1091,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1084,1089,1090,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1089,1091,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1091,1329,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1089,1091,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1074,1075,1076,1077,1078,1079,1080,1081,1082,1091,1092,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1061,1091,1329,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1073,1091,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1073,1089,1091,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1050,1051,1056,1089,1093,1094,1096,1098,1101,1102,1103,1105,1111,1112,1116,1335,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1089,1093,1096,1111,1115,1116,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1089,1093,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1060,1061,1084,1085,1086,1087,1088,1089,1090,1093,1103,1104,1105,1111,1112,1114,1115,1117,1118,1119,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1089,1093,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1085,1089,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1089,1105,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1049,1050,1089,1099,1100,1105,1112,1116,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1106,1107,1108,1109,1110,1113,1116,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1046,1048,1049,1050,1056,1084,1089,1091,1099,1100,1105,1107,1112,1113,1116,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1050,1056,1093,1103,1110,1112,1116,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1089,1096,1099,1100,1105,1112,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1097,1099,1100,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1099,1100,1105,1112,1115,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1049,1050,1051,1056,1089,1093,1094,1095,1099,1100,1103,1105,1112,1116,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1046,1047,1048,1049,1050,1051,1056,1089,1093,1094,1105,1110,1115,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1046,1048,1049,1050,1051,1089,1091,1094,1099,1100,1105,1112,1116,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1061,1089,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1059,1095,1096,1097,1104,1112,1116,1335,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1048,1049,1050,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1046,1060,1083,1084,1086,1087,1088,1090,1091,1329,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1048,1050,1060,1084,1086,1087,1088,1089,1090,1093,1094,1115,1120,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1049,1050,1051,1056,1091,1094,1113,1114,1329,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1044,1046,1047,1048,1051,1059,1096,1099,1329,1330,1331,1332,1333,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1150,1158,1171,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1150,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1141,1142,1143,1144,1145,1153,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1152,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1152,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1150,1151,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1150,1152,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1150,1152,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1141,1142,1143,1144,1145,1152,1153,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1132,1152,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1140,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1050,1051,1096,1150,1157,1158,1163,1164,1165,1166,1168,1171,1335,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1096,1150,1152,1155,1156,1161,1162,1168,1171,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1150,1154,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1121,1147,1148,1149,1150,1151,1154,1157,1163,1165,1167,1168,1169,1170,1172,1173,1174,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1150,1154,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1150,1158,1168,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1050,1051,1099,1150,1152,1163,1168,1171,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1156,1159,1160,1161,1162,1171,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1046,1050,1056,1095,1099,1100,1150,1152,1160,1161,1163,1168,1171,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1157,1159,1163,1171,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1096,1099,1150,1163,1168,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1049,1050,1051,1056,1095,1099,1147,1150,1154,1157,1158,1163,1168,1171,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1046,1047,1048,1049,1050,1051,1056,1150,1154,1158,1159,1168,1170,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1050,1051,1095,1099,1150,1152,1163,1168,1171,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1150,1170,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1095,1096,1163,1167,1171,1335,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1048,1049,1050,1056,1160,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1046,1121,1146,1147,1148,1149,1151,1152,1329,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1048,1121,1147,1148,1149,1150,1151,1158,1159,1170,1175,1334,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1049,1050,1056,1154,1158,1160,1169,1329,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1046,1050,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1217,1223,1236,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1059,1217,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1177,1178,1179,1180,1181,1183,1184,1185,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1220,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1187,1219,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1219,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1219,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1212,1217,1218,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1217,1219,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1219,1329,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1182,1219,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1217,1219,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1177,1178,1179,1180,1181,1183,1184,1185,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1219,1220,1221,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1186,1219,1329,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1189,1219,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1217,1219,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1182,1189,1217,1219,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1182,1217,1219,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1050,1051,1096,1217,1222,1223,1224,1228,1229,1231,1232,1235,1236,1335,1336,1337,1338,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1096,1155,1217,1222,1224,1231,1235,1236,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1217,1222,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1176,1186,1212,1213,1214,1215,1216,1217,1218,1222,1224,1229,1231,1232,1234,1235,1237,1238,1239,1241,1339,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1217,1222,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1213,1217,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1217,1224,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1049,1050,1056,1095,1099,1100,1217,1224,1232,1236,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1225,1226,1227,1228,1230,1233,1236,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1046,1048,1049,1050,1056,1095,1099,1100,1212,1217,1219,1224,1226,1232,1233,1236,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1050,1222,1229,1230,1232,1236,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1096,1099,1100,1217,1224,1232,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1099,1100,1224,1232,1235,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1049,1050,1051,1056,1095,1099,1100,1217,1222,1223,1224,1229,1232,1236,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1046,1047,1048,1049,1050,1051,1056,1217,1222,1223,1224,1230,1235,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1046,1048,1049,1050,1051,1056,1095,1099,1100,1217,1219,1223,1224,1232,1236,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1186,1217,1221,1235,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1059,1095,1096,1097,1232,1236,1335,1339,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1048,1049,1050,1056,1233,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1046,1176,1211,1212,1214,1215,1216,1218,1219,1329,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1048,1050,1176,1212,1214,1215,1216,1217,1218,1222,1223,1235,1242,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1240,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1049,1050,1051,1056,1219,1223,1233,1234,1329,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1042,1043,1051,1339,1340,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1340,1341,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1042,1043,1044,1050,1051,1095,1096,1224,1232,1236,1242,1280,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1059,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1046,1047,1048,1050,1051,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1046,1050,1051,1054,1330,1334,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1329,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1334,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1272,1290,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1262,1263,1264,1265,1266,1267,1274,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1273,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1273,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1272,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1272,1273,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1272,1273,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1059,1273,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1243,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1262,1263,1264,1265,1266,1267,1273,1274,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1253,1273,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1261,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1050,1096,1272,1279,1282,1283,1284,1287,1289,1290,1335,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1096,1155,1272,1273,1276,1277,1278,1289,1290,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1269,1270,1271,1272,1275,1279,1284,1287,1288,1289,1291,1292,1293,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1272,1275,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1272,1275,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1272,1289,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1050,1051,1099,1272,1273,1279,1289,1290,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1276,1277,1278,1285,1286,1290,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1046,1050,1099,1100,1272,1273,1277,1279,1289,1290,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1279,1284,1285,1290,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1049,1050,1051,1056,1095,1099,1272,1275,1279,1284,1289,1290,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1046,1047,1048,1049,1050,1051,1056,1272,1275,1285,1289,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1050,1051,1099,1272,1273,1279,1289,1290,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1272,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1095,1096,1279,1288,1290,1335,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1048,1049,1050,1056,1286,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1046,1268,1269,1270,1271,1273,1329,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1048,1050,1269,1270,1271,1272,1294,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1044,1051,1096,1279,1281,1288,1335,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1044,1050,1051,1095,1096,1279,1280,1289,1290,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1050,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1052,1053,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1055,1057,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1050,1056,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1050,1054,1058,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1045,1046,1048,1049,1051,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1300,1321,1326,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1321,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1296,1316,1317,1318,1319,1324,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1323,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1321,1322,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1321,1323,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1296,1316,1317,1318,1319,1323,1324,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1315,1321,1323,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1323,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1051,1321,1323,1329,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1050,1051,1096,1300,1301,1302,1303,1306,1311,1312,1321,1326,1335,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1096,1155,1306,1311,1321,1325,1326,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1321,1325,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1295,1297,1298,1299,1303,1304,1306,1311,1312,1314,1315,1321,1322,1325,1327,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1321,1325,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1306,1314,1321,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1049,1050,1051,1099,1100,1306,1312,1321,1323,1326,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1307,1308,1309,1310,1313,1326,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1049,1050,1051,1056,1099,1100,1297,1306,1308,1312,1313,1321,1323,1326,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1303,1310,1312,1326,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1051,1096,1099,1100,1306,1312,1321,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1097,1099,1100,1312,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1049,1050,1051,1056,1095,1099,1100,1300,1303,1306,1312,1321,1325,1326,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1046,1047,1048,1049,1050,1051,1056,1300,1306,1310,1314,1321,1325,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1048,1049,1050,1051,1099,1100,1300,1306,1312,1321,1323,1326,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1050,1095,1096,1097,1099,1304,1305,1312,1326,1335,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1048,1049,1050,1056,1313,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1046,1295,1297,1298,1299,1320,1322,1323,1329,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1321,1323,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1048,1050,1295,1297,1298,1299,1300,1314,1321,1322,1328,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1049,1050,1056,1300,1313,1323,1329,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1043,1047,1050,1051,1330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1044,1046,1050,1330,1335,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1922,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1923,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1896,1916,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1890,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1891,1895,1896,1897,1898,1899,1901,1903,1904,1909,1910,1919,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1891,1896,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1899,1916,1918,1921,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1890,1891,1892,1893,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1920,1921,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1919,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1889,1891,1892,1894,1902,1911,1914,1915,1920,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1896,1921,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1917,1919,1921,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1890,1891,1896,1899,1919,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1903,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1893,1901,1903,1904,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1893,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1893,1903,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1897,1898,1899,1903,1904,1909,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1899,1900,1904,1908,1910,1919,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1891,1903,1912,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1892,1893,1894,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1899,1919,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1899,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1890,1891,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1891,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1895,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1899,1904,1916,1917,1918,1919,1921,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,623,624,625,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,319,1486,1487,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,319,1486,1487,1488,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,642,644,645,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,612,618,642,644,1610,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,610,642,643,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,608,612,618,641,1610,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,612,618,635,640,642,1610,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,658,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,618,642,1610,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,662,663,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,664,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,653,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,618,640,642,652,1610,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,989,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,989,999,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,827,931,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,931,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,823,825,826,827,931,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,931,948,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,746,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,823,825,826,827,828,931,968,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,822,824,825,968,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,826,931,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,751,752,766,780,781,810,944,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,827,931,948,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,824,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,823,825,826,827,828,931,955,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,822,823,824,825,955,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,768,944,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,823,825,826,827,828,931,961,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,822,823,824,825,961,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,944,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,823,825,826,827,828,931,949,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,823,824,825,949,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,814,937,944,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,822,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,824,825,829,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,823,824,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,824,825,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,824,829,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,787,793,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,784,793,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,849,852,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,746,748,794,831,836,844,845,846,847,850,866,868,877,879,884,885,886,888,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,746,748,784,794,847,863,864,865,888,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,784,793,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,736,737,738,739,740,741,742,743,744,745,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,834,835,837,838,843,844,845,846,847,848,850,851,853,854,855,856,858,859,860,862,863,864,865,866,867,868,870,871,872,873,876,877,878,879,880,881,882,883,884,887,888,889,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,915,916,917,918,919,920,925,927,928,931,932,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,794,821,822,824,825,826,828,830,831,832,877,879,901,908,909,927,928,929,930,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,973,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,750,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,759,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,736,754,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,767,782,783,872,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,738,754,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,736,742,751,752,753,755,760,761,762,763,764,765,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,809,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,736,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,737,738,739,740,749,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,738,742,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,789,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,737,756,757,758,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,736,742,754,767,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,742,748,750,759,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,741,771,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,738,741,754,801,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,767,773,778,779,782,783,791,796,800,807,808,817,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,738,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,741,742,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,742,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,741,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,795,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,798,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,736,738,742,749,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,774,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,738,742,791,796,800,807,808,812,813,814,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,777,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,798,844,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,844,880,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,786,881,882,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,742,778,784,791,800,807,808,809,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,736,738,767,811,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,811,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,736,737,738,739,740,741,742,749,750,751,752,753,754,755,756,757,758,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,788,789,790,791,792,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,820,821,835,843,844,863,864,865,870,871,872,873,878,880,881,882,883,910,911,936,937,938,939,940,941,942,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,736,737,738,739,740,741,742,749,750,751,752,753,754,755,756,757,758,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,788,789,790,791,792,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,820,835,843,844,863,864,865,870,871,872,873,878,880,881,882,883,910,911,936,937,938,939,940,941,942,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,781,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,782,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,782,783,870,871,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,787,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,870,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,736,738,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,767,778,782,783,788,794,795,796,800,801,807,808,810,815,816,818,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,738,742,785,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,738,742,748,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,788,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,767,773,774,775,776,778,779,780,782,783,788,791,792,796,797,799,800,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,742,784,785,787,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,738,786,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,767,773,778,779,783,791,796,800,807,808,811,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,771,910,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,790,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,793,794,843,844,845,846,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,794,835,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,794,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,744,748,850,920,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,784,794,842,887,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,774,887,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,738,845,846,887,911,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,778,848,850,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,747,748,850,925,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,782,794,852,855,888,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,852,870,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,738,748,784,786,787,794,842,844,846,852,856,883,888,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,743,744,745,747,853,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,754,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,850,868,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,788,794,846,852,868,887,888,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,794,797,887,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,742,748,784,794,849,888,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,845,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,844,888,889,938,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,745,748,850,919,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,811,845,846,887,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,794,798,842,888,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,790,794,918,919,920,921,927,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,823,824,830,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,823,824,830,979,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,771,843,844,910,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,821,823,824,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,784,794,847,856,867,873,875,888,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,746,794,845,847,866,878,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,790,793,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,744,746,748,793,794,795,818,819,821,822,830,831,832,845,847,850,851,853,856,858,859,862,867,888,889,914,915,917,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,746,748,794,842,846,866,869,876,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,847,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,743,746,748,793,794,795,815,819,821,822,830,831,832,846,853,859,862,888,912,913,914,915,916,917,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,778,793,847,888,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,784,794,881,883,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,747,748,793,794,810,819,821,822,831,832,845,847,850,851,853,859,888,889,912,913,914,915,917,919,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,819,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,793,794,812,846,847,858,888,889,913,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,794,856,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,782,793,854,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,887,888,914,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,793,794,856,867,872,874,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,846,853,914,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,794,801,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,746,748,794,795,799,800,801,819,821,822,830,831,832,842,845,846,847,850,851,853,856,857,858,859,860,861,862,866,867,888,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,745,746,748,793,794,795,816,819,821,822,830,831,832,845,847,850,851,853,856,858,859,862,867,888,889,913,914,915,917,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,847,888,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,821,823,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,735,736,737,738,739,740,741,742,749,750,751,752,753,754,755,756,757,758,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,788,789,790,791,792,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,820,821,822,823,835,843,844,863,864,865,870,871,872,873,878,880,881,882,883,910,911,936,937,938,939,940,941,942,943,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,754,763,766,768,769,770,772,802,803,804,805,806,810,819,820,821,822,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,743,791,830,831,850,853,868,886,918,921,922,923,924,926,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,821,822,823,824,827,829,830,933,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,822,827,830,933,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,821,822,823,824,827,829,830,831,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,831,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,821,822,823,824,827,829,830,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,754,794,821,822,824,830,901,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,902,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,755,793,833,836,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,749,766,793,821,822,831,832,837,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,766,768,793,794,821,822,831,832,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,766,793,794,821,822,831,832,834,836,837,838,839,840,841,890,891,892,893,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,766,793,821,822,831,832,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,737,793,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,749,750,793,794,833,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,768,793,794,821,822,831,832,847,887,889,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,769,793,821,822,831,832,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,770,793,794,821,822,831,832,834,836,837,891,892,893,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,772,793,821,822,831,832,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,793,802,821,822,831,832,868,902,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,763,793,821,822,831,832,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,793,803,821,822,831,832,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,793,804,821,822,831,832,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,793,805,821,822,831,832,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,793,806,821,822,831,832,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,749,756,793,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,757,793,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,793,820,821,822,831,832,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,830,831,894,895,896,897,898,899,900,903,904,905,906,907,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,758,793,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,794,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,743,744,745,747,748,822,832,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,748,822,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,743,744,745,746,747,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2041,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,618,642,1582,1583,1584,1608,1609,1610,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,618,642,1583,1610,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,618,642,1582,1583,1610,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1600,1601,1602,1603,1604,1605,1606,1607,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,612,618,642,1582,1584,1610,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1486,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1489,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1026,1027,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1025,1026,1029,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1025,1031,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1025,1026,1027,1028,1029,1030,1032,1033,1034,1035,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1026,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1025,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,192,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,433,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,440,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,203,217,218,219,221,427,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,203,242,244,246,247,250,427,429,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,203,207,209,210,211,212,213,416,427,429,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,427,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,218,313,397,406,423,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,203,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,200,423,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,254,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,253,427,429,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,295,313,342,483,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,306,323,406,422,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,358,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,410,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,409,410,411,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,409,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,194,200,203,207,210,214,215,216,218,222,230,231,351,386,407,427,430,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,203,220,238,242,243,248,249,427,483,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,220,483,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,231,238,293,427,483,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,483,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,203,220,221,483,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,245,483,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,214,408,415,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,156,319,423,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,319,423,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,319,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,314,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,310,356,423,466,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,403,460,461,462,463,465,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,402,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,402,403,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,211,352,353,354,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,352,355,356,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,464,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,352,356,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,204,454,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,173,186,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,220,283,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,220,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,281,285,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,282,432,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1471,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,180,186,190,195,196,430,475,476,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,207,262,352,362,376,397,412,413,427,428,483,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,230,414,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,430,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,202,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,295,309,322,332,334,422,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,156,295,309,331,332,333,422,482,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,325,326,327,328,329,330,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,327,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,331,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,282,319,432,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,319,431,432,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,319,432,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,376,419,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,419,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,428,432,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,318,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,129,130,317,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,232,263,302,303,305,306,307,308,349,352,422,425,428,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,232,303,352,356,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,306,422,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,306,315,316,318,320,321,322,323,324,335,336,337,338,339,340,341,422,423,483,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,300,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,156,232,233,262,277,307,349,350,351,356,376,397,418,427,428,429,430,483,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,422,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,129,130,218,303,304,307,351,418,420,421,428,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,306,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,129,130,262,267,296,297,298,299,300,301,302,305,422,423,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,267,268,296,428,429,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,218,303,351,352,376,418,422,428,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,427,429,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,162,425,428,429,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,156,173,200,207,220,232,233,235,263,264,269,274,277,302,307,352,362,364,367,369,372,373,374,375,397,417,418,423,425,427,428,429,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,162,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,203,204,205,215,417,425,426,430,432,483,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,162,173,250,252,254,255,256,257,483,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,156,173,200,242,252,273,274,275,276,302,352,367,376,382,385,387,397,418,423,425,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,214,215,230,351,386,418,427,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,173,204,207,302,380,425,427,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,294,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,383,384,394,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,425,427,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,303,304,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,302,307,417,432,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,156,236,242,276,367,376,382,385,389,425,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,214,230,242,390,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,203,235,392,417,427,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,173,427,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,220,234,235,236,247,258,391,393,417,427,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,194,232,307,396,430,432,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,156,173,207,214,222,230,233,263,269,273,274,275,276,277,302,352,364,376,377,379,381,397,417,418,423,424,425,432,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,162,214,382,388,394,425,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,225,226,227,228,229,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,264,368,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,370,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,368,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,370,371,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,207,262,428,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,156,202,204,232,263,277,307,360,361,397,425,429,430,432,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,156,173,206,211,302,361,424,428,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,296,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,297,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,298,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,423,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,251,260,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,207,251,263,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,259,260,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,261,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,251,252,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,251,278,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,251,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,264,366,424,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,365,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,252,423,424,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,363,424,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,252,423,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,349,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,263,292,295,302,303,309,312,343,345,348,352,396,425,428,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,286,289,290,291,310,311,356,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,197,198,199,319,344,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,197,198,199,319,344,347,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,405,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,218,268,306,307,318,323,352,396,398,399,400,401,403,404,407,417,422,427,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,356,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,360,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,263,279,357,359,362,396,425,430,432,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,286,287,288,289,290,291,310,311,356,431,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,156,173,194,233,251,252,277,302,307,394,395,397,417,418,427,428,430,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,268,270,273,418,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,264,427,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,267,306,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,266,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,268,269,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,265,267,427,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,206,268,270,271,272,427,428,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,352,353,355,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,237,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,204,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,423,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,194,277,307,430,432,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,204,454,455,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,285,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,156,173,186,202,249,280,282,284,432,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,220,423,428,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,156,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,378,423,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,143,145,156,186,202,238,244,285,430,431,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,195,196,430,477,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,187,188,189,190,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,135,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,239,240,241,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,239,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,147,156,180,186,190,195,196,197,199,200,202,233,331,389,429,432,477,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,442,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,444,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,446,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1472,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,448,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,450,451,452,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,456,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,191,193,434,439,441,443,445,447,449,453,457,459,468,469,471,481,482,483,484,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,458,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,467,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,282,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,470,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,129,130,268,270,271,273,322,423,472,473,474,477,478,479,480,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,180,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,620,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,619,620,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,619,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,619,620,621,627,628,631,632,633,634,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,620,628,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,619,620,621,627,628,629,630,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,619,628,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,628,632,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,620,621,622,626,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,621,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,619,620,628,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,180,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100,2105,2106,2107],[88,130,162,180,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100,2105],[88,130,505,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,503,505,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,494,502,503,504,506,508,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,492,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,495,500,505,508,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,491,508,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,495,496,499,500,501,508,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,495,496,497,499,500,508,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,492,493,494,495,496,500,501,502,504,505,506,508,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,508,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,490,492,493,494,495,496,497,499,500,501,502,503,504,505,506,507,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,490,508,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,495,497,498,500,501,508,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,499,508,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,500,501,505,508,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,493,503,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,162,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,637,638,639,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,636,640,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,640,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1413,1416,1417,1420,1421,1422,1423,1424,1425,1431,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1886,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,2017,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2017,2018,2019,2022,2023,2024,2025,2026,2027,2028,2031,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2017,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2020,2021,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,2015,2017,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2012,2013,2015,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2008,2011,2013,2015,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2012,2015,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,2003,2004,2005,2008,2009,2010,2012,2013,2014,2015,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2005,2008,2009,2010,2011,2012,2013,2014,2015,2016,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2012,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2006,2012,2013,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2006,2007,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2011,2013,2014,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2011,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2003,2008,2013,2014,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2029,2030,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1501,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1498,1499,1500,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1613,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,617,618,642,648,655,1610,1612,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2044,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,2042,2043,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1519,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1536,1537,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1520,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1522,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1520,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1519,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1535,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1538,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1931,1932,1933,1949,1952,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1931,1932,1933,1942,1950,1970,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1930,1933,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1933,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1931,1932,1933,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1931,1932,1933,1968,1971,1974,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1931,1932,1933,1942,1949,1952,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1931,1932,1933,1942,1950,1962,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1931,1932,1933,1942,1952,1962,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1931,1932,1933,1942,1962,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1931,1932,1933,1937,1943,1949,1954,1972,1973,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1933,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1933,1977,1978,1979,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1933,1976,1977,1978,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1933,1950,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1933,1976,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1933,1942,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1933,1934,1935,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1933,1935,1937,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1926,1927,1931,1932,1933,1934,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1949,1950,1951,1952,1953,1954,1955,1956,1957,1958,1959,1960,1961,1963,1964,1965,1966,1967,1968,1969,1971,1972,1973,1974,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1933,1991,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1933,1945,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1933,1952,1956,1957,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1933,1943,1945,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1933,1948,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1933,1971,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1933,1948,1975,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1936,1976,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,186,1930,1931,1932,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,660,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,618,642,659,1610,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,617,618,642,646,647,648,655,1610,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,612,618,642,646,1610,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,664,665,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,618,642,664,1610,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,656,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,617,618,642,648,654,655,1610,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1610,1611,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,612,617,618,642,648,655,1582,1610,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,162,180,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,651,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,649,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,649,650,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,510,511,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,509,512,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,614,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,91,92,93,94,95,96,97,98,99,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,119,120,121,122,123,124,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,612,616,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,608,612,613,615,617,648,655,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,609,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,610,611,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,608,610,612,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1929,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1947,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1560,1564,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1560,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1561,1562,1563,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,531,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,522,523,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,519,520,522,524,525,530,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,520,522,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,530,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,522,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,519,520,522,525,526,527,528,529,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,519,520,521,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,724,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,724,727,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,717,724,725,726,727,728,729,730,731,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,732,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,724,725,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,724,726,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,670,672,673,674,675,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,670,672,674,675,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,670,672,674,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,670,672,673,675,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,670,672,675,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,670,671,672,673,674,675,676,677,717,718,719,720,721,722,723,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,672,675,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,669,670,671,673,674,675,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,672,718,722,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,672,673,674,675,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,733,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,674,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,598,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,590,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,590,593,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,583,590,591,592,593,594,595,596,597,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,590,591,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,590,592,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,536,538,539,540,541,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,536,538,540,541,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,536,538,540,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,536,538,539,541,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,536,538,541,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,536,537,538,539,540,541,542,543,583,584,585,586,587,588,589,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,538,541,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,535,536,537,539,540,541,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,538,584,588,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,538,539,540,541,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,540,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1367,1368,1396,1397,1398,1400,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1396,1397,1398,1399,1400,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1367,1396,1397,1398,1400,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100,2112],[88,127,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,129,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,135,165,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,131,136,142,143,150,162,173,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,131,132,142,150,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[83,84,85,88,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,133,174,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,134,135,143,151,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,135,162,170,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,136,138,142,150,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,129,130,137,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,138,139,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,140,142,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,129,130,142,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,142,143,144,162,173,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,142,143,144,157,162,165,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2080,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2096,2097,2098,2099,2100],[88,125,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,125,130,138,142,145,150,162,173,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,142,143,145,146,150,162,170,173,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,147,162,170,173,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[86,87,88,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,142,148,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,149,173,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,138,142,150,162,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,151,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,152,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,129,130,153,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2080,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2096,2097,2098,2099,2100],[88,130,155,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,142,157,158,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,157,159,174,176,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,142,162,163,165,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,164,165,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,162,163,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,165,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2096,2097,2098,2099,2100],[88,130,166,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,127,130,162,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,142,168,169,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,168,169,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,135,150,162,170,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2080,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2096,2097,2098,2099,2100],[88,130,171,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,150,172,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,145,156,173,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,135,174,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,162,175,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,149,176,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,177,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,142,144,153,162,165,173,176,178,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,162,179,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,97,101,130,173,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,97,130,162,173,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,92,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,94,97,130,170,173,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2080,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2096,2097,2098,2099,2100],[88,130,150,170,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2080,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2096,2097,2098,2099,2100],[88,92,130,180,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,94,97,130,150,173,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,89,90,93,96,130,142,162,173,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,97,104,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,89,95,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,97,118,119,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,93,97,130,165,173,180,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2096,2097,2098,2099,2100],[88,118,130,180,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,91,92,130,180,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,97,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,97,112,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,97,104,105,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,95,97,105,106,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,96,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,89,92,97,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,97,101,105,106,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,101,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,95,97,100,130,173,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,89,94,97,104,130,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,92,97,118,130,178,180,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,600,1346,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,600,1345,1347,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,534,599,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,600,1040,1041,1344,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,601,1042,1334,1342,1343,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100],[88,130,1242,2064,2065,2066,2067,2068,2069,2070,2071,2072,2073,2074,2076,2077,2078,2079,2081,2082,2083,2084,2088,2089,2090,2092,2093,2094,2095,2097,2098,2099,2100]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"8bf8b5e44e3c9c36f98e1007e8b7018c0f38d8adc07aecef42f5200114547c70","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"4245fee526a7d1754529d19227ecbf3be066ff79ebb6a380d78e41648f2f224d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"92d5369f7f9480aac66bbcd295c0b2d82077295c8bf0f0fe08fa3c3321225e49","impliedFormat":99},{"version":"878390f2f3d349610300c7603fb9dff16cfb92fcc6f5fc1f9b262e5bbd6479e5","impliedFormat":99},{"version":"6c7176368037af28cb72f2392010fa1cef295d6d6744bca8cfb54985f3a18c3e","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true,"impliedFormat":1},{"version":"437e20f2ba32abaeb7985e0afe0002de1917bc74e949ba585e49feba65da6ca1","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"a12d953aa755b14ac1d28ecdc1e184f3285b01d6d1e58abc11bf1826bc9d80e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"9855e02d837744303391e5623a531734443a5f8e6e8755e018c41d63ad797db2","impliedFormat":1},{"version":"0a6b3ad6e19dd0fe347a54cbfd8c8bd5091951a2f97b2f17e0af011bfde05482","impliedFormat":1},{"version":"0a37a4672f163d7fe46a414923d0ef1b0526dcd2d2d3d01c65afe6da03bf2495","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"25d130083f833251b5b4c2794890831b1b8ce2ead24089f724181576cf9d7279","impliedFormat":1},{"version":"ffe66ee5c9c47017aca2136e95d51235c10e6790753215608bff1e712ff54ec6","impliedFormat":1},{"version":"206a70e72af3e24688397b81304358526ce70d020e4c2606c4acfd1fa1e81fb2","impliedFormat":1},{"version":"017caf5d2a8ef581cf94f678af6ce7415e06956317946315560f1487b9a56167","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"aa9e37a18f4a50ea4bb5f118d03d144cc779b778e0e3fe60ee80c3add19e613b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f72bc8fe16da67e4e3268599295797b202b95e54bd215a03f97e925dd1502a36","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"915e18c559321c0afaa8d34674d3eb77e1ded12c3e85bf2a9891ec48b07a1ca5","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"199c8269497136f3a0f4da1d1d90ab033f899f070e0dd801946f2a241c8abba2","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"6266d94fb9165d42716e45f3a537ca9f59c07b1dfa8394a659acf139134807db","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"a7692a54334fd08960cd0c610ff509c2caa93998e0dcefa54021489bcc67c22d","affectsGlobalScope":true,"impliedFormat":1},{"version":"0f7e00beefa952297cde4638b2124d2d9a1eed401960db18edcadaa8500c78eb","impliedFormat":1},{"version":"3a051941721a7f905544732b0eb819c8d88333a96576b13af08b82c4f17581e4","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"1e25f8d0a8573cafd5b5a16af22d26ab872068a693b9dbccd3f72846ab373655","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"0c5f112b6d3377b9e8214d8920e1a69d8098b881d941f2ab3ca45234d13d68de","impliedFormat":1},{"version":"7328fb56302eb8df2722d4065c7e1618ebb20d919dac48318cbedbb7fbd36604","signature":"be4efb33a02376028077c85dc024a66f2dc9654f3e8a4bf126cb057c079730a1"},{"version":"eb5b19b86227ace1d29ea4cf81387279d04bb34051e944bc53df69f58914b788","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","impliedFormat":1},{"version":"472f5aab7edc498a0a761096e8e254c5bc3323d07a1e7f5f8b8ec0d6395b60a0","affectsGlobalScope":true,"impliedFormat":1},{"version":"acd8fd5090ac73902278889c38336ff3f48af6ba03aa665eb34a75e7ba1dccc4","impliedFormat":1},{"version":"d6258883868fb2680d2ca96bc8b1352cab69874581493e6d52680c5ffecdb6cc","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"f258e3960f324a956fc76a3d3d9e964fff2244ff5859dcc6ce5951e5413ca826","impliedFormat":1},{"version":"643f7232d07bf75e15bd8f658f664d6183a0efaca5eb84b48201c7671a266979","impliedFormat":1},{"version":"0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","impliedFormat":1},{"version":"05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","impliedFormat":1},{"version":"631eff75b0e35d1b1b31081d55209abc43e16b49426546ab5a9b40bdd40b1f60","impliedFormat":1},{"version":"3609e455ffcba8176c8ce0aa57f8258fe10cf03987e27f1fab68f702b4426521","impliedFormat":1},{"version":"d1bd4e51810d159899aad1660ccb859da54e27e08b8c9862b40cd36c1d9ff00f","impliedFormat":1},{"version":"17ed71200119e86ccef2d96b73b02ce8854b76ad6bd21b5021d4269bec527b5f","impliedFormat":1},{"version":"1cfa8647d7d71cb03847d616bd79320abfc01ddea082a49569fda71ac5ece66b","impliedFormat":1},{"version":"bb7a61dd55dc4b9422d13da3a6bb9cc5e89be888ef23bbcf6558aa9726b89a1c","impliedFormat":1},{"version":"413df52d4ea14472c2fa5bee62f7a40abd1eb49be0b9722ee01ee4e52e63beb2","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"77497ec7d02338725444582c8ae7eb2085243a9f8c4113ca40b9b4fd941f2319","impliedFormat":1},{"version":"24f8562308dd8ba6013120557fa7b44950b619610b2c6cb8784c79f11e3c4f90","impliedFormat":1},{"version":"ba1ae645ccbff0137326f99084f5cf87c9fa988c59906177d59deabeee9e428d","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"57d6ac03382e30e9213641ff4f18cf9402bb246b77c13c8e848c0b1ca2b7ef92","impliedFormat":1},{"version":"ce75b1aebb33d510ff28af960a9221410a3eaf7f18fc5f21f9404075fba77256","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"496bbf339f3838c41f164238543e9fe5f1f10659cb30b68903851618464b98ba","impliedFormat":1},{"version":"44e0a682d3a20df46bbf8e7e37f2f10b1604d4ab08b3beda1c365e6d9c3ec74d","impliedFormat":1},{"version":"97395dc4fd32e20b8888849266065caf0b45d12575242c308e8604a4288ec3e5","impliedFormat":1},{"version":"9e2739b32f741859263fdba0244c194ca8e96da49b430377930b8f721d77c000","impliedFormat":1},{"version":"fb1d8e814a3eeb5101ca13515e0548e112bd1ff3fb358ece535b93e94adf5a3a","impliedFormat":1},{"version":"ffa495b17a5ef1d0399586b590bd281056cee6ce3583e34f39926f8dcc6ecdb5","impliedFormat":1},{"version":"98b18458acb46072947aabeeeab1e410f047e0cacc972943059ca5500b0a5e95","impliedFormat":1},{"version":"361e2b13c6765d7f85bb7600b48fde782b90c7c41105b7dab1f6e7871071ba20","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"b6db56e4903e9c32e533b78ac85522de734b3d3a8541bf24d256058d464bf04b","impliedFormat":1},{"version":"24daa0366f837d22c94a5c0bad5bf1fd0f6b29e1fae92dc47c3072c3fdb2fbd5","impliedFormat":1},{"version":"570bb5a00836ffad3e4127f6adf581bfc4535737d8ff763a4d6f4cc877e60d98","impliedFormat":1},{"version":"889c00f3d32091841268f0b994beba4dceaa5df7573be12c2c829d7c5fbc232c","impliedFormat":1},{"version":"65f43099ded6073336e697512d9b80f2d4fec3182b7b2316abf712e84104db00","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"12b8dfed70961bea1861e5d39e433580e71323abb5d33da6605182ec569db584","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"7e560f533aaf88cf9d3b427dcf6c112dd3f2ee26d610e2587583b6c354c753db","impliedFormat":1},{"version":"71e0082342008e4dfb43202df85ea0986ef8e003c921a1e49999d0234a3019da","impliedFormat":1},{"version":"27ab780875bcbb65e09da7496f2ca36288b0c541abaa75c311450a077d54ec15","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"380647d8f3b7f852cca6d154a376dbf8ac620a2f12b936594504a8a852e71d2f","impliedFormat":1},{"version":"208c9af9429dd3c76f5927b971263174aaa4bc7621ddec63f163640cbd3c473c","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"a23185bc5ef590c287c28a91baf280367b50ae4ea40327366ad01f6f4a8edbc5","impliedFormat":1},{"version":"bb37588926aba35c9283fe8d46ebf4e79ffe976343105f5c6d45f282793352b2","impliedFormat":1},{"version":"002eae065e6960458bda3cf695e578b0d1e2785523476f8a9170b103c709cd4f","impliedFormat":1},{"version":"c51641ab4bfa31b7a50a0ca37edff67f56fab3149881024345b13f2b48b7d2de","impliedFormat":1},{"version":"05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391","impliedFormat":1},{"version":"72179f9dd22a86deaad4cc3490eb0fe69ee084d503b686985965654013f1391b","impliedFormat":1},{"version":"2e6114a7dd6feeef85b2c80120fdbfb59a5529c0dcc5bfa8447b6996c97a69f5","impliedFormat":1},{"version":"7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4","impliedFormat":1},{"version":"c8f004e6036aa1c764ad4ec543cf89a5c1893a9535c80ef3f2b653e370de45e6","impliedFormat":1},{"version":"dd80b1e600d00f5c6a6ba23f455b84a7db121219e68f89f10552c54ba46e4dc9","impliedFormat":1},{"version":"b064c36f35de7387d71c599bfcf28875849a1dbc733e82bd26cae3d1cd060521","impliedFormat":1},{"version":"6a148329edecbda07c21098639ef4254ef7869fb25a69f58e5d6a8b7b69d4236","impliedFormat":1},{"version":"8de9fe97fa9e00ec00666fa77ab6e91b35d25af8ca75dabcb01e14ad3299b150","impliedFormat":1},{"version":"f63ab283a1c8f5c79fabe7ca4ef85f9633339c4f0e822fce6a767f9d59282af2","impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"a54c996c8870ef1728a2c1fa9b8eaec0bf4a8001cd2583c02dd5869289465b10","impliedFormat":1},{"version":"3e7efde639c6a6c3edb9847b3f61e308bf7a69685b92f665048c45132f51c218","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"0c28b634994a944d8cb9ea841b80f861827ea4fbe16fb2152b039aba5d1af801","impliedFormat":1},{"version":"33117f749afa2a897890989c3f75cbf86119bf81a8899f227cdc86c9166cd896","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"50256e9c31318487f3752b7ac12ff365c8949953e04568009c8705db802776fb","impliedFormat":1},{"version":"7d73b24e7bf31dfb8a931ca6c4245f6bb0814dfae17e4b60c9e194a631fe5f7b","impliedFormat":1},{"version":"8d1fd7b451f69cd173e6e20272e0d64ba4a8a1fe0eb3ef5f82134a5b0cb7c9df","impliedFormat":1},{"version":"d6e73f8010935b7b4c7487b6fb13ea197cc610f0965b759bec03a561ccf8423a","impliedFormat":1},{"version":"174f3864e398f3f33f9a446a4f403d55a892aa55328cf6686135dfaf9e171657","impliedFormat":1},{"version":"824c76aec8d8c7e65769688cbee102238c0ef421ed6686f41b2a7d8e7e78a931","impliedFormat":1},{"version":"75b868be3463d5a8cfc0d9396f0a3d973b8c297401d00bfb008a42ab16643f13","impliedFormat":1},{"version":"05c8cd040dc6b8aa18f310b12eaf0407dc4d122ec035dc5b0c9b97e795abfeec","impliedFormat":1},{"version":"d682336018141807fb602709e2d95a192828fcb8d5ba06dda3833a8ea98f69e3","impliedFormat":1},{"version":"6124e973eab8c52cabf3c07575204efc1784aca6b0a30c79eb85fe240a857efa","impliedFormat":1},{"version":"0d891735a21edc75df51f3eb995e18149e119d1ce22fd40db2b260c5960b914e","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"51b1709e7ad186919a0e30237a8607100143a86d28771b3d3f046359aca1e65c","impliedFormat":1},{"version":"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f","impliedFormat":1},{"version":"0a437ae178f999b46b6153d79095b60c42c996bc0458c04955f1c996dc68b971","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"4a7baeb6325920044f66c0f8e5e6f1f52e06e6d87588d837bdf44feb6f35c664","impliedFormat":1},{"version":"6dcf60530c25194a9ee0962230e874ff29d34c59605d8e069a49928759a17e0a","impliedFormat":1},{"version":"7274fbffbd7c9589d8d0ffba68157237afd5cecff1e99881ea3399127e60572f","impliedFormat":1},{"version":"1a42d2ec31a1fe62fdc51591768695ed4a2dc64c01be113e7ff22890bebb5e3f","impliedFormat":1},{"version":"1a82deef4c1d39f6882f28d275cad4c01f907b9b39be9cbc472fcf2cf051e05b","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","impliedFormat":1},{"version":"0c7c947ff881c4274c0800deaa0086971e0bfe51f89a33bd3048eaa3792d4876","affectsGlobalScope":true,"impliedFormat":1},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true,"impliedFormat":1},{"version":"a8f8e6ab2fa07b45251f403548b78eaf2022f3c2254df3dc186cb2671fe4996d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"15b36126e0089bfef173ab61329e8286ce74af5e809d8a72edcafd0cc049057f","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"a57b1802794433adec9ff3fed12aa79d671faed86c49b09e02e1ac41b4f1d33a","impliedFormat":1},{"version":"ad10d4f0517599cdeca7755b930f148804e3e0e5b5a3847adce0f1f71bbccd74","impliedFormat":1},{"version":"1042064ece5bb47d6aba91648fbe0635c17c600ebdf567588b4ca715602f0a9d","impliedFormat":1},{"version":"4360ad4de54de2d5c642c4375d5eab0e7fe94ebe8adca907e6c186bbef75a54d","impliedFormat":1},{"version":"4a889f2c763edb4d55cb624257272ac10d04a1cad2ed2948b10ed4a7fda2a428","impliedFormat":1},{"version":"7bb79aa2fead87d9d56294ef71e056487e848d7b550c9a367523ee5416c44cfa","impliedFormat":1},{"version":"43542b120b07d198a86a21f6df97e6fe4a6327e960342777eefaa407baee2a62","impliedFormat":1},{"version":"090fa057d7b2c429119fde252e3b7276a7d75a3ec172a9a23aa922dfac5345e8","impliedFormat":1},{"version":"27ff4196654e6373c9af16b6165120e2dd2169f9ad6abb5c935af5abd8c7938c","impliedFormat":1},{"version":"24428762d0c97b44c4784d28eee9556547167c4592d20d542a79243f7ca6a73f","impliedFormat":1},{"version":"d6406c629bb3efc31aedb2de809bef471e475c86c7e67f3ef9b676b5d7e0d6b2","impliedFormat":1},{"version":"8c030e515014c10a2b98f9f48408e3ba18023dfd3f56e3312c6c2f3ae1f55a16","impliedFormat":1},{"version":"dafc31e9e8751f437122eb8582b93d477e002839864410ff782504a12f2a550c","impliedFormat":1},{"version":"4e31a4e6319cee44ce4cec0f8892c60289cfbdbec11dda19c85559bb8ab53bc2","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"f56bdc6884648806d34bc66d31cdb787c4718d04105ce2cd88535db214631f82","impliedFormat":1},{"version":"20e06cdda4a8fdd7c1b548259f89f01b04e56a513e834463d7bac5632c7cf906","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"13283350547389802aa35d9f2188effaeac805499169a06ef5cd77ce2a0bd63f","impliedFormat":1},{"version":"ce791f6ea807560f08065d1af6014581eeb54a05abd73294777a281b6dfd73c2","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"49f95e989b4632c6c2a578cc0078ee19a5831832d79cc59abecf5160ea71abad","impliedFormat":1},{"version":"21b4672313ae95583ade84f97ae6bbeaf242ecae783f5653e2e99ac4e21cbbe1","impliedFormat":1},{"version":"ce0df82a9ae6f914ba08409d4d883983cc08e6d59eb2df02d8e4d68309e7848b","impliedFormat":1},{"version":"796273b2edc72e78a04e86d7c58ae94d370ab93a0ddf40b1aa85a37a1c29ecd7","impliedFormat":1},{"version":"5df15a69187d737d6d8d066e189ae4f97e41f4d53712a46b2710ff9f8563ec9f","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"e17cd049a1448de4944800399daa4a64c5db8657cc9be7ef46be66e2a2cd0e7c","impliedFormat":1},{"version":"d05fb434f4ba073aed74b6c62eff1723c835de2a963dbb091e000a2decb5a691","impliedFormat":1},{"version":"bff8c8bffbf5f302a30ccb1c0557dae477892d50a80eecfe393bd89bac7fb41d","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"4d4927cbee21750904af7acf940c5e3c491b4d5ebc676530211e389dd375607a","impliedFormat":1},{"version":"72105519d0390262cf0abe84cf41c926ade0ff475d35eb21307b2f94de985778","impliedFormat":1},{"version":"8a97e578a9bc40eb4f1b0ca78f476f2e9154ecbbfd5567ee72943bab37fc156a","impliedFormat":1},{"version":"a58abf1f5c8feb335475097abeddd32fd71c4dc2065a3d28cf15cacabad9654a","impliedFormat":1},{"version":"ccf6dd45b708fb74ba9ed0f2478d4eb9195c9dfef0ff83a6092fa3cf2ff53b4f","impliedFormat":1},{"version":"2d7db1d73456e8c5075387d4240c29a2a900847f9c1bff106a2e490da8fbd457","impliedFormat":1},{"version":"2b15c805f48e4e970f8ec0b1915f22d13ca6212375e8987663e2ef5f0205e832","impliedFormat":1},{"version":"f22d05663d873ee7a600faf78abb67f3f719d32266803440cf11d5db7ac0cab2","impliedFormat":1},{"version":"d93c544ad20197b3976b0716c6d5cd5994e71165985d31dcab6e1f77feb4b8f2","impliedFormat":1},{"version":"35069c2c417bd7443ae7c7cafd1de02f665bf015479fec998985ffbbf500628c","impliedFormat":1},{"version":"a8b1c79a833ee148251e88a2553d02ce1641d71d2921cce28e79678f3d8b96aa","impliedFormat":1},{"version":"126d4f950d2bba0bd45b3a86c76554d4126c16339e257e6d2fabf8b6bf1ce00c","impliedFormat":1},{"version":"9e21f8e2c0cfea713a4a372f284b60089c0841eb90bf3610539d89dbcd12d65a","impliedFormat":1},{"version":"045b752f44bf9bbdcaffd882424ab0e15cb8d11fa94e1448942e338c8ef19fba","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"7fa117f0f4f132ba132794982a35c840287997ee186753f78abe48508812c238","impliedFormat":1},{"version":"6ce54b2cfe4cf91138e2f5f114fe222a8819968336385cbcafd26ca89ebd4f50","impliedFormat":1},{"version":"b612fc66f534bd447bb1d5d52a29217a80780e1d57633875c9d8a333503f378a","impliedFormat":1},{"version":"0e8aef93d79b000deb6ec336b5645c87de167168e184e84521886f9ecc69a4b5","impliedFormat":1},{"version":"56ccb49443bfb72e5952f7012f0de1a8679f9f75fc93a5c1ac0bafb28725fc5f","impliedFormat":1},{"version":"d90b9f1520366d713a73bd30c5a9eb0040d0fb6076aff370796bc776fd705943","impliedFormat":1},{"version":"05321b823dd3781d0b6aac8700bfdc0c9181d56479fe52ba6a40c9196fd661a8","impliedFormat":1},{"version":"736a8712572e21ee73337055ce15edb08142fc0f59cd5410af4466d04beff0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"bef86adb77316505c6b471da1d9b8c9e428867c2566270e8894d4d773a1c4dc2","impliedFormat":1},{"version":"a7d72cf676f5117df919b8a73da2cfa20cf9939fdb263fd496fb77f95c35335d","impliedFormat":1},{"version":"a3e7d932dc9c09daa99141a8e4800fc6c58c625af0d4bbb017773dc36da75426","impliedFormat":1},{"version":"43e96a3d5d1411ab40ba2f61d6a3192e58177bcf3b133a80ad2a16591611726d","impliedFormat":1},{"version":"219e5e67ea4630410167444a715ecc172d9462b7910cd066eca18f6ed27d907b","impliedFormat":1},{"version":"ca921bf56756cb6fe957f6af693a35251b134fb932dc13f3dfff0bb7106f80b4","impliedFormat":1},{"version":"fee92c97f1aa59eb7098a0cc34ff4df7e6b11bae71526aca84359a2575f313d8","impliedFormat":1},{"version":"acfbb7b38e876b43cb07d0c8bd1a2e84dd641d9d2b67d772e8977337398bfff5","impliedFormat":1},{"version":"2ab6d334bcbf2aff3acfc4fd8c73ecd82b981d3c3aa47b3f3b89281772286904","impliedFormat":1},{"version":"d07cbc787a997d83f7bde3877fec5fb5b12ce8c1b7047eb792996ed9726b4dde","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"268c6788d4791a66cc5c153c41d2313d6f3c0d3e35edce3ce05e21c31f972ae0","impliedFormat":1},{"version":"b83cb14474fa60c5f3ec660146b97d122f0735627f80d82dd03e8caa39b4388c","impliedFormat":1},{"version":"f374cb24e93e7798c4d9e83ff872fa52d2cdb36306392b840a6ddf46cb925cb6","impliedFormat":1},{"version":"6ad71551fba5dbf440780090c82f5e0a7b64f602e0f0f678317659f12131f253","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"20865ac316b8893c1a0cc383ccfc1801443fbcc2a7255be166cf90d03fac88c9","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"461d0ad8ae5f2ff981778af912ba71b37a8426a33301daa00f21c6ccb27f8156","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"fcafff163ca5e66d3b87126e756e1b6dfa8c526aa9cd2a2b0a9da837d81bbd72","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"45490817629431853543adcb91c0673c25af52a456479588b6486daba34f68bb","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"8b4327413e5af38cd8cb97c59f48c3c866015d5d642f28518e3a891c469f240e","impliedFormat":1},{"version":"cd767eea328a0ed87d2e028147a022f209fadf420199254253a6cffe8e234df8","impliedFormat":1},{"version":"4b20fcf10a5413680e39f5666464859fc56b1003e7dfe2405ced82371ebd49b6","impliedFormat":1},{"version":"f0f3f57e29b40e9cb0c4b155a96de2f61e51700d2c335dd547ef3c85e668c6a8","impliedFormat":1},{"version":"f7d628893c9fa52ba3ab01bcb5e79191636c4331ee5667ecc6373cbccff8ae12","impliedFormat":1},{"version":"a169ba2d40cc94a500759aa86eded1f63395252bb7508a8b67dc681ff413ac8d","impliedFormat":1},{"version":"6a76daf108400ca1333e325772f24f40ebdde2120ef68f8c87d7a1adf0257541","impliedFormat":1},{"version":"7fa321c806b965bac02883573db0b1466e5edd14c479d156079eb08f1086f1d1","impliedFormat":1},{"version":"d663134457d8d669ae0df34eabd57028bddc04fc444c4bc04bc5215afc91e1f4","impliedFormat":1},{"version":"a52674bc98da7979607e0f44d4c015c59c1b1d264c83fc50ec79ff2cfea06723","impliedFormat":1},{"version":"89b3d1b267c4380fbb8e5cadccbb284843b90066f16a2f6e8a5b3a030bb7dcfb","impliedFormat":1},{"version":"8514c62ce38e58457d967e9e73f128eedc1378115f712b9eef7127f7c88f82ae","impliedFormat":1},{"version":"01698747a0d3c3ebf261865f9f912658aff9b726f7ebda11e19222725cfb0965","impliedFormat":1},{"version":"9b06ce81ad598c9c6b011cb66182fa66575ad6bd1f8f655830a6a0223a197ab7","impliedFormat":1},{"version":"d9d32f94056181c31f553b32ce41d0ef75004912e27450738d57efcd2409c324","impliedFormat":1},{"version":"752513f35f6cff294ffe02d6027c41373adf7bfa35e593dbfd53d95c203635ee","impliedFormat":1},{"version":"6c800b281b9e89e69165fd11536195488de3ff53004e55905e6c0059a2d8591e","impliedFormat":1},{"version":"7d4254b4c6c67a29d5e7f65e67d72540480ac2cfb041ca484847f5ae70480b62","impliedFormat":1},{"version":"1ee834bfd4a06aafdc46f5542d089565a26e031ebf854ef5b08cb75ec42d68fb","impliedFormat":1},{"version":"8c901126d73f09ecdea4785e9a187d1ac4e793e07da308009db04a7283ec2f37","impliedFormat":1},{"version":"db97922b767bd2675fdfa71e08b49c38b7d2c847a1cc4a7274cb77be23b026f1","impliedFormat":1},{"version":"e2f64b40fe8d3a77d5462dc4a75ead61c76bf464208b506c1465dac4e195f710","impliedFormat":1},{"version":"94fe3281392e1015b22f39535878610b4fa6f1388dc8d78746be3bc4e4bb8950","impliedFormat":1},{"version":"2652448ac55a2010a1f71dd141f828b682298d39728f9871e1cdf8696ef443fd","impliedFormat":1},{"version":"e3a9871a4a736910b0b77bc063d5f9c272578b3743269ebe93b275b0c52a9815","impliedFormat":1},{"version":"120599fd965257b1f4d0ff794bc696162832d9d8467224f4665f713a3119078b","impliedFormat":1},{"version":"5433f33b0a20300cca35d2f229a7fc20b0e8477c44be2affeb21cb464af60c76","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"bd4131091b773973ca5d2326c60b789ab1f5e02d8843b3587effe6e1ea7c9d86","impliedFormat":1},{"version":"c7f6485931085bf010fbaf46880a9b9ec1a285ad9dc8c695a9e936f5a48f34b4","impliedFormat":1},{"version":"73a39452c4b498728757c4a7f756a3b9bed1f8a02c278cb803665cc7897e6930","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"0427df5c06fafc5fe126d14b9becd24160a288deff40e838bfbd92a35f8d0d00","impliedFormat":1},{"version":"191a32cecf67da01119a7bce3132228fa9388e2bbfc5c1662542e71f9f20134a","impliedFormat":1},{"version":"49c346823ba6d4b12278c12c977fb3a31c06b9ca719015978cb145eb86da1c61","impliedFormat":1},{"version":"bfac6e50eaa7e73bb66b7e052c38fdc8ccfc8dbde2777648642af33cf349f7f1","impliedFormat":1},{"version":"92f7c1a4da7fbfd67a2228d1687d5c2e1faa0ba865a94d3550a3941d7527a45d","impliedFormat":1},{"version":"f53b120213a9289d9a26f5af90c4c686dd71d91487a0aa5451a38366c70dc64b","impliedFormat":1},{"version":"83fe880c090afe485a5c02262c0b7cdd76a299a50c48d9bde02be8e908fb4ae6","impliedFormat":1},{"version":"0a372c2d12a259da78e21b25974d2878502f14d89c6d16b97bd9c5017ab1bc12","impliedFormat":1},{"version":"57d67b72e06059adc5e9454de26bbfe567d412b962a501d263c75c2db430f40e","impliedFormat":1},{"version":"6511e4503cf74c469c60aafd6589e4d14d5eb0a25f9bf043dcbecdf65f261972","impliedFormat":1},{"version":"885e0c913a60577fa4827e5412055011a7532124fd9e054febb6808b0d7fec3d","impliedFormat":1},{"version":"6e2261cd9836b2c25eecb13940d92c024ebed7f8efe23c4b084145cd3a13b8a6","impliedFormat":1},{"version":"a67b87d0281c97dfc1197ef28dfe397fc2c865ccd41f7e32b53f647184cc7307","impliedFormat":1},{"version":"771ffb773f1ddd562492a6b9aaca648192ac3f056f0e1d997678ff97dbb6bf9b","impliedFormat":1},{"version":"232f70c0cf2b432f3a6e56a8dc3417103eb162292a9fd376d51a3a9ea5fbbf6f","impliedFormat":1},{"version":"d7ed1f4bd5589cb08f3af26839a0dc2472e4d1a3c380e167f0186b1f5e7c27d3","impliedFormat":1},{"version":"cfb5f0ab72180f4e0b9ed1534847a63d5394b9a8ee685ae149d25fd53f1aec66","impliedFormat":1},{"version":"8a0e762ceb20c7e72504feef83d709468a70af4abccb304f32d6b9bac1129b2c","impliedFormat":1},{"version":"26f83053ec70baea288b5281deb2cf11f6f9ea79bc654db1a6602b0b7ec085ff","impliedFormat":1},{"version":"9252d498a77517aab5d8d4b5eb9d71e4b225bbc7123df9713e08181de63180f6","impliedFormat":1},{"version":"c3b0db2267ff477aa00683219dd8738cd24a930da4df23fecb5910f27e7e49b3","impliedFormat":1},{"version":"35e6379c3f7cb27b111ad4c1aa69538fd8e788ab737b8ff7596a1b40e96f4f90","impliedFormat":1},{"version":"1fffe726740f9787f15b532e1dc870af3cd964dbe29e191e76121aa3dd8693f2","impliedFormat":1},{"version":"a3128a84a9568762a2996df79717d92154d18dd894681fc0ab3a098fa7f8ee3b","affectsGlobalScope":true,"impliedFormat":1},{"version":"4c12b845a35c0f753c1cf29d7d042d4da0206b1ba040a9bfff193a086bcdc248","impliedFormat":1},{"version":"2896c2e673a5d3bd9b4246811f79486a073cbb03950c3d252fba10003c57411a","impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"51bf55bb6eb80f11b3aa59fb0a9571565a7ea304a19381f6da5630f4b2e206c4","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"98a787be42bd92f8c2a37d7df5f13e5992da0d967fab794adbb7ee18370f9849","impliedFormat":1},{"version":"5c96bad5f78466785cdad664c056e9e2802d5482ca5f862ed19ba34ffbb7b3a4","impliedFormat":1},{"version":"b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","impliedFormat":1},{"version":"5f3dc10ae646f375776b4e028d2bed039a93eebbba105694d8b910feebbe8b9c","impliedFormat":1},{"version":"bb0cd7862b72f5eba39909c9889d566e198fcaddf7207c16737d0c2246112678","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"320f4091e33548b554d2214ce5fc31c96631b513dffa806e2e3a60766c8c49d9","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"d90d5f524de38889d1e1dbc2aeef00060d779f8688c02766ddb9ca195e4a713d","impliedFormat":1},{"version":"a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","impliedFormat":1},{"version":"bad68fd0401eb90fe7da408565c8aee9c7a7021c2577aec92fa1382e8876071a","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"fec01479923e169fb52bd4f668dbeef1d7a7ea6e6d491e15617b46f2cacfa37d","impliedFormat":1},{"version":"8a8fb3097ba52f0ae6530ec6ab34e43e316506eb1d9aa29420a4b1e92a81442d","impliedFormat":1},{"version":"44e09c831fefb6fe59b8e65ad8f68a7ecc0e708d152cfcbe7ba6d6080c31c61e","impliedFormat":1},{"version":"1c0a98de1323051010ce5b958ad47bc1c007f7921973123c999300e2b7b0ecc0","impliedFormat":1},{"version":"4655709c9cb3fd6db2b866cab7c418c40ed9533ce8ea4b66b5f17ec2feea46a9","impliedFormat":1},{"version":"87affad8e2243635d3a191fa72ef896842748d812e973b7510a55c6200b3c2a4","impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"2c3a42dbc1d6ef817733691513b6421c8d1aa607afe3601904e3d31f1f72324a","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"330896c1a2b9693edd617be24fbf9e5895d6e18c7955d6c08f028f272b37314d","impliedFormat":1},{"version":"1d9c0a9a6df4e8f29dc84c25c5aa0bb1da5456ebede7a03e03df08bb8b27bae6","impliedFormat":1},{"version":"84380af21da938a567c65ef95aefb5354f676368ee1a1cbb4cae81604a4c7d17","impliedFormat":1},{"version":"1af3e1f2a5d1332e136f8b0b95c0e6c0a02aaabd5092b36b64f3042a03debf28","impliedFormat":1},{"version":"30d8da250766efa99490fc02801047c2c6d72dd0da1bba6581c7e80d1d8842a4","impliedFormat":1},{"version":"03566202f5553bd2d9de22dfab0c61aa163cabb64f0223c08431fb3fc8f70280","impliedFormat":1},{"version":"9a01f12466488eccd8d9eafc8fecb9926c175a4bf4a8f73a07c3bcf8b3363282","impliedFormat":1},{"version":"b80f624162276f24a4ec78b8e86fbee80ca255938e12f8b58e7a8f1a6937120b","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"5bf5c7a44e779790d1eb54c234b668b15e34affa95e78eada73e5757f61ed76a","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"5c634644d45a1b6bc7b05e71e05e52ec04f3d73d9ac85d5927f647a5f965181a","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"a68d4b3182e8d776cdede7ac9630c209a7bfbb59191f99a52479151816ef9f9e","impliedFormat":99},{"version":"39644b343e4e3d748344af8182111e3bbc594930fff0170256567e13bbdbebb0","impliedFormat":99},{"version":"ed7fd5160b47b0de3b1571c5c5578e8e7e3314e33ae0b8ea85a895774ee64749","impliedFormat":99},{"version":"63a7595a5015e65262557f883463f934904959da563b4f788306f699411e9bac","impliedFormat":1},{"version":"9e40365afca304124bc53eb03412643abf074a1580e4dc279a7a16000d11f985","impliedFormat":1},{"version":"4ba137d6553965703b6b55fd2000b4e07ba365f8caeb0359162ad7247f9707a6","impliedFormat":1},{"version":"ceec3c81b2d81f5e3b855d9367c1d4c664ab5046dff8fd56552df015b7ccbe8f","affectsGlobalScope":true,"impliedFormat":1},{"version":"8fac4a15690b27612d8474fb2fc7cc00388df52d169791b78d1a3645d60b4c8b","affectsGlobalScope":true,"impliedFormat":1},{"version":"064ac1c2ac4b2867c2ceaa74bbdce0cb6a4c16e7c31a6497097159c18f74aa7c","impliedFormat":1},{"version":"3dc14e1ab45e497e5d5e4295271d54ff689aeae00b4277979fdd10fa563540ae","impliedFormat":1},{"version":"1d63055b690a582006435ddd3aa9c03aac16a696fac77ce2ed808f3e5a06efab","impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","impliedFormat":1},"f2b3bca04d1bfe583daae1e1f798c92ec24bb6693bd88d0a09ba6802dee362a8",{"version":"93cddca2ec6a5a8a1b942af0459cbd78d1b1b48e576cdabecc82811843a2cc28","impliedFormat":1},{"version":"29c2e5ddccfb04d5383aed2cc1e538e2984f0c198004846d284be45f4e9a7ba7","signature":"9c0eeb8de8dfdfb63ebcef09564c84ae1f6b6187c8e8e274fc5b0ee0a2c8432b"},{"version":"402e5c534fb2b85fa771170595db3ac0dd532112c8fa44fc23f233bc6967488b","impliedFormat":1},{"version":"8885cf05f3e2abf117590bbb951dcf6359e3e5ac462af1c901cfd24c6a6472e2","impliedFormat":1},{"version":"333caa2bfff7f06017f114de738050dd99a765c7eb16571c6d25a38c0d5365dc","impliedFormat":1},{"version":"e61df3640a38d535fd4bc9f4a53aef17c296b58dc4b6394fd576b808dd2fe5e6","impliedFormat":1},{"version":"459920181700cec8cbdf2a5faca127f3f17fd8dd9d9e577ed3f5f3af5d12a2e4","impliedFormat":1},{"version":"4719c209b9c00b579553859407a7e5dcfaa1c472994bd62aa5dd3cc0757eb077","impliedFormat":1},{"version":"7ec359bbc29b69d4063fe7dad0baaf35f1856f914db16b3f4f6e3e1bca4099fa","impliedFormat":1},{"version":"70790a7f0040993ca66ab8a07a059a0f8256e7bb57d968ae945f696cbff4ac7a","impliedFormat":1},{"version":"d1b9a81e99a0050ca7f2d98d7eedc6cda768f0eb9fa90b602e7107433e64c04c","impliedFormat":1},{"version":"a022503e75d6953d0e82c2c564508a5c7f8556fad5d7f971372d2d40479e4034","impliedFormat":1},{"version":"b215c4f0096f108020f666ffcc1f072c81e9f2f95464e894a5d5f34c5ea2a8b1","impliedFormat":1},{"version":"644491cde678bd462bb922c1d0cfab8f17d626b195ccb7f008612dc31f445d2d","impliedFormat":1},{"version":"dfe54dab1fa4961a6bcfba68c4ca955f8b5bbeb5f2ab3c915aa7adaa2eabc03a","impliedFormat":1},{"version":"1251d53755b03cde02466064260bb88fd83c30006a46395b7d9167340bc59b73","impliedFormat":1},{"version":"47865c5e695a382a916b1eedda1b6523145426e48a2eae4647e96b3b5e52024f","impliedFormat":1},{"version":"4cdf27e29feae6c7826cdd5c91751cc35559125e8304f9e7aed8faef97dcf572","impliedFormat":1},{"version":"331b8f71bfae1df25d564f5ea9ee65a0d847c4a94baa45925b6f38c55c7039bf","impliedFormat":1},{"version":"2a771d907aebf9391ac1f50e4ad37952943515eeea0dcc7e78aa08f508294668","impliedFormat":1},{"version":"0146fd6262c3fd3da51cb0254bb6b9a4e42931eb2f56329edd4c199cb9aaf804","impliedFormat":1},{"version":"183f480885db5caa5a8acb833c2be04f98056bdcc5fb29e969ff86e07efe57ab","impliedFormat":99},{"version":"b558c9a18ea4e6e4157124465c3ef1063e64640da139e67be5edb22f534f2f08","impliedFormat":1},{"version":"01374379f82be05d25c08d2f30779fa4a4c41895a18b93b33f14aeef51768692","impliedFormat":1},{"version":"b0dee183d4e65cf938242efaf3d833c6b645afb35039d058496965014f158141","impliedFormat":1},{"version":"c0bbbf84d3fbd85dd60d040c81e8964cc00e38124a52e9c5dcdedf45fea3f213","impliedFormat":1},{"version":"5f3b5c6dd5f53d5066790eef8a99d2eda4486fba31d533a414fe72634425281c","signature":"d09eedef89a79193ae63e9d0769313e534a12c570154280abbc56d79e367c833"},{"version":"e5b87874d208aecc6f6d9b937641833e6ac20ea8168d3a6e97652e15f40a816a","impliedFormat":99},{"version":"be004064f4c3328ef6aa254d01b7a97d507698a6e421a973d32220481727a3e0","impliedFormat":99},{"version":"73e5555643a4bf2820d108777bf94d196297ccb2ddef743f99bd379c31cb61fc","impliedFormat":99},{"version":"68fc7da7956f13295692186c7de9dff30aadc5860ce8fffbb1be39c5fd4624fa","impliedFormat":99},{"version":"d3cfde44f8089768ebb08098c96d01ca260b88bccf238d55eee93f1c620ff5a5","impliedFormat":1},{"version":"293eadad9dead44c6fd1db6de552663c33f215c55a1bfa2802a1bceed88ff0ec","impliedFormat":1},{"version":"833e92c058d033cde3f29a6c7603f517001d1ddd8020bc94d2067a3bc69b2a8e","impliedFormat":1},{"version":"08b2fae7b0f553ad9f79faec864b179fc58bc172e295a70943e8585dd85f600c","impliedFormat":1},{"version":"f12edf1672a94c578eca32216839604f1e1c16b40a1896198deabf99c882b340","impliedFormat":1},{"version":"e3498cf5e428e6c6b9e97bd88736f26d6cf147dedbfa5a8ad3ed8e05e059af8a","impliedFormat":1},{"version":"dba3f34531fd9b1b6e072928b6f885aa4d28dd6789cbd0e93563d43f4b62da53","impliedFormat":1},{"version":"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","impliedFormat":1},{"version":"e4b03ddcf8563b1c0aee782a185286ed85a255ce8a30df8453aade2188bbc904","impliedFormat":1},{"version":"2329d90062487e1eaca87b5e06abcbbeeecf80a82f65f949fd332cfcf824b87b","impliedFormat":1},{"version":"25b3f581e12ede11e5739f57a86e8668fbc0124f6649506def306cad2c59d262","impliedFormat":1},{"version":"4fdb529707247a1a917a4626bfb6a293d52cd8ee57ccf03830ec91d39d606d6d","impliedFormat":1},{"version":"a9ebb67d6bbead6044b43714b50dcb77b8f7541ffe803046fdec1714c1eba206","impliedFormat":1},{"version":"5780b706cece027f0d4444fbb4e1af62dc51e19da7c3d3719f67b22b033859b9","impliedFormat":1},{"version":"73e5555643a4bf2820d108777bf94d196297ccb2ddef743f99bd379c31cb61fc","impliedFormat":99},{"version":"68fc7da7956f13295692186c7de9dff30aadc5860ce8fffbb1be39c5fd4624fa","impliedFormat":99},{"version":"309ebd217636d68cf8784cbc3272c16fb94fb8e969e18b6fe88c35200340aef1","impliedFormat":1},{"version":"91cf9887208be8641244827c18e620166edf7e1c53114930b54eaeaab588a5be","impliedFormat":1},{"version":"ef9b6279acc69002a779d0172916ef22e8be5de2d2469ff2f4bb019a21e89de2","impliedFormat":1},{"version":"9c20e0cce5b7f0a0a46c3a7717d3a9485456769ebfdfd6afa7b5babbcea6f86e","impliedFormat":1},{"version":"88863d76039cc550f8b7688a213dd051ae80d94a883eb99389d6bc4ce21c8688","impliedFormat":1},{"version":"b2732d3b39b116431fb2048679ba11805110bc94c7763d50bfbe98f2a1923882","impliedFormat":1},{"version":"243649afb10d950e7e83ee4d53bd2fbd615bb579a74cf6c1ce10e64402cdf9bb","impliedFormat":1},{"version":"35575179030368798cbcd50da928a275234445c9a0df32d4a2c694b2b3d20439","impliedFormat":1},{"version":"0cf1e5928aae1cca4dcd1a78e19a5833018b84829a116f8fbfab29dc63446a49","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"03268b4d02371bdf514f513797ed3c9eb0840b0724ff6778bda0ef74c35273be","impliedFormat":1},{"version":"3511847babb822e10715a18348d1cbb0dae73c4e4c0a1bcf7cbc12771b310d45","impliedFormat":1},{"version":"add0ce7b77ba5b308492fa68f77f24d1ed1d9148534bdf05ac17c30763fc1a79","impliedFormat":1},{"version":"53f00dc83ccceb8fad22eb3aade64e4bcdb082115f230c8ba3d40f79c835c30e","impliedFormat":1},{"version":"7d94df9d46f72799f956caf7409ae56bd7e754363b0ab6ea7bd865759b679011","impliedFormat":1},{"version":"9078205849121a5d37a642949d687565498da922508eacb0e5a0c3de427f0ae5","impliedFormat":1},{"version":"e8f8f095f137e96dc64b56e59556c02f3c31db4b354801d6ae3b90dceae60240","impliedFormat":1},{"version":"451abef2a26cebb6f54236e68de3c33691e3b47b548fd4c8fa05fd84ab2238ff","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"41f185713d78f7af0253a339927dc04b485f46210d6bc0691cf908e3e8ded2a1","impliedFormat":1},{"version":"7390fbf07c0f9a8148db2824ce1a98dc59bb0156071bd7cb109dac908c120fab","impliedFormat":1},{"version":"ffc3e1064146c1cafda1b0686ae9679ba1fb706b2f415e057be01614bf918dba","impliedFormat":1},{"version":"e27451b24234dfed45f6cf22112a04955183a99c42a2691fb4936d63cfe42761","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"dca963a986285211cfa75b9bb57914538de29585d34217d03b538e6473ac4c44","impliedFormat":1},{"version":"29f823cbe0166e10e7176a94afe609a24b9e5af3858628c541ff8ce1727023cd","impliedFormat":1},"367a12c2e2db88c68626f79ab918cc5fcd814890844b3b6035e6919a9db5210c","290b8dc1951c8c779876524fd99c3273ea47346f65124ac8000efee2838663e1",{"version":"4909bb692b565ddfe777895b8aa5c7824718d39c3f3640ca9b0033e889863d13","signature":"e51ec281349aff51e89cf0b4c3bd44e425f8485d0465a494fcfa79d4c3d5de37"},{"version":"739d0b60c5223835b7ce48ea2fff64ab7e43f0bbcaa55eac0795281422e554b3","signature":"21b832c580e166a405f1ce5d8777db886486ced53a6f6edf0512270f5974618d"},{"version":"7242cd4b39c34b38962ec12a31461e2b6077008567bd574db727d40c98388432","signature":"d2a49c8880f8a4de258564b7bf4ee2eb16c5961386f5532b788437479be39244"},{"version":"f34db05e2ff5083eedbac8cebca5cd53d3fd5c3a60acec41028fd3d633b69860","signature":"87b79fd569bcdf71c08547d45eceadfd769d52e070d3d55e6252790c232d47a6"},{"version":"cef53d4239fe17f3e7c827c4281d343e8efcbc718cefea253e67cb420d3eac9f","signature":"5f5303388c23daf221df682ba0e6ed13924ad3a925fae5ec71f4cdfb6adf1b79"},{"version":"236d66d49bc5f9dda1de6c1a30e7c1d81497e4afcfc61e90a2a491321a9aedfc","signature":"39104c0ab7ff0e8994a3da419b2ea6d46a7a9f67529e2d643bafad2d68f3f6ac"},{"version":"89121c1bf2990f5219bfd802a3e7fc557de447c62058d6af68d6b6348d64499a","impliedFormat":1},{"version":"5c5d901a999dfe64746ef4244618ae0628ac8afdb07975e3d5ed66e33c767ed0","impliedFormat":99},{"version":"85d08536e6cd9787f82261674e7d566421a84d286679db1503432a6ccf9e9625","impliedFormat":99},{"version":"5702b3c2f5d248290ed99419d77ca1cc3e6c29db5847172377659c50e6303768","impliedFormat":99},{"version":"9764b2eb5b4fc0b8951468fb3dbd6cd922d7752343ef5fbf1a7cd3dfcd54a75e","impliedFormat":99},{"version":"1fc2d3fe8f31c52c802c4dee6c0157c5a1d1f6be44ece83c49174e316cf931ad","impliedFormat":99},{"version":"dc4aae103a0c812121d9db1f7a5ea98231801ed405bf577d1c9c46a893177e36","impliedFormat":99},{"version":"106d3f40907ba68d2ad8ce143a68358bad476e1cc4a5c710c11c7dbaac878308","impliedFormat":99},{"version":"42ad582d92b058b88570d5be95393cf0a6c09a29ba9aa44609465b41d39d2534","impliedFormat":99},{"version":"36e051a1e0d2f2a808dbb164d846be09b5d98e8b782b37922a3b75f57ee66698","impliedFormat":99},{"version":"79b4369233a12c6fa4a07301ecb7085802c98f3a77cf9ab97eee27e1656f82e6","impliedFormat":1},{"version":"19990350fca066265b2c190c9b6cde1229f35002ea2d4df8c9e397e9942f6c89","impliedFormat":99},{"version":"8fb8fdda477cd7382477ffda92c2bb7d9f7ef583b1aa531eb6b2dc2f0a206c10","impliedFormat":99},{"version":"66995b0c991b5c5d42eff1d950733f85482c7419f7296ab8952e03718169e379","impliedFormat":99},{"version":"9863f888da357e35e013ca3465b794a490a198226bd8232c2f81fb44e16ff323","impliedFormat":99},{"version":"84bc2d80326a83ee4a6e7cba2fd480b86502660770c0e24da96535af597c9f1e","impliedFormat":99},{"version":"ea27768379b866ee3f5da2419650acdb01125479f7af73580a4bceb25b79e372","impliedFormat":99},{"version":"598931eeb4362542cae5845f95c5f0e45ac668925a40ce201e244d7fe808e965","impliedFormat":99},{"version":"da9ef88cde9f715756da642ad80c4cd87a987f465d325462d6bc2a0b11d202c8","impliedFormat":99},{"version":"b4c6184d78303b0816e779a48bef779b15aea4a66028eb819aac0abee8407dea","impliedFormat":99},{"version":"db085d2171d48938a99e851dafe0e486dce9859e5dfa73c21de5ed3d4d6fb0c5","impliedFormat":99},{"version":"62a3ad1ddd1f5974b3bf105680b3e09420f2230711d6520a521fab2be1a32838","impliedFormat":99},{"version":"a77be6fc44c876bc10c897107f84eaba10790913ebdcad40fcda7e47469b2160","impliedFormat":99},{"version":"06cf55b6da5cef54eaaf51cdc3d4e5ebf16adfdd9ebd20cec7fe719be9ced017","impliedFormat":99},{"version":"91f5dbcdb25d145a56cffe957ec665256827892d779ef108eb2f3864faff523b","impliedFormat":99},{"version":"052ba354bab8fb943e0bc05a0769f7b81d7c3b3c6cd0f5cfa53c7b2da2a525c5","impliedFormat":99},{"version":"927955a3de5857e0a1c575ced5a4245e74e6821d720ed213141347dd1870197f","impliedFormat":99},{"version":"fec804d54cd97dd77e956232fc37dc13f53e160d4bbeeb5489e86eeaa91f7ebd","impliedFormat":99},{"version":"2ccdfd33a753c18e8e5fe8a1eadefff968531d920bc9cdc7e4c97b0c6d3dcaf8","impliedFormat":99},{"version":"d64a434d7fb5040dbe7d5f4911145deda53e281b3f1887b9a610defd51b3c1a2","impliedFormat":99},{"version":"927f406568919fd7cd238ef7fe5e9c5e9ec826f1fff89830e480aff8cfd197da","impliedFormat":99},{"version":"a77d742410fe78bb054d325b690fda75459531db005b62ba0e9371c00163353c","impliedFormat":99},{"version":"f8de61dd3e3c4dc193bb341891d67d3979cb5523a57fcacaf46bf1e6284e6c35","impliedFormat":99},{"version":"43866c6355cd21476b3a5cf0dc422e8a56f7acf5010acf7d9c7ea296b3beed44","impliedFormat":99},{"version":"70a8c15739dae81bdd251aecfa667521beac1ca3d62d5510ef1d168367976efd","impliedFormat":99},{"version":"117fc7342e10087d11eea826713624c5ae6b2d886e4a4a592b1cb6a30e3a1eca","impliedFormat":99},{"version":"c9bb4f55c9b9f1942bd206cce9722107b1653236a2c3805a3ffc1b78e60129a7","impliedFormat":99},{"version":"fc610233291d35d0d2c3a0214f4a46d20ad989c74431b9b5d535141065890e41","impliedFormat":99},{"version":"09b7befce01ae33053c59bcdf1c66502af074023fae5a2729b8a0411e1b94788","impliedFormat":99},{"version":"add39e62eed912ab8defd0c6473b6a4d158e22b6343f960a96825924ac87621c","impliedFormat":99},{"version":"64cd32a60b0316be7adc86fad333ec9befbab241486ecf9b0e867b80acc7e9f1","impliedFormat":99},{"version":"a65735a086ae8b401c1c41b51b41546532670c919fd2cedc1606fd186fcee2d7","impliedFormat":99},{"version":"fe021dbde66bd0d6195d4116dcb4c257966ebc8cfba0f34441839415e9e913e1","impliedFormat":99},{"version":"d52a4b1cabee2c94ed18c741c480a45dd9fed32477dd94a9cc8630a8bc263426","impliedFormat":99},{"version":"d059a52684789e6ef30f8052244cb7c52fb786e4066ac415c50642174cc76d14","impliedFormat":99},{"version":"addca1bb7478ebc3f1c67b710755acc945329875207a3c9befd6b5cbcab12574","impliedFormat":99},{"version":"50b565f4771b6b150cbf3ae31eb815c31f15e2e0f45518958a5f4348a1a01660","impliedFormat":99},{"version":"74958763e089797b627dae00e31679752826f7e91c0818e971be919dacb21c1b","impliedFormat":99},{"version":"2cab237ff67a4f114999005809e65fd586f7fdb56e253e1208cabea827df7e42","impliedFormat":99},{"version":"4e3ab6678655e507463a9bfa1aa39a4a5497fac4c75e5f7f7a16c0b7d001c34a","impliedFormat":99},{"version":"49766a3e83c44708ea1357fa410c309837f4420826a5e265e3fb81e0087c7025","impliedFormat":99},{"version":"9f9fba2db9bb11058b153cdede4ec4e3ceed37d51a18a2edfaf7dfbef0a2b241","impliedFormat":99},{"version":"7a8db4befe8f75591173ae1038856ef6ce3ecfee9e22f1b616779018a8779471","impliedFormat":99},{"version":"006ffd4a92ea7050298f50e44dcc03155b943454bb874c0a5a3ad7c8ae92a50b","impliedFormat":99},{"version":"e981c553d5f18821019546df17a5ade9e26316417279a4e478f28d72cfe6c6f8","impliedFormat":99},{"version":"4b29df4bba7b409b5fa9a8db9f4b672eed5ef80664ff09de5d11724aebc5a30b","impliedFormat":99},{"version":"f5282507ffe12947a832a8d9be748df429b3ef61454df95750fb72ff24108a68","impliedFormat":99},{"version":"22872735dfe76e24d30e89624385361d3d077c8d940257aea9b48d57839c906f","impliedFormat":99},{"version":"bd93deb5a61f121242eb17014a20254b517e411b7144769b2389cc56bb254c40","impliedFormat":99},{"version":"d9de4ffb64c6b08aee469c79e96095f803302e55da3848a4d9197cd63904577d","signature":"841b05b9d63f4a65434027c12ccdd2e277ee6ea9ed4f23382e55afeb98e60439"},{"version":"bd90a34ef05a9ae919456c00208cbecec85ed4b4fd03ad88d55c659627c3b07b","signature":"a6861a72bed1cae361b69956a9d680a181b9774d468210f4868ba9a4bd07610d"},{"version":"309ebd217636d68cf8784cbc3272c16fb94fb8e969e18b6fe88c35200340aef1","impliedFormat":1},{"version":"91cf9887208be8641244827c18e620166edf7e1c53114930b54eaeaab588a5be","impliedFormat":1},{"version":"ef9b6279acc69002a779d0172916ef22e8be5de2d2469ff2f4bb019a21e89de2","impliedFormat":1},{"version":"71623b889c23a332292c85f9bf41469c3f2efa47f81f12c73e14edbcffa270d3","affectsGlobalScope":true,"impliedFormat":1},{"version":"88863d76039cc550f8b7688a213dd051ae80d94a883eb99389d6bc4ce21c8688","impliedFormat":1},{"version":"e9ce511dae7201b833936d13618dff01815a9db2e6c2cc28646e21520c452d6c","impliedFormat":1},{"version":"243649afb10d950e7e83ee4d53bd2fbd615bb579a74cf6c1ce10e64402cdf9bb","impliedFormat":1},{"version":"35575179030368798cbcd50da928a275234445c9a0df32d4a2c694b2b3d20439","impliedFormat":1},{"version":"c939cb12cb000b4ec9c3eca3fe7dee1fe373ccb801237631d9252bad10206d61","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"03268b4d02371bdf514f513797ed3c9eb0840b0724ff6778bda0ef74c35273be","impliedFormat":1},{"version":"3511847babb822e10715a18348d1cbb0dae73c4e4c0a1bcf7cbc12771b310d45","impliedFormat":1},{"version":"80e653fbbec818eecfe95d182dc65a1d107b343d970159a71922ac4491caa0af","impliedFormat":1},{"version":"53f00dc83ccceb8fad22eb3aade64e4bcdb082115f230c8ba3d40f79c835c30e","impliedFormat":1},{"version":"35475931e8b55c4d33bfe3abc79f5673924a0bd4224c7c6108a4e08f3521643c","impliedFormat":1},{"version":"9078205849121a5d37a642949d687565498da922508eacb0e5a0c3de427f0ae5","impliedFormat":1},{"version":"e8f8f095f137e96dc64b56e59556c02f3c31db4b354801d6ae3b90dceae60240","impliedFormat":1},{"version":"451abef2a26cebb6f54236e68de3c33691e3b47b548fd4c8fa05fd84ab2238ff","impliedFormat":1},{"version":"6042774c61ece4ba77b3bf375f15942eb054675b7957882a00c22c0e4fe5865c","impliedFormat":1},{"version":"41f185713d78f7af0253a339927dc04b485f46210d6bc0691cf908e3e8ded2a1","impliedFormat":1},{"version":"23ee410c645f68bd99717527de1586e3eb826f166d654b74250ad92b27311fde","impliedFormat":1},{"version":"ffc3e1064146c1cafda1b0686ae9679ba1fb706b2f415e057be01614bf918dba","impliedFormat":1},{"version":"995869b1ddf66bbcfdb417f7446f610198dcce3280a0ae5c8b332ed985c01855","impliedFormat":1},{"version":"58d65a2803c3b6629b0e18c8bf1bc883a686fcf0333230dd0151ab6e85b74307","impliedFormat":1},{"version":"e818471014c77c103330aee11f00a7a00b37b35500b53ea6f337aefacd6174c9","impliedFormat":1},{"version":"dca963a986285211cfa75b9bb57914538de29585d34217d03b538e6473ac4c44","impliedFormat":1},{"version":"d8bc0c5487582c6d887c32c92d8b4ffb23310146fcb1d82adf4b15c77f57c4ac","impliedFormat":1},{"version":"8cb31102790372bebfd78dd56d6752913b0f3e2cefbeb08375acd9f5ba737155","impliedFormat":1},{"version":"df09e59ace0cf7fd8e3c767b0b8f3d5b2212bd40d4e9dbf49a388526ead5e545","impliedFormat":99},{"version":"c5acf9061cb86da7716d98e12d6e96e2e356641eb0a21b33165653fb2cd6680f","impliedFormat":99},{"version":"ebd02963d7c47cf26f254068e7ad81858433e51e0e5c4ffd7b3b2f6fd0bce17a","impliedFormat":99},{"version":"3a648a8b64b69923c0930df4fa3b390dfa9d61ac0d17cfca55a29d6703db1b42","impliedFormat":99},{"version":"55bb540169182762bc332474d3547675dc00627e00a491b80b01dbc6c9e018fa","impliedFormat":99},{"version":"0f11987bd734a55e04f7ee8376a8f5be9374d887b67a670d076c6a5cc7211226","impliedFormat":99},{"version":"45a02ead1994cac3ac844522b01d603c5c36289259488b794e616f1655ecb7db","impliedFormat":99},{"version":"4dc4c3eca0a15be5bafa5ac220d839188097dfcfb44951221459b9b11e733352","impliedFormat":99},{"version":"aa0af7166f48f67765f96dc70c1d7f9f55ae264b96cadf5b6077b2bc0aa2b5dd","impliedFormat":99},{"version":"2fc9c7c6695b151ffd3ed667d6d793c2f656461978e840eff1d1350fc0bb1ebb","impliedFormat":99},{"version":"4d590f0e0b4abaf693f94d08b5c414928f2571aea5ac6efb97e4646e195dac48","impliedFormat":99},{"version":"bf1655c135bd654637f98f934f9a9eb4d6450194ca2f4968b79263608da59fdd","impliedFormat":99},{"version":"1ebe079cc9ed9ec4cd11d02c70f209caf16e9dd8e1e801a36648ce711bb3c404","impliedFormat":99},{"version":"e96acf03dd1fb9e4088e345cb052aed0f6c4779bbcdf1a4e84a2419cfad9f040","impliedFormat":99},{"version":"db367fd2faba92ed81ca1cb947d94d7bf104dc55caf18c44d2a2b6ac1b1dfafd","impliedFormat":99},{"version":"c18b9de619509cb2e83fb6db359d017de6cb5e9fe2838aed5361623ea44ef56a","impliedFormat":99},{"version":"e0ad85268102b4d552b53de0f93f8d27dc52cebe2ee6ca3f3f4cb88131c6a3a3","impliedFormat":99},{"version":"f6f03c94d64776248cad31d4503b9a5ee102bb1ce99b830a5a74c908927d2459","impliedFormat":99},{"version":"9ba212cc8d5f5e0bbbcdc8b31c1969dcace0d4bb0dc1dbbe14a288617d68a6db","impliedFormat":99},{"version":"d4b914632888f47bee35d94706dce53e9c35481d38a560180779469f4ee9159e","impliedFormat":99},{"version":"c19d8eb43817185ce1210471e1b59269112f6c25fc63fb455fba7b6c74a25bfe","impliedFormat":99},{"version":"647bead3b77e0fc7f2e2bed7a305d8beed67748dc4bc20f0ca174b7b7ecb099e","impliedFormat":99},{"version":"3bf193f73208a3e1c1317565d15b047303a33e3a39c54edb6e78a4d69827d97c","impliedFormat":99},{"version":"52d332b914c6b216f01562bcba195317680c4dfa3e0b6c645f473ecd6a29fc57","impliedFormat":99},{"version":"1d07950c5ceb2865d3d384a76f0c14bdca38c01c87bc1f3ee4df411a0c65a346","impliedFormat":99},{"version":"05301dc91249ca23b960eaf3e5efcd7aa99d493807cc18ddd955a4d0fe113f5c","impliedFormat":99},{"version":"fa473ebc4a55939b20e229501fd9d3aac5f578e4779f0f8f6a6306c848e1632a","impliedFormat":99},{"version":"e7a6ee2d07d956992ee90bf2d4055ca3a15342ba05cc5b7e2e7fd15f69cbfe61","impliedFormat":99},{"version":"487b0dbdebde79164f7b2ea782788737a4252b9040781db6c3a9722e2bb9ecc8","impliedFormat":99},{"version":"b71bbca9b845474bcd410aa47ef73dc14f55384e614e1558d588809f3413374e","impliedFormat":99},{"version":"f69309172758f286bd1d5dd70953ef4ac546fd733a31ad26eec05a456677737e","impliedFormat":99},{"version":"2b75d65afd6f248c992ed04d466a2e47825549c4738bdffb409e5763f5fc7826","impliedFormat":99},{"version":"b67227c32b487f6d4f76b6cfecfef75034390d2b14aed5ee33d1f01b2ac584df","impliedFormat":99},{"version":"663eb800efde225856c1e789ba85b6ec6603e12028473670221333c2c7f3bbb8","impliedFormat":99},{"version":"3936a5aaeb9d200a9b00225d230881437d29002a9b6e9719b4f782a44e215150","impliedFormat":99},{"version":"3fc35b978a159e75f36c8b9f5ae51c95de011eac0a994befd85a03972e06906f","impliedFormat":99},{"version":"0d75677f2e01e829154f73b93af966b3437b2d9565d10fc4eb03175bdb988cb7","impliedFormat":99},{"version":"4c516c6471d8203af3120cee24f3c2c0fb379958d428c5e5bb6ab8228052f683","impliedFormat":99},{"version":"d6513ddef6323a64583ee62ed1a8c9f2dd0ddb755772702181d0855c521e41ac","impliedFormat":99},{"version":"70efc2aa2b0bad5614d70c4697e7c4efb954e868d92c4d750b009c75758ecc07","impliedFormat":99},{"version":"2f8b2550af2d98da27a168baac999bb025cc3e916711b34b03bde2cce68e9be9","impliedFormat":99},{"version":"4cbf4d996793d757ff712ae7bd96b1227a09fb95fac447090d9cce63e0eb9460","impliedFormat":99},{"version":"8cbe9368fca284e894250d336b795a83c64397b574c249d25efe40ba657db8b8","impliedFormat":99},{"version":"f6face0c6f608d87be446227996f9da6b89b1d226ac2cdbcf0454714c69e5287","impliedFormat":99},{"version":"cbaa48aef231497ab562060d3742707984c43a9d0e2ee28da7abb2efe4a0b392","impliedFormat":99},{"version":"e1951d09be373ebc5370c0eff4af4a86e841251df119e6727e97e7ca714fc6ff","impliedFormat":99},{"version":"de2c2da9e6d8390e0f60cbe4b94dc4e1ea6f613e38418408da8de133958662c4","impliedFormat":99},{"version":"285c03dafff17a2767cd0a23f93912dc5e0f3ff7ac3c9da4a80cdfee9979452c","impliedFormat":99},{"version":"9c70dde5822201db2c3f208eb8d95f463caa103d211b49399569dfcd0f394a92","impliedFormat":99},{"version":"fcbc330594ee211b8e7eb56f4ec59175ab239288ecc7749634e665dee33ca181","impliedFormat":99},{"version":"5743905ac2de3204bcd9768fdeaec993fed8291bde54094ddabfa7f28573936d","impliedFormat":99},{"version":"643700414df81efee3059191cc2759c29623ff95f462190a0e4a6afe2c1640eb","impliedFormat":99},{"version":"707669372976b9a569b6ac40c5aafd61b6f9d03c12f60c06cfad234c73d18369","impliedFormat":99},{"version":"20640c93feb6d5f926e147456f6d19bcf3648d52d17ed1d62bd11cdee59761ca","impliedFormat":99},{"version":"ea88eb7247f90f0de73f3617a700625fc1b8c037ff03f4665534b978f3c3fd01","impliedFormat":99},{"version":"d6cb4d8b3499d80fb3d17e1911c6290928ef5a4d1a7751bca143bbef441012d9","impliedFormat":99},{"version":"b2ec10940611f3311aa42fce3bb65d3476b4eb48a00e9a93d1f85b6989c79500","impliedFormat":99},{"version":"b345d1cb103363741f885729eb562931b5bffb63d06acd6cf634212ea945cb9e","impliedFormat":99},{"version":"fd1a6d390ef510226ddf46350854d278a53738921cbb9e4de78bf7b6105df48d","impliedFormat":99},{"version":"ebddf120f55aa3a40cc08b374dd9077d1e497730c41ac124e66de3341f1dd83e","impliedFormat":99},{"version":"53c89482e50d4edcb80e217cf20d9126c6a595bc204ee834131d372895160018","impliedFormat":99},{"version":"7322a3401773f0c9fa87c7ef2ee13e0c660a5a926507ae8aca263bb3f4b2334e","impliedFormat":99},{"version":"deab327003debcefe7668fa28d2373b5a3c40b258f7948496b57ced275bb3eb3","impliedFormat":99},{"version":"fca8f9bf4b3544e8f293725684ae0a982e234504ce08b5dd4a477e06c3c792c5","impliedFormat":99},{"version":"5d17ad04870e5304037f31da3cc752da331e2b70ce333fb3c14a8884709a95b3","impliedFormat":99},{"version":"c65d7fae88667583386f30789ef1a77041df5a210f73338c34125a1bd4d98f7e","impliedFormat":99},{"version":"c7497efbdffb6c2db351d59da966c8a316207ad90e34bd3e46df7c01c157e11a","impliedFormat":99},{"version":"88779dc6d2d69b984969c2ac9450b512f8b4c54beae5bd51025b3e7b3909145c","impliedFormat":99},{"version":"a3a613da8d5a5b13af698d39b09fff499efdb0e8f536ab242e84c13370e3fce2","impliedFormat":99},{"version":"e161d627db35259f52c3eea227dab5483e0de833299fd7bc61823071927cda60","impliedFormat":99},{"version":"0ab06534ed1471f55971306ebd9151f2843d39e926f182773edc44afae2b3035","impliedFormat":99},{"version":"17e3178d17edec81153b214b3b8b1167c8951130100919a709d8157a117a12b6","impliedFormat":99},{"version":"c940f913dc8325a06b5abdaaa3a10651aeb6af99ccf2dd91cae6c3729fef8f81","impliedFormat":99},{"version":"3fd14efbc5a75b0a0ca5d581549b796f6e19b50d40a0ad4f67205fcb19274ee6","impliedFormat":99},{"version":"00dd58e1e52bdfd6c0b9d4dd3756014bbb02d1c3fb377d92a70a19893e1f33cd","impliedFormat":99},{"version":"8c147b2524e908e635a0fd569febe08152ec0b53152b5841e3d678474728f33b","impliedFormat":99},{"version":"a513595cad81255731831101bd714d77c3c7fadb3d5ebf1829d77fe025124b77","impliedFormat":99},{"version":"4ee05c416af71157410043a44a0803671e03c8bfca346d6f832ea047334b1cb6","impliedFormat":99},{"version":"1e74e54ccc165f3ddbe5460e2c6cc6c8aa2d3145a094d1b67c237303f61bb022","impliedFormat":99},{"version":"2e7bc808bf8376a838bc8a63edd68215cc3fb89ef6dfbd5bb679cd4d2827b43b","impliedFormat":99},{"version":"a6e51e0a926dc2b2b2d08512fea404d66095cc305765aaaa636918a34eaed159","impliedFormat":99},{"version":"7cf96480652b73719ce014b24ad8ac9c97620c64ee6acf8005be75d5b0988929","impliedFormat":99},{"version":"2f7c95858885b15628d20c06d1b41d2b91b6b4cd3dfc8e1389a1446420e6a74b","impliedFormat":99},{"version":"72ae884c8c22be1964b1911e84ce375bc5bdeccc25509b6333216a65c6c4a5e2","impliedFormat":99},{"version":"b02e828785ad66c35216229f1de36d28fecccaaf5b287dee5475932fb8b50219","impliedFormat":99},{"version":"053dd60a1bd76248ab2a7613fe365295525670e7d27264bece2b19053ddefec5","impliedFormat":99},{"version":"5d6ef65ccf14b0d51af503adffccdbaa846848cf0fe82310816cf82eb364d107","impliedFormat":99},{"version":"6c5bccbebab44e389a90c9302393910cd796e024e55ae1aae14bffd791f99464","impliedFormat":99},{"version":"71a747ae19d152aa688d767408ca753168ddd756fac5b9dba79461949433e00f","impliedFormat":99},{"version":"f7f93c42c4e7b5972e78f7b62fb00271c545d4f5247c23a9a263dbbcd968d906","impliedFormat":99},{"version":"2efba86762e23c705bc4ca720ebd84f94dc7b6565e268cf96ea504acdc2a52ef","impliedFormat":99},{"version":"4be799bfee1766047c11b3b5d371ca9e3993526d50c3e276e7cdb3943dd680a6","impliedFormat":99},{"version":"6d6c78dd576e10af137436f02d785194ead22da4a785f37bfc9fa793fb3b73ce","impliedFormat":99},{"version":"3e57fd3a8f13addca1c32a9a792e63d21baa4fcf706d23930f01ea312afacb04","impliedFormat":99},{"version":"38e61720edb6523a2ff0c62d2b06160d9b1c5916f8b04d3bf31e93f370fd5a29","impliedFormat":99},{"version":"f4cda2ff97e70f9f017b9b80bb5cd3e4570f3a527628562de2bf178af995d126","impliedFormat":99},{"version":"ebe9d82154a3bf6a6af680c3dcc6921b911624ea8f60699235c9c65fca087c3f","impliedFormat":99},{"version":"456bf57ef493ec750b79ffe7849813631db7b60827f36786cb672049a131d376","impliedFormat":99},{"version":"5f94250b6f8f598b1c42e624702098872b3afdf2ae6e391a02be7c0549aa64e7","impliedFormat":99},{"version":"1b2dfd1acca60e1782f8682e82860db220ae34c13a78e6795ad28c16a1146158","impliedFormat":99},{"version":"a40a75b4d4010077a911591554902897e1dd013f8a85225b6037a62f7056d437","impliedFormat":99},{"version":"ee8e06eaf1522a5e00fbfaa6473fea44dd74afd6f4e95f9da1a89af671aa2918","impliedFormat":99},{"version":"cb42b5a11ea87d65efb0aa44e08a3ca428542612c1b423066eb5f511afdf2533","impliedFormat":99},{"version":"bd883a743f4ce1d3206b3079446c2f6d2f806520bf9b8971ccd7d7fd983ce868","impliedFormat":99},{"version":"9e22adacca7d1de31f486abe4cbce49203c103d4530700a5c6f632f1c51f03eb","impliedFormat":99},{"version":"710d8a9f9860482a9467a7470bb47352a7a0efc7380c07228d3c9f51ef442bc4","impliedFormat":99},{"version":"995564ce50215678ed1a073b9eb63b5243c3b67e4edf44df299ccc0a8374cbe2","impliedFormat":99},{"version":"72d3929f8a6326462f3965821c38b8da7283081048ad4fbbe5a6b894b2467460","impliedFormat":99},{"version":"5515019e3a6ebbd431a945b6a43f31d139ae4b93e0a5ae91a915e02caef1832c","impliedFormat":99},{"version":"eb0ca7737f9fbc78b265201c1ac5fb93a26a0a0c457501f23097607318da6251","impliedFormat":99},{"version":"9f054267c51ac465965d91c20fd5057fd36cea9bd4656d514f4bebcade9c911a","impliedFormat":99},{"version":"e0586a07833fd675c3a32ffde2e1f586720759e8016cdcd535163e845fadb6fa","impliedFormat":99},{"version":"75c4008fe916b067ee4ddef78222d33024327da376289e9cbb100f356e117a03","impliedFormat":99},{"version":"85ad7a1017cff3848472528d792291038ebaf44b049a3afcaf0db612fa1b23a0","impliedFormat":99},{"version":"086c76363400b2153572922a22facb6a3cbb6dc6c3266cd75b7a4c55b564f8ae","impliedFormat":99},{"version":"ba883ef1d897a12d7e8a1c7347a20d733a5cd508eedc3fc0a3090fbbac936bc5","impliedFormat":99},{"version":"d8220fa464578acebc7fc4af92f2c57f8395025875a7eadb2ac69e0ddb9ac43d","impliedFormat":99},{"version":"9096832f382f5b5cb27ba00faa8c231d562623db74fc4025b0aba6bd233b8818","impliedFormat":99},{"version":"22b54bbe3779cb65ac35e420f96ec152a90be7a785b80ef9fa499d73b1ec58f1","impliedFormat":99},{"version":"178ae1eaa5cd24618fec31c62ee6b66f5f57d76b075d9d8b34cc0db5543c0fec","impliedFormat":99},{"version":"4dacb781ef89e1e92bed4d756f3b5941b19862083c124c0a50cf9aa225d78482","impliedFormat":99},{"version":"9aba87f9132dd2043482a72d3df5b2eff6aca78e0e8d7939253a7fcfc004b344","impliedFormat":99},{"version":"5fee9904e02e1475a281704b9afe8fc962e40084df5dffff4b4395dc7d552da2","impliedFormat":99},{"version":"dc9226ce99210a4a6ed075475c46292018f6a77eb038b65f860f05b883dbe0a7","impliedFormat":99},{"version":"f29d44cfd07de9939378795273c4232c8430a950ffdfac7010438b03577477e6","impliedFormat":99},{"version":"228e796062abd583bd87436562070d78425a0166aeac16b63459983b02acedb3","impliedFormat":99},{"version":"f5c623592de0fe3277e4195f52950c8d1f81e920d9be54682f609573b5503ba6","impliedFormat":99},{"version":"8002100726ad65ae695ef88b091b9c8cb73e024eaf23b31d228a5a8ce19af31f","impliedFormat":99},{"version":"22ad4f64a29216936a641bc51587ad5c4d2e843643091ebea4f9d0a472b8692c","impliedFormat":99},{"version":"0661abac34d843381137240cdd238d481637f5023ad952046b24a627c256194c","impliedFormat":99},{"version":"0cf60f5f3c66ac7b22d1e4a685c0b513328688886cb879394089f42f993e43a5","impliedFormat":99},{"version":"de8a83b2cb7e7f44e73155dd613e24141d97acdefc668333ea2b64d3a4ea7ae2","impliedFormat":99},{"version":"0b5a8af5558892fcd5c250a2dd2140f285dcc51672dd309fde24cef92836e6fa","impliedFormat":99},{"version":"c6ccfcc54bd078a3d99c51a06bcf779b15149a22471a70c54eefab43e3353ba1","impliedFormat":99},{"version":"8887205714f61e6586adf32374134738e460b4d8cfe03d513a38999913862daf","impliedFormat":99},{"version":"e1e593588e6cf59347c7a20017b214ac4b00562f6a2ec8e5c609e0ae965075f6","impliedFormat":99},{"version":"276367f57e2b9e574e1ca1a48eb22072a60d906295c96bd7aeafad5fc3d08b77","impliedFormat":99},{"version":"31d4161e79a2eeecae8e3f859da4d3d9afb1e6f3dfe1dc66380450a54c97528f","impliedFormat":99},{"version":"83b25a220cfdfa0e7590f1296945a56cf5f071461affa11651c8d0b059572aa7","impliedFormat":99},{"version":"1494274584ccf5a2af0572f0c3107739ed59b15aa96990db50fd8116eb4b3ccd","impliedFormat":99},{"version":"f4cf2ee04922bedeaacbc3f52e261c0b7c2fc8f81a5ed2299b4f50816d5e268b","impliedFormat":99},{"version":"bca68928478692b05d4ec10e88e725f29915437a5374e660c6cfbaf044c1930d","impliedFormat":99},{"version":"10f1dd47fe245c2fe7c27a4c9c066d8402b1d68991ab34c252ada59cbdfcc78b","impliedFormat":99},{"version":"790bef520dfac9dd348fe22c53568f048c6cb3ce21a8e3f046d01e8c0a66a943","impliedFormat":99},{"version":"f201350305673baab74b8917bf96149b3322d9806c683d510267d9a139b44900","impliedFormat":99},{"version":"d1893af3d12efecdb31c4062a82a92ce789e4d34aeb2a218c301c2c486d4fc78","impliedFormat":99},{"version":"25822bc7f060daf4c5f2e5fa075b2caf7f8bdedcbbab000269a97ff45f974745","impliedFormat":99},{"version":"da9e88283164077cae7301cdbb258966dde1d8a67e6af6b05c7a18349dde6321","impliedFormat":99},{"version":"e3f384585923f83d37a4ef1b75d1642632349c27e8f629acf23ea835877ddef3","impliedFormat":99},{"version":"44f0f5e119fb798c76d39c0383689991b25353639007a62d59224f2b8d88e004","impliedFormat":99},{"version":"3bb5c33e46d256998d12908375054dad7d82c6ccb866fd9e0fef3dac96acc402","impliedFormat":99},{"version":"c01a88ada696e9f65a4dd8248bd9a568a3f1ce0c2eaa5e7f8696a2c3b3573654","impliedFormat":99},{"version":"8bdede5bed57c1bb12a501cbd8ef0e0779c449c435b2b67b4074de4a6efabdfe","impliedFormat":99},{"version":"77bdf606434a7182de2ae5fe635523a95eccaf0c144f91df95e102a7c46c97a2","impliedFormat":99},{"version":"8d95114eac22e8ef4f8665a186d6608b55206f8d34a426c980dc9d2cd18b1e0d","impliedFormat":99},{"version":"b382cb44e04f416c8d67b5b6f1d2b118d01add9d9a98e7864fbf192c830f1efa","impliedFormat":99},{"version":"6ee2350f8ff32fa2bd3d379814f2d8a52063226b59c3d7379d83bd77d8683a87","impliedFormat":99},{"version":"ab84dfaa666066aaefee2739103b45c01c44c187e646b9020917f81c19793d4b","impliedFormat":99},{"version":"b1b4aa28430990a9f1bea96d31efe0583470cdd85244b74aa58074459a7a3518","impliedFormat":99},{"version":"ddba6ad2106348564085490c92de42a6d398377f9c806c30aafd67a8889ca4b7","impliedFormat":99},{"version":"465e84b9e824d62c531c6003c66f1bc73ba508bf60aa5c9797e2e3a4ec7a108b","impliedFormat":99},{"version":"156d4e8169fa27ddebf8c26b1158180fce5fca563216c8c16bdc2c5db663296e","impliedFormat":99},{"version":"3228a0ec21ce9bc0453a93d7d4c0c9b22bc06649457385e2113911293793717b","impliedFormat":99},{"version":"ceff24a8c06a2b16792aae8426b706018c4234e8504acf1cbba8ee6b79390161","impliedFormat":99},{"version":"1cce3949d58c46bc0764c89482a0be2b58d0b2a94a15e3147c88e73359658a40","impliedFormat":99},{"version":"7322c128662ae51bafb78bfa85a03e3da779b52e72d164c1bf22cdc65236270c","impliedFormat":99},{"version":"9a40c1020a86217fb3131a564315af933ce48aa1ef9264545bb1a2b410adb15c","impliedFormat":99},{"version":"0a8f0977ee6ed9db6042459c08fe444e7ef4a4b1b6d349d72655d90543aafff6","impliedFormat":99},{"version":"922d235d0784fdc0437ae8c038372fabb0b874486b65a47774fa34bda34dff3b","impliedFormat":99},{"version":"dc5aff116a7790b183c5f09e94f83a7c7e608c6085e6ad75b1629a83f5fc6c36","impliedFormat":99},{"version":"4d9e83ce19109b83aec7c181865a6c17a629130bcd7859dd9a09bc22725e347d","impliedFormat":99},{"version":"484b9305a7ff05e1028722f4a992db637cb6e31197490763deae399b36849d3e","impliedFormat":99},{"version":"d171cc95b1171193ecd8c047145fbb1644021394a18efcee1f3adb422ac36200","impliedFormat":99},{"version":"a09f4987f2ebde2a6b46bc5ca4b021b50ef09a01466b6545b0a2e7defcbeeb59","impliedFormat":99},{"version":"c9f95e2f5326df254b2c867de54f7264763065fa4d29f5f9d10960d97352afcf","impliedFormat":99},{"version":"0b4ba5551e44d84fd641b8f06eb3df38aa343d2c23a1358ad1b61f001764bf5f","impliedFormat":99},{"version":"ad0d9cecb6cf3ca943759fb015f684b455700272602349bc9754efdd5c73b2ae","impliedFormat":99},{"version":"4b75bbb5000a38175a6e728aaab07b10dda25c887c10f22c036261cba87471d2","impliedFormat":99},{"version":"cd4143e44f649e0c2674f3e3c1f6623f6f48342945214de732111944f8fa7e50","impliedFormat":99},{"version":"daf0673602c9217ac44106c295b579681811096ec2fa57a3fcd4d6470eaac8b8","impliedFormat":99},{"version":"c30a39369f4c75dc0d040f08e544f4b658ea695ce416be68ecf26c205e41ae5d","impliedFormat":99},{"version":"6da1127d73b53b3295d75624872a91cbac0eab602cb68ef8473d1414038e0408","impliedFormat":99},{"version":"8026ee081397a1ebdbdf20ddde81471c23d4c5e10038d110223505a8f32b77fd","impliedFormat":99},{"version":"4b1049d3aabfab678c821cdfa9c753c6adf33251ddda47d47059e00ce13f916a","impliedFormat":99},{"version":"941f6d0f05176fa7112d76b4f6f47326242500e112f3bb52868d17ac58e907fd","impliedFormat":99},{"version":"938edca549e0a6e4682f3324fc7c8a67f8944ab0c2dbdc8a54afd933c69e135f","impliedFormat":99},{"version":"3b2ac31bb38b7b625e5c5a69834dfe310248fb42edd297ca682de50d44555b1b","impliedFormat":99},{"version":"735331968e5f9c95e860641150eee5cd76e3f4d32d91d308fd31ba96bcecc49f","impliedFormat":99},{"version":"02353129e38fd07cc487b5f822ac710ec117e43e479e9f9f8039418ed3291ff5","impliedFormat":99},{"version":"54bd44d1d220488406919d2ddbdb92cef690c8ebfe41d2cdc61a8aaf26d6396c","impliedFormat":99},{"version":"59166f97779bdf70c8f36b8aeba6676d9b9ff64a256c9976e906eedfb6b87ae1","impliedFormat":99},{"version":"88f2b0ad065d1ff42736c1efeb0e14061b3091d9376c272672be3f27d167a152","impliedFormat":99},{"version":"5b6aef51a17a2533ddcb1460c8381462c10ee6e59ebdef99cd98176a738d7ba4","impliedFormat":99},{"version":"39841a65b5d4421d8f9e40b0f968a20ddd6ec345ccb24fae316ec02718916dd4","impliedFormat":99},{"version":"be922b6a92064b78554dfbf46decbddf5a0b023f49a656a7865e17ab0bf710c8","impliedFormat":99},{"version":"b8f0d69d3bcdf8894d0e10e4a4eb3d2cb3fc27fd3ea5802a9b2c1ba025690fc9","impliedFormat":99},{"version":"6431a32a41a7a92213bccdd8f1cac95bc4038896c6b36eb816946f6ebd1de07d","affectsGlobalScope":true,"impliedFormat":99},{"version":"8a6161ab51e94182d29dc5d4663db8d67aca7d4d43edce0f134b6d4dfaa42f2d","impliedFormat":99},{"version":"4b2fee8608e19bffaf53670f0af416bb2d3b84d2f9e319883f35804f195c6269","impliedFormat":99},{"version":"73fcba8699b817135e8217d4cb242403b8e97f2286afc4886778373fd7f5d687","impliedFormat":99},{"version":"4033b35f38b85606d366e29401cd63bb44b11c631fbe530e7cb6dea285dbce1e","impliedFormat":99},{"version":"6fca4a007c11a2cb5cfe738643b21c59127d45d8ac3356c1fcce8d2ea5c9b2ed","impliedFormat":99},{"version":"53c5c0ad9ed0605c92add7c41b57b99dce5cdabbf7ca05748d5555883d6dd486","impliedFormat":99},{"version":"5a13364736cf0eee277e0ea30431627ad754b51c96b95da0e5cae0155ba48d6d","impliedFormat":99},{"version":"aaf2c6a7eb583c145f1bd2491cced2654160785a4ba146dd57bb3ad8d1ad756c","impliedFormat":99},{"version":"b7e920c3467c6146140f4b95c402aef269731c2ba92299efe2eec22dcc71f30b","impliedFormat":99},{"version":"adb4426a3053d8d0f06b034134b939a2ebad9a29a07c595b9c70c736e4a52911","impliedFormat":99},{"version":"945740c51603a9a460909d8a5a6e32463a5c0cc2aa09ee7b928f2d72b6090734","impliedFormat":99},{"version":"b21436fd1ac202941df49d04311e510a742003849e46278a074829d016ff7e5c","impliedFormat":99},{"version":"8f8d4762a569fb8826e41be03a2fdf21f8c9f3f0d6ff42b7e7e68ef563855756","impliedFormat":99},{"version":"e7c940ea5bcfe1616f567f6a505b4b6fe5caef9e34d26988ef0a1fb40a3abbe1","impliedFormat":99},{"version":"2ef6dc247554af42f4a3e3c8e21742cae4599fa05f59a9c2504e982f508adbbc","impliedFormat":99},{"version":"e37e763321474ae8dfc20fce7462479a7b93fa151e0416ddbca263422e18d26b","impliedFormat":99},{"version":"92e145f2246906544d0fa367ef29239783441fa3e434e16f074d89804149ad29","impliedFormat":99},{"version":"4232ec8f460c0485c081f91381162bbdff18fe2de916770a4e946ce12388b4d1","impliedFormat":99},{"version":"49d3dacad2aa3680975ed967177cd45a49e0aa39811686269014941fd28356c8","impliedFormat":99},{"version":"775485ad2851461363171bd9b3f7807d3f2b612f0a20ab80e59f048632255a29","impliedFormat":99},{"version":"2c94d2217244dd31275ca5e404560c5c2105b5f06f8985d0f039f39caa1e9e30","impliedFormat":99},{"version":"9c88b05bdfe9898787a8776baaacc92b0499b0083905032bd9f3615a3135c26f","impliedFormat":99},{"version":"1e95f09a13a9555c87a921646cb1a2b2647476f73c4135af2e2c0e33c44b6c08","impliedFormat":99},{"version":"507029db6003a8e49680a599deb3898856d23b218c69900d2bba4083c1a34a97","impliedFormat":99},{"version":"7eda1f0806110518d3f03d78f93925af494ac263872eea3a85a5bfebd2b48bcb","impliedFormat":99},{"version":"28f91b1c0b330f4102efd145b38c6e07509220c0a214dded8aef3d3d469df6aa","impliedFormat":99},{"version":"afab761b301923855eb2a1849d23fe9d1dfee534fd986f6c227ed520d02a2d59","impliedFormat":99},{"version":"6da7497c314303f19ba36082297c9347ac524e7e9789714f688893fc786f4f9e","impliedFormat":99},{"version":"ae6a3e4c8c1119fe1bb44f8aed2f0f4b135fd42f7da862e144557ec897b5739a","impliedFormat":99},{"version":"35a7f9a074b2a6d3376eaa2046db7af262b632076d6888956a62785307691a46","impliedFormat":99},{"version":"b5548c7600a9b944d52aed0074767d92ac85cbef42521e8baacd71055338383c","impliedFormat":99},{"version":"f037ed5250876c6be9ed862687f133a35242b367681db9147f03dd7de2fef358","impliedFormat":99},{"version":"4712d78270086b6e4307b499ac7e45149c576bfc7e1ab4aa0b9b93d6cca923ec","impliedFormat":99},{"version":"e06d432a94dc47f95de8488b0b4bdde54b888b1b0632eb946d7b112fa5c14eac","impliedFormat":99},{"version":"1ef7446acfc034c230c2a783d271d1032321f029396453511eed15243b41cb59","impliedFormat":99},{"version":"86cf1a2280404a0607abb5849f3136dad6df1cd16da64fe907699ee36f937206","impliedFormat":99},{"version":"75fd7bc87b6b5ce7460b1bd5f7ccdd949c149211612893574c530ceaebed5cbb","impliedFormat":99},{"version":"e61ccfac1b24d6feede2dd2afba891e6b288830ae71102459496f22560fcc004","impliedFormat":99},{"version":"49a26201f50fa9a816e0931156323d9a4029891ddc5ee40792c57b1afb8cdff4","impliedFormat":99},{"version":"56cadc658182ee85d96ac84a5d31139eae2545aaf62cd1effaf0db5aa6b70e05","impliedFormat":99},{"version":"1586ef3a163f46a7db0481bd8fbb88a261e30d547f4a2f4a835e849d41025ba6","impliedFormat":99},{"version":"c5937640e2d65a7738ccbc1c8f5b9e78d630ebd5fb8593eef5e30b4ea99b8d2f","impliedFormat":99},{"version":"8e7628593ebe34ec1022035f7683a2ef92bb9cb531c07fbdc0fea64928f4ea7b","impliedFormat":99},{"version":"f4a377ca062dc8a02a638f2eb10b6c94e198aaf91728e346f748301565c99658","impliedFormat":99},{"version":"10c0fe874f64e1a821a0e6f6ecba3d2082db08011e96f86168c26fefc6588236","impliedFormat":99},{"version":"746ffa1873008cd4f50d2ebad2c4e67a42e00eb36cb007630a8c664bbf193227","impliedFormat":99},{"version":"3ab3564a240e86c68ed9057a868c721998ca17123dc7cdd29d8018199be73342","impliedFormat":99},{"version":"1d246c73f66479fb9676aa7bdb713ce9a712e0785b7957f5bf450a8dcb8106be","impliedFormat":99},{"version":"86373a2c826bc505376b8baadaf1961628b065aa0820c89abf1cb7abfbd07afb","impliedFormat":99},{"version":"a051b97de62cd18a86ea252ac37ee07640d3cf6d66aeeb126aa4c41f3c4ce3fe","impliedFormat":99},{"version":"6d00a86fe567e3fc0a389c30e49f23e14aec923345eff22f5c95507305a5fac6","impliedFormat":99},{"version":"e9214291673a507e06de72638d08cb77a5a83946ff371fe3118231fd14b66148","impliedFormat":99},{"version":"6afd93aec340602a842a3fd846432339eed3581ee1328e65dc9ddf04967681d0","impliedFormat":99},{"version":"40405e75f72dd4fe99bb2fdbb7d2b2e0d12eca86da8df669bafec4466616f57c","impliedFormat":99},{"version":"f9ecc480939f38ffab76c67e071fe69cfff07b49100170b59100010ba5a65f0a","impliedFormat":99},{"version":"d4e4495cc8b784ea848a29cfe457722c6dbedd8d766627ea1f4eac3b113ddf31","impliedFormat":99},{"version":"d8e02aa2838623274cd72e3e379f931ce28af86202d05cc4310f4a9d03408c61","impliedFormat":99},{"version":"7bb53546e9bd6e3f22804497a41d4b885674e7b15b7d64c7d3f83722dfd2b456","impliedFormat":1},{"version":"4083e6d84bfe72b0835b600185c7b7ce321da3d6053f866859185eefc161e7a0","impliedFormat":1},{"version":"b883e245dc30c73b655ffe175712cac82981fc999d6284685f0ed7c1dac8aa6f","impliedFormat":1},{"version":"626e3504b81883fa94578c2a97eff345fadc5eae17a57c39f585655eef5b8272","impliedFormat":1},{"version":"e9a15eeba29ceb0ee109dd5e0282d2877d8165d87251f2ea9741a82685a25c61","impliedFormat":1},{"version":"c6cb06cc021d9149301f3c51762a387f9d7571feed74273b157d934c56857fac","impliedFormat":1},{"version":"cd7c133395a1c72e7c9e546f62292f839819f50a8aa46050f8588b63ef56df88","impliedFormat":1},{"version":"196f5f74208ce4accea017450ed2abc9ce4ab13c29a9ea543db4c2d715a19183","impliedFormat":1},{"version":"4687c961ab2e3107379f139d22932253afb7dd52e75a18890e70d4a376cdf5d9","impliedFormat":1},{"version":"ae8cfe2e3bdef3705fc294d07869a0ab8a52d9b623d1cc0482b6fc2be262b015","impliedFormat":1},{"version":"94c8e9c00244bbf1c868ca526b12b4db1fab144e3f5e18af3591b5b471854157","impliedFormat":1},{"version":"827d576995f67a6205c0f048ae32f6a1cf7bda9a7a76917ab286ef11d7987fd7","impliedFormat":1},{"version":"cb5dc83310a61d2bb351ddcdcaa6ec1cf60cc965d26ce6f156a28b4062e96ab2","impliedFormat":1},{"version":"0091cb2456a823e123fe76faa8b94dea81db421770d9a9c9ade1b111abe0fcd1","impliedFormat":1},{"version":"034d811fd7fb2262ad35b21df0ecab14fdd513e25dbf563572068e3f083957d9","impliedFormat":1},{"version":"298bcc906dd21d62b56731f9233795cd11d88e062329f5df7cdb4e499207cdd4","impliedFormat":1},{"version":"f7e64be58c24f2f0b7116bed8f8c17e6543ddcdc1f46861d5c54217b4a47d731","impliedFormat":1},{"version":"966394e0405e675ca1282edbfa5140df86cb6dc025e0f957985f059fe4b9d5d6","impliedFormat":1},{"version":"b0587deb3f251b7ad289240c54b7c41161bb6488807d1f713e0a14c540cbcaee","impliedFormat":1},{"version":"4254aab77d0092cab52b34c2e0ab235f24f82a5e557f11d5409ae02213386e29","impliedFormat":1},{"version":"19db45929fad543b26b12504ee4e3ff7d9a8bddc1fc3ed39723c2259e3a4590f","impliedFormat":1},{"version":"b21934bebe4cd01c02953ab8d17be4d33d69057afdb5469be3956e84a09a8d99","impliedFormat":1},{"version":"b2b734c414d440c92a17fd409fa8dac89f425031a6fc7843bac765c6c174d1ca","impliedFormat":1},{"version":"239f39e8ad95065f5188a7acd8dbefbbbf94d9e00c460ffdc331e24bc1f63a54","impliedFormat":1},{"version":"d44f78893cb79e00e16a028e3023a65c1f2968352378e8e323f8c8f88b8da495","impliedFormat":1},{"version":"32afc9daae92391cb4efeb0d2dac779dc0fb17c69be0eb171fd5ed7f7908eeb4","impliedFormat":1},{"version":"b835c6e093ad9cda87d376c248735f7e4081f64d304b7c54a688f1276875cbf0","impliedFormat":1},{"version":"a9eabe1d0b20e967a18758a77884fbd61b897d72a57ddd9bf7ea6ef1a3f4514b","impliedFormat":1},{"version":"64c5059e7d7a80fe99d7dad639f3ba765f8d5b42c5b265275d7cd68f8426be75","impliedFormat":1},{"version":"05dc1970dc02c54db14d23ff7a30af00efbd7735313aa8af45c4fd4f5c3d3a33","impliedFormat":1},{"version":"a0caf07fe750954ad4cf079c5cf036be2191a758c2700424085ffde6af60d185","impliedFormat":1},{"version":"1ea59d0d71022de8ea1c98a3f88d452ad5701c7f85e74ddaa0b3b9a34ed0e81c","impliedFormat":1},{"version":"eab89b3aa37e9e48b2679f4abe685d56ac371daa8fbe68526c6b0c914eb28474","impliedFormat":1},{"version":"4d1a9c5960c005d2fe9cf5f5a6bc70850149ea0454666f133595a6acd6b593e3","impliedFormat":99},{"version":"8439d349f53c599dae7d7b9df3382688b1cf167e6da1fc6cfa3aef4c54a3b0b6","impliedFormat":99},{"version":"b3881d7a0becfe1d507a36f40f2d8cbaa1a682cdb5570e24761ac0396142b8be","impliedFormat":99},{"version":"361afaeb04e8fedb5f4c85a61086200bdc302b62a58852091d7bc1e3dff34986","impliedFormat":99},{"version":"59f471a26313fc2bccfadf56191a55b704a1dfbafaa7c3f2c37e25de8a1e9c14","impliedFormat":99},{"version":"42fc44363e281c50d570d28f0336d364d904244435c515f6973fed990ca7925f","impliedFormat":99},{"version":"0bb96d1b7886f8348ee457c22db99c258f563e6e4371410c8c0137c54f8b6332","impliedFormat":99},{"version":"107dec9919e26cd898658841caac2186b3b10ca2e81ba0ecc9407ac989b0b860","impliedFormat":99},{"version":"a6f32c6ebdf43913196c351ed0152695f0d76dbe8226002e2d6654835e0cb685","impliedFormat":99},{"version":"66c41552364289ef6eb841fdbc2eeb7d40b2c79cf2d92009cc1537e4d5d7454b","impliedFormat":99},{"version":"f72856f3920a6baf267ca04fe086e1e00034953931fcac9ed59f1e651c444eec","impliedFormat":99},{"version":"ee10a6b8d4948616a923e953b40dd564d87f4c6c960353a4ab40f9ac5953508a","impliedFormat":99},{"version":"616f4301604d5263a177d9d378a417940ee51f4661dc970c446265139b3dc2d7","impliedFormat":99},{"version":"cc8621f4a86f09a9d63af2008516e3284fa8dee2da7ac3e010a7a344267e9fb9","impliedFormat":99},{"version":"da37f3e19d6e2b5bb10cc3c6bcb5d2e84c4d5cb9bd9a12ba05ee43c9200a9b23","impliedFormat":99},{"version":"99e7111361e06b6f5262371d764116a5faa69f021d74c8c3ae1584d5a486a75c","impliedFormat":99},{"version":"7d3d9f991564d3cec0a7d5d75c1aa89cbaeeb8184106d0a92c0e54ec01420103","impliedFormat":99},{"version":"b9481313926f4e6c25941bb0fb426c1ad764e3fba09bad9519f4c8532ff26210","impliedFormat":99},{"version":"b9a223bbab79b9a07ba163672633095a6b92c602bd3b28e39ba5a66519cc478f","impliedFormat":99},{"version":"7a48c5cd1ba5cb5497f020e8af6df1d6632072548b1b6079815bb2d46a76793b","impliedFormat":99},{"version":"12d19496f25ecd6afef2094be494b3b0ae12c02bd631901f6da760c7540a5ec1","impliedFormat":1},{"version":"c6fe327c538417b8dd5b9bb32abcd7911534b10da3a4514f3445cdb28cf3abf2","impliedFormat":99},{"version":"0065cdb7ac9f5b19921632de63f888ec2cc11ad57f7fc868f44bf0faad2fce3e","impliedFormat":99},{"version":"8c1adc3171d0287f3a26f4891a7d1834c89999573a9b444aa5ff519dcc43a2b7","impliedFormat":99},{"version":"27aee784c447854a4719f11058579e49f08faa70d06d8e30abe00f5e25538de6","impliedFormat":99},{"version":"fbc610f9dde70f0bbea39eefec2e31ca1d99f715e9c71fb118bd2306a832bcb5","impliedFormat":99},{"version":"a829052855dca3affb8e2ef0afa0f013b03fa9b55762348b1fba76d9c2741c99","impliedFormat":99},{"version":"1d61288b34b2dd2029b85bc70fabbb1da90c2a370396d5df5f620e62eb47ddbe","impliedFormat":99},{"version":"5a2cf4cd852a58131b320da62269b2143850920ce27e8fdec41fed5c2c54ec95","impliedFormat":99},{"version":"43552100e757fad5a9bb5dabc0ea24ba3b6f2632eb1a4be8915da39d65e83e1c","impliedFormat":99},{"version":"6a99940a8a76a1aa20ae6f2afd8e909e47e0b17df939e7cf5a585171480655ff","impliedFormat":99},{"version":"043195af0b52aadd10713870dd60369df0377ed153104b26e6bac1213b19f63e","impliedFormat":99},{"version":"ad17a36132569045ab97c8e5badf8febb556011a8ed7b2776ff823967d6d5aca","impliedFormat":99},{"version":"698d2b22251dbbfc0735e2d6ed350addead9ad031fac48b8bb316e0103d865db","impliedFormat":99},{"version":"7298d28b75c52e89c0b3e5681eac19e14480132cd30baaba5e5ca10211a740ef","impliedFormat":99},{"version":"ff10facf373a13d2864ff4de38c4892d74be27d9c6468dac49c08adabbf9b0eb","impliedFormat":99},{"version":"97b1cf4599cc3bc2e84b997aa1af60d91ca489d96bea0e20aaff0e52a5504b29","impliedFormat":99},{"version":"853dfbcd0999d3edc6be547d83dc0e0d75bf44530365b9583e75519d35984c35","impliedFormat":99},{"version":"9c80bed388d4ed47080423402db9cb1b35a31449045a83a0487f4dfde3d9d747","impliedFormat":99},{"version":"f29bc6a122a4a26c4e23289daae3aa845a18af10da90989cb8b51987e962b7be","impliedFormat":99},{"version":"3a1f39e098971c10633a064bd7a5dbdec464fcf3864300772763c16aa24457f9","impliedFormat":99},{"version":"20e614d6e045d687c3f7d707561b7655ad6177e859afc0c55649b7e346704c77","impliedFormat":99},{"version":"aa0ae1910ba709bc9db460bdc89a6a24d262be1fbea99451bedac8cbbc5fb0cd","impliedFormat":99},{"version":"161d113c2a8b8484de2916480c7ba505c81633d201200d12678f7f91b7a086f0","impliedFormat":99},{"version":"b998a57d4f43e32ac50a1a11f4505e1d7f71c3b87f155c140debe40df10386c8","impliedFormat":99},{"version":"5710e8ed9797ae0042e815eb8f87df2956cb1bf912939c9b98eeb58494a63c13","impliedFormat":99},{"version":"a6bb421dccfec767dbd3e99180b24c07c4a216c0fd549f54a3313f6ce3f9d2c7","impliedFormat":99},{"version":"3b6f1be46f573b1c1f3e6cd949890bfb96b40ff90b6f313e425a379c1c4d5d77","impliedFormat":99},{"version":"28a2c54d0a78d32c29f7279ca04dc6c7860c008579e4e3033938c0ed0201eb9a","impliedFormat":99},{"version":"c2714a402843287624210a47ebea2b1c8dd3ad1438f448633f6831e31eaf37b8","impliedFormat":99},{"version":"b89945ec6707415d739f3e76f2820982d4927dc6b681910b3c433b5ad261b817","impliedFormat":99},{"version":"a72d5822fb2a2c1ef985b30aed889f4c00342c90e12318762fccc550c6a599cf","impliedFormat":99},{"version":"c8616ab60eda93ca87fbb20aada1d6a6cdbcd2cb181a70a2d7728a3cb0613391","impliedFormat":99},{"version":"eeddfd3e0b09890822068de5248d38144f8328e74b5292847eb4e558d8aba8cb","impliedFormat":99},{"version":"d4dc0b6592543314c8549c71e35ad2ec4a57904662d905ff9585836bde1c855a","impliedFormat":99},{"version":"56e1687a174cd10912a35a4676af434bb213aafa5d4371040986c578afe644ab","impliedFormat":99},{"version":"470c280cc484340b97d0942e0c3aa312399eba3849ceb95312d0d7413bac7458","impliedFormat":99},{"version":"ae183f4a6300aad2be92cdbd4dd12d8bcd36eddf8dd1846f998c237235fe0c33","impliedFormat":99},{"version":"4b0eeffddaf51b967e95926a825a6ba1205b81b3a8fecddbe21eaf0e86bdee91","impliedFormat":99},{"version":"bf3ec0d42e33e487c359a989b30e1c9e90fa06de484dc4751e93fb34a9b5cf90","impliedFormat":99},{"version":"7b9656a61d83df1a46c38c2984dbf96dd057bf48f477ddf3f8990311ab98ec23","impliedFormat":99},{"version":"366b85ddb698f3a035e0caa68dc9fef39a85c4368c0810eaf937c3a3c63ac31e","impliedFormat":99},{"version":"d440ee730bc60a5c605903842e398863e7ecdb7a91fc32a9152f14061bf6cc17","impliedFormat":99},{"version":"a12c86c4a691608d19a75320946c80bbce38bb62c091dda32572aee7158edd38","impliedFormat":99},{"version":"3109cb3f8ab0308d2944c26742b6a8a02b4a4ffc23f479a81f0e945d6a6721dd","impliedFormat":99},{"version":"a2289c12a987f2a06f4cf049afde4fdc9455a4af37913445148865938c6eb613","impliedFormat":99},{"version":"55933c1450edcfaf166429425dbbad0a27c0ae8672d5ab5d427e46946a6f2f63","impliedFormat":99},{"version":"6c684fda6998db4112e82367c9e82e27996dc8086a10d58ac9b51d89770d5f9d","impliedFormat":99},{"version":"5c4b4dd983471fcaed17ad3241c98a1f880729f1ca579ddbcdae7e0bf04035df","impliedFormat":99},{"version":"9e430429c7e9e70071a836ac91a1bf6e6651f91d47d9f4baf0a92eefc6130818","impliedFormat":99},{"version":"b3db7f6d7ef72669dc83fa1ff7b90a2ec31d1d8f82778f2a00ef6d101f5247e5","impliedFormat":99},{"version":"354f61bd2a5acaf20462bc4d61048aa25f8fc0dd04dfe3d2f30bdbabbab54e7d","impliedFormat":99},{"version":"d51756340928e549f076c832d7bc2b4180385597b0b4daaa50e422bed53e1a72","impliedFormat":99},{"version":"32c6e3ef96f2bcbc1db7d7f891459241657633aa663cab6812fb28ade7c90608","impliedFormat":99},{"version":"ac2ea00eb8f73665842e57e729e14c6d3feabe9859dc5e87a1ed451b20b889e4","impliedFormat":99},{"version":"730cb342a128f5a8a036ffbd6dbc1135b623ce2100cefe1e1817bb8845bc7100","impliedFormat":99},{"version":"78e387f16df573a98dd51b3c86d023ddbd5bf68e510711a9fee8340e7ccc3703","impliedFormat":99},{"version":"e2381c64702025b4d57b005e94ed0b994b5592488d76f1e5f67f59d1860ebb70","impliedFormat":99},{"version":"d7dfcb039ff9cff38ccd48d2cc1ba95ca45c316670eddbcf81784e21b7128692","impliedFormat":99},{"version":"acaf0a60eb243938f7742df08bf5d52482fbea033fd27141ee3a6d878bbb0d3d","impliedFormat":99},{"version":"fb89aeecfc8eb28f5677c2c89bced74d13442b7f4ebd01ce2ce92127d1b36d69","impliedFormat":99},{"version":"9e91cb0a5bd7aefa2b94a2872828d6d2321df0ca44412e74d99e8b94e579b7d8","impliedFormat":99},{"version":"3e4f06b464ef1654b91be02777d1773ccc5d43b53c1c8b0a9794ec224cfe8928","impliedFormat":99},{"version":"192c1a207b44af476190ae66920636de5d56c33b57206bbc2421adc23f673e2e","impliedFormat":99},{"version":"e5aa35b3740170492e06e60989d35a222cfda2148507c650ea55753f726c9213","impliedFormat":99},{"version":"057aa42f6983120c35373aed62b219ffcbd7b476b2df08709139a9eb8dfeed26","impliedFormat":99},{"version":"95a0c46b4675d4d02de6a7c167738f1176b53b26ebec9ccfe8e5d9acb0dc7aee","impliedFormat":99},{"version":"94ad4d9745811c482ae3bad61e5b206e0904f77e0dacf783199193a3df9f6ce6","impliedFormat":99},{"version":"407dc18ecd25802296fade17be81d0d4f499ae75fe88ed132f94e7efdad269e2","impliedFormat":99},{"version":"77dabe31d44c48782c529d5c9acddc41f799bf9b424b259596131efc77355478","impliedFormat":99},{"version":"f6dfe21d867aa5e13bc53d536b69b66427f571707a01e7c3604dc51ded097313","impliedFormat":99},{"version":"4ecd02d0e4ccf7befb9c28802c6c208060e33291d56fd1868900ca295c399077","impliedFormat":99},{"version":"37ada75be4b3f6b888f538091020d81b2a0ad721dc42734f70f639fa4703a5c8","impliedFormat":99},{"version":"aa73ff0024d5434a3e87ea2824f6faece7aad7b9f6c22bd399268241ca051dc7","impliedFormat":99},{"version":"4c9fb50b0697756bab3e4095f28839cf5b55430a4744d2ebbaf850ec8dca54d8","impliedFormat":99},{"version":"782868b723c055c5612c4a243f72a78a8b3c0c3b707ae04954e36e8ab966df4c","impliedFormat":99},{"version":"3de9d9ad4876972e7599fc0b3bddb0fddb1923be75787480a599045a30f14292","impliedFormat":99},{"version":"0f4b3c05937bbdb9cf954722ddc97cd72624e3b810f6f2cf4be334adb1796ec1","impliedFormat":99},{"version":"9fc243c4c87d8560348501080341e923be2e70bf7b5e09a1b26c585d97ae8535","impliedFormat":99},{"version":"4f97089fe15655ae448c9d005bb9a87cc4e599b155edc9e115738c87aa788464","impliedFormat":99},{"version":"f948d562d0a8085f1bd17b50798d5032529a75c147f40adfeb4fd3e453368643","impliedFormat":99},{"version":"22929f9874783b059156ee3cfa864d6f718e1abf9c139f298a037ae0274186f6","impliedFormat":99},{"version":"c72a7c316459b2e872ca4a9aca36cc05d1354798cee10077c57ff34a34440ac2","impliedFormat":99},{"version":"3e5bbf8893b975875f5325ebf790ab1ab38a4173f295ffea2ed1f108d9b1512c","impliedFormat":99},{"version":"9e4a38448c1d26d4503cf408cc96f81b7440a3f0a95d2741df2459fe29807f67","impliedFormat":99},{"version":"84124d21216da35986f92d4d7d1192ca54620baeca32b267d6d7f08b5db00df9","impliedFormat":99},{"version":"efba354914a2dc1056a55510188b6ced85ead18c5d10cc8a767b534e2db4b11b","impliedFormat":99},{"version":"25f5bf39f0785a2976d0af5ac02f5c18ca759cde62bc48dd1d0d99871d9ad86f","impliedFormat":99},{"version":"e711fa7718a2060058ff98ac6bff494c1615b9d42c4f03aa9c8270bc34927164","impliedFormat":99},{"version":"e324b2143fa6e32fac37ed9021b88815e181b045a9f17dbb555b72d55e47cdc1","impliedFormat":99},{"version":"3e90ea83e3803a3da248229e3027a01428c3b3de0f3029f86c121dc76c5cdcc2","impliedFormat":99},{"version":"9368c3e26559a30ad3431d461f3e1b9060ab1d59413f9576e37e19aaf2458041","impliedFormat":99},{"version":"915e5bb8e0e5e65f1dc5f5f36b53872ffcdcaef53903e1c5db7338ea0d57587a","impliedFormat":99},{"version":"92cf986f065f18496f7fcb4f135bff8692588c5973e6c270d523191ef13525ad","impliedFormat":99},{"version":"652f2bd447e7135918bc14c74b964e5fe48f0ba10ff05e96ed325c45ac2e65fb","impliedFormat":99},{"version":"cc2156d0ec0f00ff121ce1a91e23bd2f35b5ab310129ad9f920ddaf1a18c2a4d","impliedFormat":99},{"version":"7b371e5d6e44e49b5c4ff88312ae00e11ab798cfcdd629dee13edc97f32133d8","impliedFormat":99},{"version":"e9166dab89930e97bb2ce6fc18bcc328de1287b1d6e42c2349a0f136fc1f73e6","impliedFormat":99},{"version":"6dc0813d9091dfaed7d19df0c5a079ee72e0248ce5e412562c5633913900be25","impliedFormat":99},{"version":"e704c601079399b3f2ec4acdfc4c761f5fe42f533feaaab7d2c1c1528248ca3e","impliedFormat":99},{"version":"49104d28daa32b15716179e61d76b343635c40763d75fe11369f681a8346b976","impliedFormat":99},{"version":"04cd3418706b1851d2c1d394644775626529c23e615a829b8abfe26ec0ee3aef","impliedFormat":99},{"version":"21e459e9485fc48f21708d946c102e4aaa4a87b4c9ad178e1c5667e3ff6bbc59","impliedFormat":99},{"version":"97e685ac984fc93dcdae6c24f733a7a466274c103fdcf5d3b028eaa9245f59d6","impliedFormat":99},{"version":"68526ea8f3bbf75a95f63a3629bebe3eb8a8d2f81af790ce40bc6aad352a0c12","impliedFormat":99},{"version":"bcab57f5fe8791f2576249dfcc21a688ecf2a5929348cfe94bf3eb152cff8205","impliedFormat":99},{"version":"b5428f35f4ebf7ea46652b0158181d9c709e40a0182e93034b291a9dc53718d8","impliedFormat":99},{"version":"0afcd28553038bca2db622646c1e7fcf3fb6a1c4d3b919ef205a6014edeeae0f","impliedFormat":99},{"version":"ee016606dd83ceedc6340f36c9873fbc319a864948bc88837e71bd3b99fdb4f6","impliedFormat":99},{"version":"0e09ffe659fdd2e452e1cbe4159a51059ae4b2de7c9a02227553f69b82303234","impliedFormat":99},{"version":"4126cb6e6864f09ca50c23a6986f74e8744e6216f08c0e1fe91ab16260dab248","impliedFormat":99},{"version":"4927dba9193c224e56aa3e71474d17623d78a236d58711d8f517322bd752b320","impliedFormat":99},{"version":"3d3f189177511d1452e7095471e3e7854b8c44d94443485dc21f6599c2161921","impliedFormat":99},{"version":"bb0519ff5ef245bbf829d51ad1f90002de702b536691f25334136864be259ec5","impliedFormat":99},{"version":"a64e28f2333ea0324632cf81fd73dc0f7090525547a76308cb1dfe5dab96596a","impliedFormat":99},{"version":"883f9faa0229f5d114f8c89dadd186d0bdf60bdafe94d67d886e0e3b81a3372e","impliedFormat":99},{"version":"d204b9ae964f73721d593e97c54fc55f7fd67de826ce9e9f14b1e762190f23d1","impliedFormat":99},{"version":"91830d20b424859e5582a141efe9a799dc520b5cce17d61b579fb053c9a6cd85","impliedFormat":99},{"version":"68115cdc58303bad32e2b6d59e821ccaada2c3fb63f964df7bd4b2ebd6735e80","impliedFormat":99},{"version":"ee27e47098f1d0955c8a70a50ab89eb0d033d28c5f2d76e071d8f52a804afe07","impliedFormat":99},{"version":"7957b11f126c6af955dc2e08a1288013260f9ec2776ff8cc69045270643bf43e","impliedFormat":99},{"version":"d010efe139c8bb78497dc7185dddbbcefc84d3059b5d8549c26221257818a961","impliedFormat":99},{"version":"85059ed9b6605d92c753daf3a534855ba944be69ff1a12ab4eca28cefbabd07a","impliedFormat":99},{"version":"687208233ae7a969baa2d0c565c9f24eb4cb1e64d6cfb30f71afec9e929e58c2","impliedFormat":99},{"version":"ea68a96f4e2ba9ca97d557b7080fbdb7f6e6cf781bb6d2e084e54da2ac2bb36c","impliedFormat":99},{"version":"879de92d0104d490be2f9571face192664ec9b45e87afd3f024dbbf18afb4399","impliedFormat":99},{"version":"424df1d45a2602f93010cb92967dfe76c3fcadad77d59deb9ca9f7ab76995d40","impliedFormat":99},{"version":"21f96085ed19d415725c5a7d665de964f8283cacef43957de10bdd0333721cc4","impliedFormat":99},{"version":"e8d4da9e0859c6d41c4f1c3f4d0e70446554ba6a6ab91e470f01af6a2dcac9bf","impliedFormat":99},{"version":"2e2421a3eec7afefa5a1344a6852d6fee6304678e2d4ee5380b7805f0ac8b58a","impliedFormat":99},{"version":"a10fd5d76a2aaba572bec4143a35ff58912e81f107aa9e6d97f0cd11e4f12483","impliedFormat":99},{"version":"1215f54401c4af167783d0f88f5bfb2dcb6f0dacf48495607920229a84005538","impliedFormat":99},{"version":"476f8eb2ea60d8ad6b2e9a056fdda655b13fd891b73556b85ef0e2af4f764180","impliedFormat":99},{"version":"2fe93aef0ee58eaa1b22a9b93c8d8279fe94490160703e1aabeff026591f8300","impliedFormat":99},{"version":"bbb02e695c037f84947e56da3485bb0d0da9493ed005fa59e4b3c5bc6d448529","impliedFormat":99},{"version":"ba666b3ab51c8bc916c0cebc11a23f4afec6c504c767fd5f0228358f7d285322","impliedFormat":99},{"version":"c10972922d1887fe48ed1722e04ab963e85e1ac12263a167edef9b804a2af097","impliedFormat":99},{"version":"6efeacbd1759ea57a4c7264eb766c531ae0ab2c00385294be58bc5031ef43ad1","impliedFormat":99},{"version":"1c261f5504d0175be4f1b6b99f101f4c3a129a5a29fc768e65c52d6861ca5784","impliedFormat":99},{"version":"f0e69b5877b378d47cbac219992b851e2bbc0f7e3a3d3579d67496dabd341ec4","impliedFormat":99},{"version":"b5ea27f19a54feca5621f5ba36a51026128ea98e7777e5d47f08b79637527cf5","impliedFormat":99},{"version":"b54890769fa3c34ab3eb7e315b474f52d5237c86c35f17d59eb21541e7078f11","impliedFormat":99},{"version":"c133db4b6c17a96db7fa36607c59151dec1e5364d9444cbe15e8c0ea4943861e","impliedFormat":99},{"version":"3a0514f77606d399838431166a0da6dbd9f3c7914eae5bbfbd603e3b6a552959","impliedFormat":99},{"version":"fa568f8d605595e1cffbfca3e8c8c492cf88ae2c6ed151f6c64acf0f9e8c25d8","impliedFormat":99},{"version":"c76fb65cb2eb09a0ee91f02ff5b43a607b94a12c34d16d005b2c0afc62870766","impliedFormat":99},{"version":"cf7af60a0d4308a150df0ab01985aabb1128638df2c22dd81a2f5b74495a3e45","impliedFormat":99},{"version":"913bbf31f6b3a7388b0c92c39aec4e2b5dba6711bf3b04d065bd80c85b6da007","impliedFormat":99},{"version":"42d8c168ca861f0a5b3c4c1a91ff299f07e07c2dd31532cd586fd1ee7b5e3ae6","impliedFormat":99},{"version":"a29faa7cb35193109ec1777562ca52c72e7382ffe9916b26859b5874ad61ff29","impliedFormat":99},{"version":"15bdf2eeef95500ba9f1602896e288cb425e50462b77a07fa4ca23f1068abb21","impliedFormat":99},{"version":"452db58fd828ab87401f6cecc9a44e75fa40716cc4be80a6f66cf0a43c5a60cc","impliedFormat":99},{"version":"54592d0215a3fd239a6aa773b1e1a448dc598b7be6ce9554629cd006ee63a9d6","impliedFormat":99},{"version":"9ee28966bb038151e21e240234f81c6ba5be6fde90b07a9e57d4d84ae8bc030c","impliedFormat":99},{"version":"2fe1c1b2b8a41c22a4e44b0ac7316323d1627d8c72f3f898fa979e8b60d83753","impliedFormat":99},{"version":"956e43b28b5244b27fdb431a1737a90f68c042e162673769330947a8d727d399","impliedFormat":99},{"version":"92a2034da56c329a965c55fd7cffb31ccb293627c7295a114a2ccd19ab558d28","impliedFormat":99},{"version":"c1b7957cd42a98ab392ef9027565404e5826d290a2b3239a81fbac51970b2e63","impliedFormat":99},{"version":"4861ee34a633706bcbba4ea64216f52c82c0b972f3e790b14cf02202994d87c5","impliedFormat":99},{"version":"7af4e33f8b95528de005282d6cca852c48d293655dd7118ad3ce3d4e2790146f","impliedFormat":99},{"version":"df345b8d5bf736526fb45ae28992d043b2716838a128d73a47b18efffe90ffa7","impliedFormat":99},{"version":"d22c5b9861c5fc08ccd129b5fc3dcdc7536e053c0c1d463f3ab39820f751c923","impliedFormat":99},{"version":"dcc38f415a89780b34d827b45493d6dbadb05447d194feb4498172e508c416ac","impliedFormat":99},{"version":"7e917e3b599572a2dd9cfa58ff1f68fda9e659537c077a2c08380b2f2b14f523","impliedFormat":99},{"version":"20b108e922abd1c1966c3f7eb79e530d9ac2140e5f51bfa90f299ad5a3180cf9","impliedFormat":99},{"version":"2bc82315d4e4ed88dc470778e2351a11bc32d57e5141807e4cdb612727848740","impliedFormat":99},{"version":"e2dd1e90801b6cd63705f8e641e41efd1e65abd5fce082ef66d472ba1e7b531b","impliedFormat":99},{"version":"a3cb22545f99760ba147eec92816f8a96222fbb95d62e00706a4c0637176df28","impliedFormat":99},{"version":"287671a0fe52f3e017a58a7395fd8e00f1d7cd9af974a8c4b2baf35cfda63cfa","impliedFormat":99},{"version":"e2cdad7543a43a2fb6ed9b5928821558a03665d3632c95e3212094358ae5896b","impliedFormat":99},{"version":"326a980e72f7b9426be0805774c04838e95195b467bea2072189cefe708e9be7","impliedFormat":99},{"version":"e3588e9db86c6eaa572c313a23bf10f7f2f8370e62972996ac79b99da065acaa","impliedFormat":99},{"version":"1f4700278d1383d6b53ef1f5aecd88e84d1b7e77578761838ffac8e305655c29","impliedFormat":99},{"version":"6362a4854c52419f71f14d3fee88b3b434d1e89dcd58a970e9a82602c0fd707a","impliedFormat":99},{"version":"fb1cc1e09d57dfeb315875453a228948b904cbe1450aaf8fda396ff58364a740","impliedFormat":99},{"version":"50652ed03ea16011bb20e5fa5251301bb7e88c80a6bf0c2ea7ed469be353923b","impliedFormat":99},{"version":"d388e0c1c9a42d59ce88412d3f6ce111f63ce2ff558e0a3f84510092431dfee0","impliedFormat":99},{"version":"35ea0a1e995aef5ae19b1553548a793c76eb31bdf7fef30bc74656660c3a09c3","impliedFormat":99},{"version":"56f4ae4e34cbff1e4158ccada4feea68a357bae86adb3bedaa65260d0af579df","impliedFormat":99},{"version":"6eebdacf8e85b2cf70ad7a2f43ead1f8acccfd214ab57ff1d989e9e35661015d","impliedFormat":99},{"version":"a4f90a12cbfac13b45d256697ce70a6b4227790ca2bf3898ffd2359c19eab4eb","impliedFormat":99},{"version":"4a6c2ac831cff2d8fa846dfb010ee5f7afce3f1b9bd294298ee54fdc555f1161","impliedFormat":99},{"version":"a8d491b4eb728dab387933a518d9e1f32d5c9d5a5225ff134d847b0c8cc9c8ce","impliedFormat":99},{"version":"668f628ae1f164dcf6ea8f334ea6a629d5d1a8e7a2754245720a8326ff7f1dc0","impliedFormat":99},{"version":"5105c00e1ae2c0a17c4061e552fa9ec8c74ec41f69359b8719cb88523781018e","impliedFormat":99},{"version":"d2c033af6f2ea426de4657177f0e548ee5bed6756c618a8b3b296c424e542388","impliedFormat":99},{"version":"2d4530d6228c27906cb4351f0b6af52ff761a7fab728622c5f67e946f55f7f00","impliedFormat":99},{"version":"ec359d001e98bf56b0e06b4882bd1421fd088d4d181dff3138f52175c0582a51","impliedFormat":99},{"version":"45be28de10e6f91aacb29fbd2955ba65a0fd3d1b5fddefece9c381043e91e68d","impliedFormat":99},{"version":"77dabe31d44c48782c529d5c9acddc41f799bf9b424b259596131efc77355478","impliedFormat":99},{"version":"6801ebe0b7ab3b24832bc352e939302f481496b5d90b3bc128c00823990d7c7d","impliedFormat":99},{"version":"0abb1feddc76a0283c7e8e8910c28b366612a71f8bfdd5ca42271d7ad96e50b2","impliedFormat":99},{"version":"ac56b2f316b70d6a727fdbbcfa8d124bcd1798c293487acb2b27a43b5c886bb0","impliedFormat":99},{"version":"d849376baf73ec0b17ffd29de702a2fdbbe0c0390ec91bebf12b6732bf430d29","impliedFormat":99},{"version":"40dcd290c10cc7b04a55f7ee5c76f77250f48022cea1624eba2c0589753993b4","impliedFormat":99},{"version":"0f9c9f7d13a5cf1c63eb56318b6ae4dfa2accef1122b2e88b5ed1c22a4f24e3b","impliedFormat":99},{"version":"9c4178832d47d29c9af3b1377c6b019f7813828887b80bb96777393f700eb260","impliedFormat":99},{"version":"dddb8672a0a6d0e51958d539beb906669a0f1d3be87425aaa0ae3141a9ad6402","impliedFormat":99},{"version":"6b514d5159d0d189675a1d5a707ba068a6da6bc097afb2828aae0c98d8b32f08","impliedFormat":99},{"version":"39d7dbcfec85393fedc8c7cf62ee93f7e97c67605279492b085723b54ccaca8e","impliedFormat":99},{"version":"81882f1fa8d1e43debb7fa1c71f50aa14b81de8c94a7a75db803bb714a9d4e27","impliedFormat":99},{"version":"c727a1218e119f1549b56dd0057e721d67cfa456c060174bac8a5594d95cdb2d","impliedFormat":99},{"version":"bca335fd821572e3f8f1522f6c3999b0bc1fe3782b4d443c317df57c925543ed","impliedFormat":99},{"version":"73332a05f142e33969f9a9b4fb9c12b08b57f09ada25eb3bb94194ca035dc83d","impliedFormat":99},{"version":"c366621e6a8febe9bbca8c26275a1272d99a45440156ca11c860df7aa9d97e6d","impliedFormat":99},{"version":"d9397a54c21d12091a2c9f1d6e40d23baa327ae0b5989462a7a4c6e88e360781","impliedFormat":99},{"version":"dc0e2f7f4d1f850eb20e226de8e751d29d35254b36aa34412509e74d79348b75","impliedFormat":99},{"version":"af3102f6aec26d237c750decefdc7a37d167226bb1f90af80e1e900ceb197659","impliedFormat":99},{"version":"dea1773a15722931fbfe48c14a2a1e1ad4b06a9d9f315b6323ee112c0522c814","impliedFormat":99},{"version":"b26e3175cf5cee8367964e73647d215d1bf38be594ac5362a096c611c0e2eea8","impliedFormat":99},{"version":"4280093ace6386de2a0d941b04cff77dda252f59a0c08282bd3d41ccc79f1a50","impliedFormat":99},{"version":"fe17427083904947a4125a325d5e2afa3a3d34adaedf6630170886a74803f4a2","impliedFormat":99},{"version":"0246f9f332b3c3171dcdd10edafab6eccb918c04b2509a74e251f82e8d423fb7","impliedFormat":99},{"version":"f6ef33c2ff6bbdf1654609a6ca52e74600d16d933fda1893f969fc922160d4d7","impliedFormat":99},{"version":"1abd22816a0d992fd33b3465bf17a5c8066bf13a8c6ca4fc0cd28884b495762d","impliedFormat":99},{"version":"82032a08169ea01cf01aa5fd3f7a02f1f417697df5e42fc27d811d23450bc28d","impliedFormat":99},{"version":"9c8cbd1871126e98602502444cffb28997e6aa9fbc62d85a844d9fd142e9ae1b","impliedFormat":99},{"version":"b0e20abc4a73df8f97b3f1223cc330e9ba3b2062db1908aa2a97754a792139ac","impliedFormat":99},{"version":"bc1f2428d738ab789339030078adf313100471c37d8d69f6cf512a5715333afc","impliedFormat":99},{"version":"dc500c6a23c9432849c82478bdab762fa7bdf9245298c2279a7063dd05ae9f9a","impliedFormat":99},{"version":"cd1b6a2503fc554dcab602e053565c4696e4262b641b897664d840a61f519229","impliedFormat":99},{"version":"af1580cd202df0e33fc592fe1d75d720c15930a4127a87633542b33811316724","impliedFormat":99},{"version":"538608f9242fbf4260d694f19c95b454f855152ab3b882ac72114f19b08984d2","impliedFormat":99},{"version":"cd0e1083bd8ae52661544329c311836abdda5d5dda89fc5d7ab038956c0394e8","impliedFormat":99},{"version":"9ea6fea875302b2bb3976f7431680affc45a4319499d057ce12be04e4f487bf9","impliedFormat":99},{"version":"66e0c3f9875da7be383d0c78c8b8940b6ebae3c6a0fbfd7e77698b5e8ade3b05","impliedFormat":99},{"version":"da38d326fe6a72491cad23ea22c4c94dfc244363b6a3ec8a03b5ad5f4ee6337b","impliedFormat":99},{"version":"da587bf084b08ea4e36a134ec5fb19ae71a0f32ec3ec2a22158029cb2b671e28","impliedFormat":99},{"version":"517a31c520e08c51cfe6d372bc0f5a6bf7bd6287b670bcaa180a1e05c6d4c4da","impliedFormat":99},{"version":"0263d94b7d33716a01d3e3a348b56c2c59e6d897d89b4210bdbf27311127223c","impliedFormat":99},{"version":"d0120e583750834bf1951c8b9936781a98426fe8d3ad3d951f96e12f43090469","impliedFormat":99},{"version":"a2e6a99c0fb4257e9301d592da0834a2cb321b9b1e0a81498424036109295f8b","impliedFormat":99},{"version":"c6b5ae9f99f1fccadc23d56307a28c8490c48e687678f2cafa006b3b9b8e73e4","impliedFormat":99},{"version":"eae178ee8d7292bcd23be2b773dda60b055bc008a0ddce2acc1bfe30cc36cf04","impliedFormat":99},{"version":"e0b5f197fb47b39a4689ad356b8488e335bbf399b283492c0ffae0cfda88837b","impliedFormat":99},{"version":"adb7aa4b8d8b423d0d7e78b6a8affb88c3a32a98e21cd54fcafd570ad8588d0c","impliedFormat":99},{"version":"643e22362c15304f344868ec0e7c0b4a1bc2b56c8b81d5b9f0ee0a6f3c690fff","impliedFormat":99},{"version":"f89e713e33bfcc7cc1d505a1e76f260b7aae72f8ba83f800ab47b5db2fed8653","impliedFormat":99},{"version":"4e095c719ab15aa641872ab286d8be229562c4b3dc4eec79888bc4e8e0426ed8","impliedFormat":99},{"version":"6022afc443d2fe0af44f2f5912a0bdd7d17e32fd1d49e6c5694cbc2c0fa11a8f","impliedFormat":99},{"version":"6dd3f823ac463041d89c84d7bbf74931a38d874a9716040492ac7a16c7d2f023","impliedFormat":99},{"version":"a5bf6d947ce6a4f1935e692c376058493dbfbd9f69d9b60bbaf43fd5d22c324b","impliedFormat":99},{"version":"4927ef881b202105603e8416d63f317a1f1ea47d321e32826b9b20a44caa55e2","impliedFormat":99},{"version":"914d11655546eba92ac24d73e6efdb350738bcf4a9a161a2b96e904bad4de809","impliedFormat":99},{"version":"f9fdd2efc37eefc321338d39b5bd341b2aa82292b72610cb900f205f6803ff66","impliedFormat":99},{"version":"687208233ae7a969baa2d0c565c9f24eb4cb1e64d6cfb30f71afec9e929e58c2","impliedFormat":99},{"version":"62e7bd567baa5bac0771297f45c78365918fb7ba7adba64013b32faa645e5d6d","impliedFormat":99},{"version":"3fb3501967b0f0224023736d0ad41419482b88a69122e5cb46a50ae5635adb6a","impliedFormat":99},{"version":"06d66a6723085295f3f0ecd254a674478c4dba80e7b01c23a9693a586682252f","impliedFormat":99},{"version":"cc411cd97607f993efb008c8b8a67207e50fdd927b7e33657e8e332c2326c9f3","impliedFormat":99},{"version":"b144c6cdf6525af185cd417dc85fd680a386f0840d7135932a8b6839fdee4da6","impliedFormat":99},{"version":"e8dfa804c81c6b3e3dc411ea7cea81adf192fe20b7c6db21bf5574255f1c9c0e","impliedFormat":99},{"version":"572ee8f367fe4068ccb83f44028ddb124c93e3b2dcc20d65e27544d77a0b84d3","impliedFormat":99},{"version":"7d604c1d876ef8b7fec441cf799296fd0d8f66844cf2232d82cf36eb2ddff8fe","impliedFormat":99},{"version":"7b86b536d3e8ca578f8fbc7e48500f89510925aeda67ed82d5b5a3213baf5685","impliedFormat":99},{"version":"861596a3b58ade9e9733374bd6b45e5833b8b80fd2eb9fe504368fc8f73ae257","impliedFormat":99},{"version":"a3da7cf20826f3344ad9a8a56da040186a1531cace94e2788a2db795f277df94","impliedFormat":99},{"version":"900a9da363740d29e4df6298e09fad18ae01771d4639b4024aa73841c6a725da","impliedFormat":99},{"version":"442f6a9e83bb7d79ff61877dc5f221eea37f1d8609d8848dfbc6228ebc7a8e90","impliedFormat":99},{"version":"4e979a85e80e332414f45089ff02f396683c0b5919598032a491eb7b981fedfd","impliedFormat":99},{"version":"6d3496cac1c65b8a645ecbb3e45ec678dd4d39ce360eecbcb6806a33e3d9a7ae","impliedFormat":99},{"version":"9909129eb7301f470e49bbf19f62a6e7dcdfe9c39fdc3f5030fd1578565c1d28","impliedFormat":99},{"version":"7ee8d0a327359e4b13421db97c77a3264e76474d4ee7d1b1ca303a736060dbc6","impliedFormat":99},{"version":"7e4fc245cc369ba9c1a39df427563e008b8bfe5bf73c6c3f5d3a928d926a8708","impliedFormat":99},{"version":"3aa7c4c9a6a658802099fb7f72495b9ba80d8203b2a35c4669ddfcbbe4ff402b","impliedFormat":99},{"version":"d39330cb139d83d5fa5071995bb615ea48aa093018646d4985acd3c04b4e443d","impliedFormat":99},{"version":"663800dc36a836040573a5bb161d044da01e1eaf827ccc71a40721c532125a80","impliedFormat":99},{"version":"f28691d933673efd0f69ac7eae66dea47f44d8aa29ec3f9e8b3210f3337d34df","impliedFormat":99},{"version":"ae89fb16575dc616df3ff907c6338d94cfa731881ecef82155b21ab4134b3826","impliedFormat":99},{"version":"687208233ae7a969baa2d0c565c9f24eb4cb1e64d6cfb30f71afec9e929e58c2","impliedFormat":99},{"version":"f716500cce26a598e550ac0908723b9c452e0929738c55a3c7fe3c348416c3d0","impliedFormat":99},{"version":"6b7c511d20403a5a1e3f5099056bc55973479960ceff56c066ff0dd14174c53c","impliedFormat":99},{"version":"48b83bd0962dac0e99040e91a49f794d341c7271e1744d84e1077e43ecda9e04","impliedFormat":99},{"version":"b8fd98862aa6e7ea8fe0663309f15b15f54add29d610e70d62cbccff39ea5065","impliedFormat":99},{"version":"ffa53626a9de934a9447b4152579a54a61b2ea103dbbf02b0f65519bfef98cdd","impliedFormat":99},{"version":"d171a70a6e5ff6700fa3e2f0569a15b12401ad9bc5f4d650f8b844f7f20ef977","impliedFormat":99},{"version":"b6e9b15869788861fff21ec7f371bda9a2e1a1b15040cc005db4d2e792ece5ca","impliedFormat":99},{"version":"22c844fbe7c52ee4e27da1e33993c3bbb60f378fa27bb8348f32841baecb9086","impliedFormat":99},{"version":"dee6934166088b55fe84eae24de63d2e7aae9bfe918dfe635b252f682ceca95a","impliedFormat":99},{"version":"c39b9c4f5cc37a8ed51bef12075f5d023135e11a9b215739fd0dd87ee8da804a","impliedFormat":99},{"version":"db027bc9edef650cff3cbe542959f0d4ef8532073308c04a5217af25fc4f5860","impliedFormat":99},{"version":"a4e026fe4d88d36f577fbd38a390bd846a698206b6d0ca669a70c226e444af1b","impliedFormat":99},{"version":"b5a0d4f7a2d54acbe0d05f4d9f5c9efaaeddc06c3ee0ca0c66aba037e1dca34b","impliedFormat":99},{"version":"fa910f88f55844718a277ee9519206abce66629de2692676c3e2ad1c9278bdfd","impliedFormat":99},{"version":"a886a5af337cce28fe3e956fd0ed921345933163f5b14f739266ba9400b92484","impliedFormat":99},{"version":"9ae87bd743e93b6384efbfa306bde1fa70b6ff27533983e1e1fe08a4ef7037b8","impliedFormat":99},{"version":"5f7c0a4aad7a3406db65d674a5de9e36e0d08773f638b0f49d70e441de7127c0","impliedFormat":99},{"version":"29062edaa0d16f06627831f95681877b49c576c0a439ccd1a2f2a8173774d6b2","impliedFormat":99},{"version":"49fcfda71ea42a9475b530479a547f93d4e88c2deb0c713845243f5c08af8d76","impliedFormat":99},{"version":"6d640d840f53fb5f1613829a7627096717b9b0d98356fb86bb771b6168299e2e","impliedFormat":99},{"version":"07603bb68d27ff41499e4ed871cde4f6b4bb519c389dcf25d7f0256dfaa56554","impliedFormat":99},{"version":"6bd4aa523d61e94da44cee0ee0f3b6c8d5f1a91ef0bd9e8a8cf14530b0a1a6df","impliedFormat":99},{"version":"e3ee1b2216275817b78d5ae0a448410089bc1bd2ed05951eb1958b66affbdec0","impliedFormat":99},{"version":"17da8f27c18a2a07c1a48feb81887cb69dacc0af77c3257217016dacf9202151","impliedFormat":99},{"version":"8395cc6350a8233a4da1c471bdac6b63d5ed0a0605da9f1e0c50818212145b5b","impliedFormat":99},{"version":"b58dda762d6bd8608d50e1a9cc4b4a1663a9d4aa50a9476d592a6ecdc6194af4","impliedFormat":99},{"version":"bc14cb4f3868dab2a0293f54a8fe10aa23c0428f37aece586270e35631dd6b67","impliedFormat":99},{"version":"946e34a494ec3237c2e2a3cb4320f5d678936845c0acf680b6358acf5ecc7a34","impliedFormat":99},{"version":"b85aa9cc05b0c2d32bec9a10c8329138d9297e3ab76d4dd321d6e08b767b33ed","impliedFormat":99},{"version":"b478cef88033c3b939a6b8a9076af57fc7030e7fd957557f82f2f57eddfc2b51","impliedFormat":99},{"version":"2fac70f99da22181acfda399eed248b47395a8eeb33c9c82d75ca966aee58912","impliedFormat":99},"395ce4e40890d4e3f8962c1ea63805e7873e2b8b5fd6da88598b7bc131d8a9db","aafd57b7adcfe2752a4bda91963caf71cea0e5ecd4553826424573c70ac27d65","e8537bebb5d7b02544de702a182190f88a3ae36fd615850f93c0b42a09426201",{"version":"6b00143abdd09f7e789809c4dd737aa8032da306a52b63b180abef8c0278c92a","impliedFormat":99},"e5dcd7390ee46d48d088acc275c3398b5e232ca5096f116718f7946e5da01bcf","c3a83167fc568331b4ad75852bfcae4f90e50c2e486d19693b46e0d2063ce407",{"version":"d8e02aa2838623274cd72e3e379f931ce28af86202d05cc4310f4a9d03408c61","impliedFormat":99},{"version":"4d1a9c5960c005d2fe9cf5f5a6bc70850149ea0454666f133595a6acd6b593e3","impliedFormat":99},{"version":"8439d349f53c599dae7d7b9df3382688b1cf167e6da1fc6cfa3aef4c54a3b0b6","impliedFormat":99},{"version":"16f883251db6af07b8314899c735b2aaf723bd0596828ac2b521b9a91ea7686a","impliedFormat":99},{"version":"a47000de38fcb07c48b9dfd1a22b85be24c422ec1448a353b625eb71b87e8543","signature":"010c7c70c42e3ae1797dd61ea025f3dc9d0470f423be2e57583c6f2b41dbd54a"},{"version":"7ecbe0e0b134c9dfb6a5cf6464eafa62218768df02491a84cf8bec3eb2aedf55","signature":"a3df50373eaab5122c1384f66eac08aedf5505f13be691f57565e2dc852a3ea0"},{"version":"02f2ff84b21ee762b48bb33d33731c6b5fb1a16c21797c8c0b4e668af4ea3d07","impliedFormat":1},{"version":"a45ee7555d019a67fbe092898d1aef0b1d02a9f6679ab84461ff515b4460d706","impliedFormat":99},{"version":"bcf5edfb2b188348d16a7dd26c83a79856a7e81a7800051109d99aa211ef6947","impliedFormat":99},{"version":"6d870cbc76c9654c649c58dd664a875bab499e3e746b34ff2a6b6d363a3e0686","impliedFormat":99},{"version":"c1da3f540f39091e02624208125e7d825fe6839d153399c21315725acf0adbe1","impliedFormat":1},{"version":"91648eebacde37f34eace96a9d3f269875ae85331e70a4ffb89e76f0382338ae","impliedFormat":1},{"version":"6b564cbbc03305790e97ec6cdb2da7d0231880e5d1a44974b098857e391ebbeb","signature":"33062a0c02d85c654071b656a3b178315a6b9640f71281be8a283acbf3914be3"},{"version":"f09971f9fed038b945b9d327c4f828c34014873bd0119c70342d1c5b38b7bc3c","signature":"05407b20be3c021be8d811f8e863915b2467d4ba691a9f4d17c30c30d7d079a5"},{"version":"6d81c7ae02ce31a75fa7952145a8b0df497832fd1771718985010b909252c8dd","signature":"23887314798a44611ab91e96f4f31037459b91780ce9806e9d336b21e64dffbc"},{"version":"e1be4a2a139d2a99071ff9c81d7c3401a04612b032c16b4212a66e254c784217","impliedFormat":99},{"version":"1b1d7e2eb25adf80e3e15f68121ce2100d33ab8cf1b07a362239d3b038db8b1a","signature":"193f3698143959625b77bab03ef64fae1876dda0ed7438f9da236b49a3b9b826"},{"version":"40eb4eb274d7def754b3352c23328af96a69261fe5e99d20df41f1d5de8d0f5e","impliedFormat":1},{"version":"4d7d964609a07368d076ce943b07106c5ebee8138c307d3273ba1cf3a0c3c751","impliedFormat":99},{"version":"0e48c1354203ba2ca366b62a0f22fec9e10c251d9d6420c6d435da1d079e6126","impliedFormat":99},{"version":"0662a451f0584bb3026340c3661c3a89774182976cd373eca502a1d3b5c7b580","impliedFormat":99},{"version":"30de07ba48a9bd1c4f63375c48a33b8fd188b365c08517f515eb4d2e1b7861fd","signature":"f5636abac9c3d7d7c8eba0a0692c305faf9e605dc7cd2e735c1392374cf90ef0"},{"version":"4d06375aa6c40c68ac15e1fafda889fa5b121feb5d4ed646dda97d04aecade0d","signature":"ccfb7c908454912967cef19aaf9626a963858df89d6d8a56b299d749ca2dcbf3"},{"version":"95e963837647fb1d0623e5c830d1ecbce34845adc7083d444c0431b0dc175d2d","signature":"d0d0b3d9e3ac3534f4e3033589f51ec1ca8505d382dca6b15779c105c7bf9ad2"},{"version":"55ed31f8e15f2428b48001209cc07764197d5f628d721d89c971ac4007c16fca","signature":"2c97adf60d0f9ecae3a2a82409ed1e0660385b86d79e714e587e0c079c48183c"},{"version":"58f868665ea08a5cb9e8d7216f0d4559b2ce6c4408da6247563286c968f712a0","signature":"143a1d7899f75c792cae42a083be5af66b106984143469de4b89c4e675f7b078","affectsGlobalScope":true},{"version":"9bd535b0e6913321066c70cb9f06bce3fa4c0245db5db11ff711f42d11f29de5","signature":"5e8b289c58d0ef781c5fb54c1aa4b9c3f4fb99eb3c5660715eddafd0f43d47cf"},{"version":"50056a12f1e3ca57666e2bb2540daa2c47cf477d456f920c8ca03986d9d49040","signature":"a575347f08bceafc67ec61295040ebd6d8a8f697126fdb88ccd620ec1824bc08"},{"version":"11fc7d6659cdee67c183ba7f62f311de94f4fec188949e08137f696763bf0ed6","signature":"05acacbe7d71108c4df7033b828ae1f4c2a268a910783ed46ca33f88d6c4d341"},{"version":"409782511002849bfc73e5a2096e1efa3024f220747806fc246c109b33e6c3be","signature":"99f354346eca19d79c063f1b80854e527509fa55557567923b1d3025ace35518"},{"version":"8f77b3b50ce80617b3b9cff5006fa646207e557320040549e3d5ffac21c3b98e","signature":"b96e5dae99a39290a14aaf36662e2650a6de601814c814f87179e709e5ab4519"},{"version":"e6b8f3cd057e49a50b57a52acc38cff7c224def2249464d489295e0e1d200af6","impliedFormat":1},{"version":"c57b441e0c0a9cbdfa7d850dae1f8a387d6f81cbffbc3cd0465d530084c2417d","impliedFormat":99},{"version":"26c57c9f839e6d2048d6c25e81f805ba0ca32a28fd4d824399fd5456c9b0575b","impliedFormat":1},{"version":"c0516f0939c27dd46f3017e882cfd93dbb9610160ee814c0be0bb87101a0142b","signature":"98204207446a53ecdae733dd448ee017b69571cb0c692c465bb133131829b17d"},{"version":"242db9526d1b493b54d3536d21dea19dbd1b8fd567745a006c6cea422e25a46d","signature":"f4f134f61ae8caf9b22ac22b92fb882d25a8c5f0c2c375364eec6c2aa3fff070"},{"version":"077de269ff65c82e00d342179cbf870cb87fb65bb8573bf80a12d03a9f2c9738","signature":"1072feaf2e85b97d0b6b95fd7fc259fa90294bb0a7069df31d6a67c6ec5363b5"},{"version":"1913c2669d6340305255ce8955acd5459bed6373c11cbc2313913fbcce023b1b","signature":"4b686dd1ea719cbcb2e6391f8774ddd4dd3caff990f098b39895d0a84d741163"},{"version":"145c1fbdb342584544a7f593db746ff786545cd72b61c4dad039d293969b0de9","signature":"221d742fa2ba723b0d1ab360281f631ce49c3ea01f25195692de202ad778bf0c"},{"version":"f124d58f4b2d522ee67481419a13c88485cb60b554e053bdc867849f7fdd023e","signature":"392e2ddb1185a3f47d60d39a600369113fcde4effdc60e0ec4d3bd75dbe8dc3f"},{"version":"ea3455b6bd44c3bdfe0f53006dce50191d723c5636106ea1cd49d62d5900a25a","signature":"6f7ee1c734d1193633694dca1efd7679b9454861b6a332f4331a9e02fec14260"},{"version":"b829c76711471c8a451826a57a51ee361a1214f72fcc74f51bb4df934e213796","signature":"355893155b6e80bb1d801e19ecf8b00c1c837681b0876f0571afb9a12325e43f"},{"version":"58572d98acce945af2e29640c2d9e7bce81e2647c9a54ba5bebca6ac761c9349","signature":"ae3cb34f763ca6c87eaf9d2ef7cca0c655e8719830f0758dd109a005c4574273"},{"version":"159a7cf0c4bfc1db15478a444e01f1a71770f163e22ceaad7725430b4a89d320","signature":"021f5232c6738ab07d1f3eea74394f0f3c234ce0ad9cacd21383ba2a58f3733b"},{"version":"10ab128000fa593aee1859f90ba6e31b5c69736db6d0f7b1989333bc1c97be15","signature":"d86b1eb5fa068b9820f6427ee57e2fa2967441fdcfd25bbe9dc86845f6d46d9d"},{"version":"02a4e4525185017f7d83f4671bb1655ae80e5268028c884188434c82af92cc7a","signature":"7abd853e12728070e39dc3bd24038eee0ba70bf479a5771f22b409229ce6b3b7"},{"version":"44ef3e27c2c4fef5a739dfc9152250fc8df127164ebecd060784b6453005c1c1","signature":"128b66558240654e7d7c9e15bc920647eaa13c9bc7802637ba68e1236bf7afd8"},{"version":"68219da40672405b0632a0a544d1319b5bfe3fa0401f1283d4c9854b0cc114ce","impliedFormat":99},{"version":"ee40ce45ec7c5888f0c1042abc595649d08f51e509af2c78c77403f1db75482a","impliedFormat":99},{"version":"7841bca23a8296afd82fd036fc8d3b1fed3c1e0c82ee614254693ccd47e916fc","impliedFormat":99},{"version":"b09c433ed46538d0dc7e40f49a9bf532712221219761a0f389e60349c59b3932","impliedFormat":99},{"version":"06360da67958e51b36f6f2545214dca3f1bf61c9aef6e451294fcc9aca230690","impliedFormat":99},{"version":"50bc55fc955fa799a4a1a11c3484077f06cc87033c68f5da6466b520876cb12f","impliedFormat":99},{"version":"e8f33af6bdca5a3b90e928516f39c146529f1dc03bf201b96892de3e6bf019ba","signature":"2e2552723dd9f7d873fcaa75356a9d8da98080cc604965911a327afe2247a526"},{"version":"ad6f944b4f5efe49d373f87acff2dd633c9aa7b663d1c386f36bde3a0ac0ccde","signature":"2fa04aa89cae9e10bd7f680b16bbaab666eeeaae586172c6a27adcd4feef295f"},{"version":"a415389d5df5b304b38bc568d50b07d4e77d2ab0ad3767e3378c704ebfbe5ae6","signature":"df955871fdf5f4c124a0cbbf1c7d1c5e1391e6928ce2af9c88412dc540c8bf7f"},{"version":"0ba6f829d5a1cf7a46674ae05fc7130855386400fbddb77f76e62d815926d309","signature":"963c2a3b2e53abed1302ff62aec14bce2a3f9784060bd3180de5c70d5145d141"},{"version":"25360f7a64361bc5a1dde6b291c26dd95822c60e384a309bb3984f09da8b5f98","signature":"46939687b5f5bd1430dd08201b4ffa481cb222161194a12163a66496ae6c86e4"},{"version":"509890cefcd19cc64b79206a3a51b1f3c310348c85f1a61cef729d9fd5d4ce77","signature":"db3f8acd21ab5bc2f4f89bcc187d16e6ecae27c289a72782ffef26f960b62bbb"},{"version":"964e2b5cd04a33bcf0170236afc5d91b46168e189da652c514e4f2b101eb9d4b","signature":"4f7592a75cfd01c6c26c5f58f40f4205a917a46b7836cc922cf022a0a1c7e335"},{"version":"6cf21ac3be69759bbdce20e3bdbf06e2b0f4a3735c2250b6cc51afa56167289f","signature":"99b15666c46eca52d2529df2a25868a5a9db4a2811b15e816d77552659c2225c"},{"version":"870fddc39056507c0a148cbe63646482bd919a442c6767e122182071254de9dc","signature":"759f60150aa79543562b0a73ff30754049f50f23c1e1384e357bf69cee6939fd"},{"version":"0e4a4c43584b8bc8f243c6e164be95c4b1ca51a366b1190cc364e931026382c4","signature":"d3fe80f9537bc18bbdcc6f860f81c1c7fd9c2573bb76ce75fdd1aee61ebad374"},{"version":"e589332f05d669ebe74bc4074bbed569546506992112c9b132c745130426cf69","signature":"6cac45b0e556cbce5690f6063a6f9be26da1a84161a82dccdb58053d50c7f23b"},{"version":"024829c0b317972acf4f871bf701525f81896ad74015f1a52d46ae6036205cb9","impliedFormat":99},{"version":"a9373d52584b48809ffd61d74f5b3dfd127da846e3c4ee3c415560386df3994b","impliedFormat":99},{"version":"caf4af98bf464ad3e10c46cf7d340556f89197aab0f87f032c7b84eb8ddb24d9","impliedFormat":99},{"version":"0943a6e4e026d0de8a4969ee975a7283e0627bf41aa4635d8502f6f24365ac9b","impliedFormat":99},{"version":"1461efc4aefd3e999244f238f59c9b9753a7e3dfede923ebe2b4a11d6e13a0d0","impliedFormat":99},{"version":"7ec047b73f621c526468517fea779fec2007dd05baa880989def59126c98ef79","impliedFormat":99},{"version":"8dd450de6d756cee0761f277c6dc58b0b5a66b8c274b980949318b8cad26d712","impliedFormat":99},{"version":"904d6ad970b6bd825449480488a73d9b98432357ab38cf8d31ffd651ae376ff5","impliedFormat":99},{"version":"dfcf16e716338e9fe8cf790ac7756f61c85b83b699861df970661e97bf482692","impliedFormat":99},{"version":"31c30cc54e8c3da37c8e2e40e5658471f65915df22d348990d1601901e8c9ff3","impliedFormat":99},{"version":"36d8011f1437aecf0e6e88677d933e4fb3403557f086f4ac00c5a4cb6d028ac2","impliedFormat":99},{"version":"8085954ba165e611c6230596078063627f3656fed3fb68ad1e36a414c4d7599a","impliedFormat":99},{"version":"2c57db2bf2dbd9e8ef4853be7257d62a1cb72845f7b976bb4ee827d362675f96","impliedFormat":99},{"version":"6b5f886fe41e2e767168e491fe6048398ed6439d44e006d9f51cc31265f08978","impliedFormat":99},{"version":"56a87e37f91f5625eb7d5f8394904f3f1e2a90fb08f347161dc94f1ae586bdd0","impliedFormat":99},{"version":"6b863463764ae572b9ada405bf77aac37b5e5089a3ab420d0862e4471051393b","impliedFormat":99},{"version":"68b6a7501a56babd7bcd840e0d638ee7ec582f1e70b3c36ebf32e5e5836913c8","impliedFormat":99},{"version":"89783bd45ab35df55203b522f8271500189c3526976af533a599a86caaf31362","impliedFormat":99},{"version":"6da2e0928bdab05861abc4e4abebea0c7cf0b67e25374ba35a94df2269563dd8","impliedFormat":99},{"version":"e7b00bec016013bcde74268d837a8b57173951add2b23c8fd12ffe57f204d88f","impliedFormat":99},{"version":"26e6c521a290630ea31f0205a46a87cab35faac96e2b30606f37bae7bcda4f9d","impliedFormat":99},{"version":"71acd198e19fa38447a3cbc5c33f2f5a719d933fccf314aaff0e8b0593271324","impliedFormat":99},{"version":"044047026c70439867589d8596ffe417b56158a1f054034f590166dd793b676b","impliedFormat":99},{"version":"89ad9a4e8044299f356f38879a1c2176bc60c997519b442c92cc5a70b731a360","impliedFormat":99},{"version":"fd4f58cd6b5fc8ce8af0d04bfef5142f15c4bafaac9a9899c6daa056f10bb517","impliedFormat":99},{"version":"2a00cea77767cb26393ee6f972fd32941249a0d65b246bfcb20a780a2b919a21","impliedFormat":99},{"version":"440cb5b34e06fabe3dcb13a3f77b98d771bf696857c8e97ce170b4f345f8a26b","impliedFormat":99},{"version":"5bc7f0946c94e23765bd1b8f62dc3ab65d7716285ca7cf45609f57777ddb436f","impliedFormat":99},{"version":"7d5a5e603a68faea3d978630a84cacad7668f11e14164c4dd10224fa1e210f56","impliedFormat":99},{"version":"2535fc1a5fe64892783ff8f61321b181c24f824e688a4a05ae738da33466605b","impliedFormat":99},{"version":"cbfd5ef0c8fdb4983202252b5f5758a579f4500edc3b9ad413da60cffb5c3564","impliedFormat":99},{"version":"9f7a3c434912fd3feb87af4aabdf0d1b614152ecb5e7b2aa1fff3429879cdd51","impliedFormat":99},{"version":"99d1a601593495371e798da1850b52877bf63d0678f15722d5f048e404f002e4","impliedFormat":99},{"version":"1179ef8174e0e4a09d35576199df04803b1db17c0fb35b9326442884bc0b0cce","impliedFormat":99},{"version":"9c580c6eae94f8c9a38373566e59d5c3282dc194aa266b23a50686fe10560159","impliedFormat":99},{"version":"cc3738ba01d9af5ba1206a313896837ff8779791afcd9869e582783550f17f38","impliedFormat":99},{"version":"a80ec72f5e178862476deaeed532c305bdfcd3627014ae7ac2901356d794fc93","impliedFormat":99},{"version":"4a5aa16151dbec524bb043a5cbce2c3fec75957d175475c115a953aca53999a9","impliedFormat":99},{"version":"7a14bf21ae8a29d64c42173c08f026928daf418bed1b97b37ac4bb2aa197b89b","impliedFormat":99},{"version":"c5013d60cbff572255ccc87c314c39e198c8cc6c5aa7855db7a21b79e06a510f","impliedFormat":99},{"version":"69ec8d900cfec3d40e50490fedbbea5c1b49d32c38adbc236e73a3b8978c0b11","impliedFormat":99},{"version":"7fd629484ba6772b686885b443914655089246f75a13dd685845d0abae337671","impliedFormat":99},{"version":"13dcccb62e8537329ac0448f088ab16fe5b0bbed71e56906d28d202072759804","impliedFormat":99},{"version":"233267a4a036c64aee95f66a0d31e3e0ef048cccc57dd66f9cf87582b38691e4","impliedFormat":99},{"version":"ccb9fbe369885d02cf6c2b2948fb5060451565d37b04356bbe753807f98e0682","impliedFormat":99},{"version":"2fbe402f0ee5aa8ab55367f88030f79d46211c0a0f342becaa9f648bf8534e9d","impliedFormat":1},{"version":"b94258ef37e67474ac5522e9c519489a55dcb3d4a8f645e335fc68ea2215fe88","impliedFormat":1},{"version":"be963a5bd56aeddfc57616466c1f8af426378d908d9e475f334b30471a4ba884","signature":"da7dfbcc3ba76a065601622916971b178c2242e4f9c3484ece58aeecaac92104"},{"version":"d397a673d640a178fb574fe8ac035fb57f8f428a0a69160f284c9b7bb6f4f29e","signature":"1b427e8590c534e0c3830d04f5c4afecc99c593854076e7176f86ad500fd36c8"},{"version":"0f160143e59439d507e29bbf239aa377d69e69779a3fd54b43e8b7dc44d179f1","signature":"29b6366c63d9d8fa31e31204b6f86084ad65d8c09e02b33371af51e923a1be60"},{"version":"f381a21f18ee7425b9658040042af9eabccee29291bfaf7dbb9010490ba39a05","signature":"cf16c98b79d1eccebf51f529c413c59ff5e63cbd6033913b5233dd5d145c728c"},{"version":"6aad7de0a0c87312d1564195b269cadf1c6d5000608305203d847f0128834797","signature":"e576932de1f726a32ad237ac3510636117f9d2778374e9b6e83c8899af36811a"},{"version":"b6f91d557f8532d654af6a59116bf7f7c22f3039ba71510243f85f99fd9c5371","impliedFormat":1},{"version":"e443acd5ebb476c19e1da0858570a9cbbd0077404b2dff4c078a4ffa448e090e","impliedFormat":1},{"version":"cad19572420f7ead17272082d9582ebaed7f2856e19875542f83daf8d25d3b5d","impliedFormat":1},{"version":"63f0ec970b9a648cf7f8307e9e63a5f24a62f48c1a51c22b5271a9f18a36e903","impliedFormat":99},{"version":"f0ff8ea5237bebecfed33eacbfeb6bf599a0c3cfbdbe06f5c383ca97856f05fd","impliedFormat":99},{"version":"9bf290d5ed3e90694fe0926327b604409a56819ae723878b9043809220e972df","signature":"9831330dee74d8956e6810ac43e4b67b26800d57c5caddd9c66f189d822a44db"},{"version":"fe93c474ab38ac02e30e3af073412b4f92b740152cf3a751fdaee8cbea982341","impliedFormat":1},{"version":"6dc25f6d56cfb757dd1fdf38eb6a2059b812a13fbd81ade8e0cbbd93295c5987","impliedFormat":1},{"version":"1e00b8bf9e3766c958218cd6144ffe08418286f89ff44ba5a2cc830c03dd22c7","impliedFormat":1},{"version":"98f6680f965241c89395ec9a6ecdf37da3bafa5cc8b7e459e27ffe0ee9700808","signature":"c6c870f3fec59f8c6a9ec8a7aef26c2ed1e1117b6dbd3036bdd0ca7eb21ee2c5"},{"version":"f6117aec06cf14616d3eeaca2a5d50bd51a8b1b7a3d9e73515ec65d0cd90d53b","signature":"ca6aa01423ec7733fb240701edae05fdcbe48cf2625c000e25aeae9546480fb6"},{"version":"132ed858100f582439be9b86768a49b36f00fd20aa4c9bb82888865b4e6f0aaa","signature":"0973b7d3c5292f37d39bc7463cafe4af537869e24ccfbe83ee135f78975da5c1"},{"version":"350d0bfdedcf66569293d164f4575cdb656c9c6060e7360bfdb5358b0e41bc82","signature":"5f57f63b2d6f259b6a0864dbce12ce42bcc7f4ea864828e433c6bc87d9ec356e"},{"version":"303c94943278564da916b28af0d25a2d05de2b98a81e7d5b32506d524b2439bc","signature":"cad33fd2be553879ffd526b822bb7d4a964f8b4fd913e8a6b54ee87e0e845907"},{"version":"6c05d0fcee91437571513c404e62396ee798ff37a2d8bef2104accdc79deb9c0","impliedFormat":1},{"version":"429aacaf3955390f06048784af81b187ef273825d1f290b9e35684b51346b11b","affectsGlobalScope":true,"impliedFormat":99},{"version":"9eefb21954cb036d002e68ec2f521b2c09ddc7889f6bf69b2e7cb406b0003a34","signature":"a1949f6531a858c6305c94f2a3910d5b6cf43e597b23deadaa7fb26737bc3b34"},{"version":"dbb685a20c75a2082aa1a4e65d1c78194a76e9fe750337c17a6cd959c3a739ef","signature":"c07a10db00013b762a62aea6c416c4f742163ec900708ed46cebfa4bebff25b0"},{"version":"321fd6a8249295720f911dcb179ac4a637f77581f909af7b8052f316e076cccb","signature":"14ccce935efffb51549ae9d32af0c472ff7350f70b62992a4cbc50ef03254f74"},{"version":"afb5c44616d15e04c44ac6ee0abdb32983c1134a5dd3827f1bc701d73fb6199b","affectsGlobalScope":true,"impliedFormat":1},{"version":"670cfaff6a8e574e577506a4ad591d7163dfc980be3723193351bd8613efc375","signature":"0d33653a6cdafbd7aa1c7f7260548e7600f0ee2baab2556587d31182ef8dcf80"},{"version":"37c7961117708394f64361ade31a41f96cef7f2a6606300821c72438dd4abda3","impliedFormat":1},{"version":"19feb8551285d9041090b2aac242de4089aa0abe3777a89ff9a804225e561832","affectsGlobalScope":true,"impliedFormat":1},{"version":"a4553f8b822eb81601e9ff242bde19eebc440201e687161598c267892ee84bdf","affectsGlobalScope":true,"impliedFormat":1},{"version":"724dea86a503f9bdf755f5c628cea9de4a63aafdf0f6ca25db5e0172ddc0d883","impliedFormat":1},{"version":"39875f62f78dfcd829f2d38f7b06e8a8d5e39bbb9487abe63b81b41fe3b58c04","impliedFormat":1},{"version":"01141b610aa76df368ea5a2d6ef07abd6df8c68c8f8a059970f1e348d7ac4c50","signature":"6181facfcc5ffd7d073c53067e9c466e672f3d3057d4c12865843f5eb9213e78"},{"version":"5bbdfeaca969e3c1dc0a0cf3982a3b26ad032bb2c9808418034c332521fa4aaa","signature":"402b4f97c618e041e8cbada612b7540ebddc75da8bfa1cb058ee02f34f3efffb"},{"version":"d4b1a8fd1bc758e4e3f0d19ec26524aae80f8048524a798c88e23ebc688af087","signature":"16a63b574277c84e41df88c14d57604ba7a3649092c3b73a549f4d338f6978d4"},{"version":"c013dae1f00eb17ecff4563fa6f9107b9524cfa67bcba0c6c98f765d0d8c8862","signature":"1817abd08ae5b9438b81564ca71539f3f3246c6a85e8a0617ac24665e6a36c75"},{"version":"9a7bc3d48f58a822862b0b16b5a1f2eac43fe9e4070be3115ef9ade60a754f52","signature":"dbcb8b0b6279a350f5700a8899a784d31cb51c13c86e06f020ac0a260f4aac7f"},{"version":"f47f7b8aa563656c5e464862e0622997062763052259352e1cde6e17320c6c66","signature":"00ca5c6fc28e39cebe2766c45f01446003017319a470fb23205247c98ef81c0f"},{"version":"36d744194260455270cad1437e8bb38cd8f35dd9fbd3aba365ce1c057b775f9c","signature":"b38a9e9add7938286ce894c1ec3e07c4950e6da7bd69e4294a21931b6e4cf9ba"},{"version":"d04f947114fa00a20ee3c3182bb2863c30869df93293cc673f200defadbd69d9","impliedFormat":1},{"version":"4c629a21fb1b4f2428660f662d5fef6282e359d369f9e5ec5fd6ac197c1906ee","impliedFormat":1},{"version":"785926dee839d0b3f5e479615d5653d77f6a9ef8aa4eea5bbdce2703c860b254","impliedFormat":1},{"version":"66d5c68894bb2975727cd550b53cd6f9d99f7cb77cb0cbecdd4af1c9332b01dd","impliedFormat":1},{"version":"cf62a7edc0f8e389ef165baf6d664cc20eb272de3e5ce056064031ffb0c452f0","impliedFormat":1},{"version":"c991b4ab8278b08f73510d383ae74a9df03a876ba4aa66efa9d87d0bfdbf486b","impliedFormat":1},{"version":"26bb422e69d1eafe073ea833266a49ad098e4b85d933d7aefacda852593ef2e3","signature":"ce646e3f553e635398f12c5b8dc8b218d6c55577c74bc266463414789ae07f09"},{"version":"ccdc3f0feae8f828b00cd502de1621de0bbe1dc8ea24605e7b9ffb085bdc9f7c","signature":"7a4dd9acc5705beff7d52365cf4c86a779ece8cee4388be28507384392ecb611"},{"version":"6fb0dd8d98c4374aff3c1812edd139a826c6cd7a6d0ac164dfe08677a374dc2f","signature":"8fc67ddd42c820c7ce9d330fd429fbf2da5362b5424f80c2a5f3244f5f50f6c5"},{"version":"4b74c810d1862fedeb177f7eea72b8c539a2f2718e914f1878fed4de4b75f1b0","signature":"506094e1dc2747f7e734e971e941585e40a8632184acf476b34964de270daa88"},{"version":"ea5fdc2c6e98adce3deb78d0c942ba22a29c8681b79f662035161dd8223665dd","signature":"74f7141a41f4fb646176486a9bda7ad6ce22202a2c46afcb42a691fdc4261c15"},{"version":"f6edfa96e639cb9f9cb6e937a45b12324ba0710c51d3b384396aa4d7b0d066e4","signature":"9e2b7a970acb37795476eb2e0e6ef9397c03a82abbba1e0bce24e23879279d0e"},{"version":"5565ddee7570101bdbfefba57c198911ec26ae14d4f644cf7d9a8e56e67f2841","signature":"5b2dcfc0066c04996c1976d24fb091cb11ccb7b28231965bd84fe649e2d72aad"},{"version":"554ccd913de67174a356eeef8b24bcca0f01a719d0c723dc228e5ec8fbbcb3b5","signature":"6688ab89eeb44744e19abbce57a209ff048b992ce8a5b45801380982eddb21e7"},{"version":"dbe452b12320ff810e634f8bda5a8fae141013335c67427b750239d7d97f7a10","signature":"6688ab89eeb44744e19abbce57a209ff048b992ce8a5b45801380982eddb21e7"},{"version":"3c8bc8615f3a97799855f21ebfa2e1ce01df9fb407775baa03a5224a043f5150","signature":"33e8cebeb0e9014cddffb1bd6967251edca2c0e6f4b4607ffd054f0f757eb3c6"},{"version":"92321e702c9b734303e91789a69638149c1a15369c39d62f9e7850f07dc0ad2e","signature":"24bf1c0c6ac8bba9b5205c5b930ff728990fb54d5d39601894c363d35a59cb7a"},{"version":"d9fc0c3d44c571f359144012e46313b40dadfde96cd077db4f038b756b301ebb","signature":"1e1156d9e5d5faabd983c66ef5c51164608035131f04d2629c59c8be4cd30959"},{"version":"b1ce2af9c99f6289e1658d499c0b54b39fc3baee0cb16d361637f81c0ccba8eb","signature":"e64f570502c4e9754d2c96a5c8590d43377445406631420385e9dbb67ba99985"},{"version":"4d3c0619a4b0b7ddfb2a75e79827ada039711b1dcc40f51f3630f3350ff146a5","signature":"a3ba39021620b6bf8cf656cedc23d193342a050b12bb650e1981b9418e502434"},{"version":"8f674ebede2aaaa082b5951af37e852a4f295921e606eb60b34d23e294172d6b","signature":"d23747eee8e0a39dd0f939b282d446749416ed25ebee387f3d2c59677357aac4"},{"version":"a81a0eea036dd60a2c2edc52466bb2853bef379c3b9de327fe9fff6e3c38e6c5","impliedFormat":1},{"version":"348c13a1c9160681e41bc5cd3cc519dd8170d38a36a30480b41849f60f5bf8a0","impliedFormat":1},{"version":"c772a37a02356897d6f9872e30fcc2108f43ad943cc112bd1acc5415a876e9f8","impliedFormat":1},{"version":"279248c34ecd223fc46224f86384ebf49c775eb69329ad644d3d99f1205f3e7d","impliedFormat":1},{"version":"74dedffc2d09627f5a4de02bbd7eedf634938c13c2cc4e92f0b4135573432783","impliedFormat":1},{"version":"1f2bbbe38d5e536607b385f04c3d2cbf1e678c5ded7e8c5871ad8ae91ef33c3d","impliedFormat":1},{"version":"3aa3513d5e13d028202e788d763f021d2d113bd673087b42a2606ab50345492d","impliedFormat":1},{"version":"f012173d64d0579875aa60405de21ad379af7971b93bf46bee23acc5fa2b76a4","impliedFormat":1},{"version":"dcf5dc3ce399d472929c170de58422b549130dd540531623c830aaaaf3dd5f93","impliedFormat":1},{"version":"ec35f1490510239b89c745c948007c5dd00a8dca0861a836dcf0db5360679a2d","impliedFormat":1},{"version":"32868e4ec9b6bd4b1d96d24611343404b3a0a37064a7ac514b1d66b48325a911","impliedFormat":1},{"version":"4bbea07f21ff84bf3ceeb218b5a8c367c6e0f08014d3fd09e457d2ffb2826b9c","impliedFormat":1},{"version":"873a07dbeb0f8a3018791d245c0cf10c3289c8f7162cdbbb4a5b9cf723136185","impliedFormat":1},{"version":"43839af7f24edbd4b4e42e861eb7c0d85d80ec497095bb5002c93b451e9fcf88","impliedFormat":1},{"version":"54a7ee56aadecbe8126744f7787f54f79d1e110adab8fe7026ad83a9681f136a","impliedFormat":1},{"version":"6333c727ee2b79cdab55e9e10971e59cbfee26c73dfb350972cfd97712fc2162","impliedFormat":1},{"version":"8743b4356e522c26dc37f20cde4bcdb5ebd0a71a3afe156e81c099db7f34621d","impliedFormat":1},{"version":"af3d97c3a0da9491841efc4e25585247aa76772b840dd279dbff714c69d3a1ec","impliedFormat":1},{"version":"d9ac50fe802967929467413a79631698b8d8f4f2dc692b207e509b6bb3a92524","impliedFormat":1},{"version":"34d017b29ca5107bf2832b992e4cee51ed497f074724a4b4a7b6386b7f8297c9","impliedFormat":1},{"version":"b75d56703daaffcb31a7cdebf190856e07739a9481f01c2919f95bde99be9424","impliedFormat":99},{"version":"edf2eb7cf1828640acbb5822fb470e5c5b49f41c77fa685d4f747496a28aa5bc","signature":"0666cc5e36fccf2f3c059de42a7467ae63349fc74b8af32f953af905341be132"},{"version":"e7b8a0313747812082710ad62e2ae6ab32fdef5b0832bfcdf6c7d56d5b78b186","signature":"a3f5921a8d7ab7d0040fa7352cedac4115d525441cb3f1efb0098408d96b8b4a"},{"version":"3ae0690c80128f1379343e202f76676cb411d80c361d625575139a6df81a1dd5","signature":"ffd37f81659885d2277b93d3f241b6d6c8ac36056d13184757d8ded2efc3267d"},{"version":"0448d3d7b4cb521c7dcec1e745cde4c3f8069c8e1ca38e825107a1c748305551","signature":"b0408b6f3574be8e9229064971b26fcec022f44e32bd7c742ba61d04ca6b75f7"},{"version":"bb62fa0df58dee6ef3672f8f6edac543da3c494d2733d393b0952db71ebbcfe8","signature":"4c76f4c8dc5b3a21af8051ee259a261da454c072cbd070e835ccb005bada9ab4"},{"version":"5518b814ca2443dc0c71a00fe79159f477d3dd1557e2c9cbb304cf4df53eabb7","signature":"d870380b279ca88c89db97f332a61f051fbc5000b151348df9ace8e2d82bae5a"},{"version":"87579ddbe12c3795f838433abdb67bf346243066a2b8da9bce58e62d8de9a33a","signature":"83e145c5770e0338947541c14c83405bdc282b7e705e5e0152f650bb0686668f"},{"version":"fca8d6826fa1f9fb0e7bc426fa136633ace99ab594445683c9e122689e6ad683","signature":"12e96671705f236910b34abf2af510b984762c83228c16330ec2e3aa0c58b724"},{"version":"76fdbb8eba1c60d5bca5cee45f31fdb886e973eebec0898570021c0f4b8a1df5","signature":"27f1d53729910f23475a4db05f37c9af2bee6c5a6126944b75be19f2d3efb34d"},{"version":"ce4486eb95d1a94ee70fe1d3781f0573a182b0ae35295e2cc622984f41928974","signature":"fdd8dca508717ff7130bc2990227f7824a40c728541e94962629414cb21aa076"},{"version":"574b407bf7f276ebc9d49e4e6ee536f465bd41a4499d26b889ddb0c0e90140ed","signature":"7680a0d34dda1d9c5031f6d7c53bdf29230e33a2de88c44eef9f896726b4ffeb"},{"version":"c106a6b10589840707ec02c83d52953bc69a097cbb6085eb5458133a6f116192","signature":"a34a541572d1afa7e2e3dd26a6a473e2a03ed7354f5ed445685a483e9a1a9129"},{"version":"821d0dad2c0727940ac7910833b281e9fb475af6413edfc5bb380f2357499499","signature":"6ddd6a4cd4f6f3e90eb65285492bbd2890f8bf95642eddf21ec76deef915c15f"},{"version":"e8b1ead2590d5399ecaa713cf8c906b55523473fe55038f0f2cdb0428ccb731e","signature":"9177c457793eae5967cba29eb002119f25cf4a21e0b174ce66ef9ce17893cbfd"},{"version":"00942de8f43e448e95ecc76e5206d9da7d483e2ef8b3e07d4b0945a94e07a3d7","signature":"a013754e9c9372195578014767d9daa25f3a37a2cac34b96228225fbf6ba5c86"},{"version":"cadd4dd348a5eacbadc0c59b254814aeac8076d9bd1735c4c2a8a51d33117180","signature":"fd29d3400f8bdfbc70548cf71a4f27ca1c097845e4ba88c3322671a05163a2f0"},{"version":"c5b45951bd44b61c9b72ae72c13f79060eebc452dfc1263220515d869b0c712a","signature":"4380ba8dda48544e6b271c3b9bbc98802ab7962dad4e47e0e361d87b586df8fe"},{"version":"f1fb76094c19a1acf116dbe4dcf410676054822a013cdf29ae734521b8201f9f","signature":"a139c8ba8e2f80b631d6044d892c124dab4da3979d25882a3a76cfbe17254abf"},{"version":"b48d9821fadd54f21dff3e5f8ef915541ea79cb2f411f0150c44d602e7e20dbc","signature":"e0765ae3f00305586713ce62a4bf664422d24e87628b08ef81f15a3cba671ce6"},{"version":"027f4a05669892ab1326f72ac5eb84ab3dce780c91c39821e48d2f2a44272bad","signature":"214c15e6e71bd17e65a02339cee5bdd545ddbcea1a068bc58030f73eb306a5b7"},{"version":"9edcaa14e241f336ce11fbb13dfad933a5b2bf82dac5adb263dccfc40b890476","impliedFormat":99},{"version":"e3954ab905c6b7b87abd112e8f4c37865e63a7c3e0d089e2a533bd6614e254f2","impliedFormat":99},{"version":"0fb59682975069330ff1ae73ff3536dcd8b3f882d1f499eac023fd5ab22b4662","impliedFormat":99},{"version":"e7a4acd437c3e337f6580360cfe0827f00bfc94641ece1b7af4d5f75dfe4dbdf","impliedFormat":99},{"version":"e64b8b239623500a8d3d43f7b78146b9a9868c559208e603cc6e6199f854173c","impliedFormat":99},{"version":"69dc0677101b9b9895a16659640f1741180e4e7a29aabad2f5d92dd3333ef213","signature":"a611390c50fa771375d7d9b65cab4113f5f4a4babb52040100e64bc8354d78ff"},{"version":"15993f8ffda363848ead89a03c86fb5e505fcefbfdcf10bd85467bdc8275491e","signature":"cee698b913e7e007925346dc6179dfadcf2d1078255b0882205e52fd670a0f93"},{"version":"84e841502878baf2162f90dc32649a16c72cc49ed470e51bf702cc5ce4b25d1c","signature":"3fb60d8ac6b217d6e6111bd6e6f0b23d74ddfd396bfad99773ddacea5468333d"},{"version":"fe4c46a2a2bc2ff461f23f2df5e36ee697471be49a0b74ba430e1fc8f5357214","signature":"246ca7b44ee23d9ebbd17b8e84aed66ab0476034ad3aeb909b5342c5cfff0d89"},{"version":"09b05977baa4555e5dd1621e358dedaa3dc334e2887d5333eb3fdf22521b5967","signature":"0718a106aca3f632f6d289ddc5a682da9a6fbac041e85bf1d430697d538857f8"},{"version":"93f46314ca5cd6c66550e43fd7b9ff7b9dddb99dee9c3cb32525418703064044","signature":"49f09adfb62b142a1d0cf9e29a3b3faef79cb671237355dc971b3a5c3bd931ad"},{"version":"cb68caac612f2a6b3aca39f9973d4ef97adc37849657b353979244cc6eff4e28","signature":"9cd3b83650a88ffbf9b6ca3f3885fff403ad75fc861d4c1ba8e3228ede56c58f"},{"version":"8f76a6a07dc35658e197f7556297b345a2d1837b98956f134239f6024a226873","signature":"dd32c2b8aef08002349f8917a663aaf6e36b81a4134e44358fc84a3222b311fa"},{"version":"cf1ea2ea5cac46a67a386c5a689bb830e735035a523f2d75dd633ef80bdec268","signature":"fb6b3be1962c8cf5c462c90c10991082a107e399d48c84db2736af910afdab53"},{"version":"84c74f587aacb22d3203b9cd92bf9af65a055711d78d40c3f5bd0f015e00ce6b","signature":"ea564ae8f69e719fe85ac76e98eae5f1aa6561d8cf71a566911dfd48e81aee30"},{"version":"30be8b57a5a098447aee12bb0dd20b3573353a7b9956b9983132f0cb08163f03","signature":"9b0fc84934fe47863b2b614f2855a7aa0e88a38dc2cdb49f2c83983c615a5cb3"},{"version":"d0a9d76951c0cc9e75cfb7aaf58fe3cc8c7002b016153d0c76d12fec87b6a19d","signature":"48d4cb41063937c9066c62dff5cd67c2d935404e3ac11642ef269749609143c7"},{"version":"881ae59bd7b942797a451babc4ab3ae17de7748009d2512affdb8a493c735684","signature":"6b1029c752307fbd6189cd28a9f561181599fa5f4a36e41f49c8f2f7b6005491"},{"version":"74c72e8c78ccc896ae083443d98371fd20229c1fa9d2d2a32a107660f50ca28c","signature":"42aa6299b5d2b05ad1e9ac07aea7a803bb3cd7c90261093ae641f2cb7c3440ea"},{"version":"8fef71e8b89525935250b629a25b7f075adc27664034c6412c1602eb34161119","signature":"f42caa1c990576c228235815d660f6caf80cf9bd3d18e7c45c7354fe25acedb4"},{"version":"d44fd557a07bebc9cd09af0863255ea1e90f9e7f126aa7429bc60c29e732b26e","signature":"32b49b022bbe45e607741f81fc4ef06cd3a6b44d0a79db4f89d2db55e41ba4a5"},{"version":"0657584e3daa390cece6f40ffc7ff55ded733031c1c855607bf47ac9cd8875aa","signature":"b212e3487976b16c9a414adb7c8edefe9f325de2f109a94f9c59158a745dabec"},{"version":"d4a22007b481fe2a2e6bfd3a42c00cd62d41edb36d30fc4697df2692e9891fc8","impliedFormat":1},{"version":"a510938c29a2e04183c801a340f0bbb5a0ae091651bd659214a8587d710ddfbb","impliedFormat":99},{"version":"07bcf85b52f652572fc2a7ec58e6de5dd4fcaf9bbc6f4706b124378cedcbb95c","impliedFormat":99},{"version":"4368a800522ca3dd131d3bbc05f2c46a8b7d612eefca41d5c2e5ac0428a45582","impliedFormat":99},{"version":"720e56f06175c21512bcaeed59a4d4173cd635ea7b4df3739901791b83f835b9","impliedFormat":99},{"version":"349949a8894257122f278f418f4ee2d39752c67b1f06162bb59747d8d06bbc51","impliedFormat":99},{"version":"364832fbef8fb60e1fee868343c0b64647ab8a4e6b0421ca6dafb10dff9979ba","impliedFormat":99},{"version":"dfe4d1087854351e45109f87e322a4fb9d3d28d8bd92aa0460f3578320f024e9","impliedFormat":99},{"version":"886051ae2ccc4c5545bedb4f9af372d69c7c3844ae68833ed1fba8cae8d90ef8","impliedFormat":99},{"version":"3f4e5997cb760b0ef04a7110b4dd18407718e7502e4bf6cd8dd8aa97af8456ff","impliedFormat":99},{"version":"381b5f28b29f104bbdd130704f0a0df347f2fc6cb7bab89cfdc2ec637e613f78","impliedFormat":99},{"version":"a52baccd4bf285e633816caffe74e7928870ce064ebc2a702e54d5e908228777","impliedFormat":99},{"version":"c6120582914acd667ce268849283702a625fee9893e9cad5cd27baada5f89f50","impliedFormat":99},{"version":"da1c22fbbf43de3065d227f8acbc10b132dfa2f3c725db415adbe392f6d1359f","impliedFormat":99},{"version":"858880acbe7e15f7e4f06ac82fd8f394dfe2362687271d5860900d584856c205","impliedFormat":99},{"version":"8dfb1bf0a03e4db2371bafe9ac3c5fb2a4481c77e904d2a210f3fed7d2ad243a","impliedFormat":99},{"version":"bc840f0c5e7274e66f61212bb517fb4348d3e25ed57a27e7783fed58301591e0","impliedFormat":99},{"version":"26438d4d1fc8c9923aea60424369c6e9e13f7ce2672e31137aa3d89b7e1ba9af","impliedFormat":99},{"version":"1ace7207aa2566178c72693b145a566f1209677a2d5e9fb948c8be56a1a61ca9","impliedFormat":99},{"version":"a776df294180c0fdb62ba1c56a959b0bb1d2967d25b372abefdb13d6eba14caf","impliedFormat":99},{"version":"6c88ea4c3b86430dd03de268fd178803d22dc6aa85f954f41b1a27c6bb6227f2","impliedFormat":99},{"version":"11e17a3addf249ae2d884b35543d2b40fabf55ddcbc04f8ee3dcdae8a0ce61eb","impliedFormat":99},{"version":"4fd8aac8f684ee9b1a61807c65ee48f217bf12c77eb169a84a3ba8ddf7335a86","impliedFormat":99},{"version":"1d0736a4bfcb9f32de29d6b15ac2fa0049fd447980cf1159d219543aa5266426","impliedFormat":99},{"version":"11083c0a8f45d2ec174df1cb565c7ba9770878d6820bf01d76d4fedb86052a77","impliedFormat":99},{"version":"d8e37104ef452b01cefe43990821adc3c6987423a73a1252aa55fb1d9ebc7e6d","impliedFormat":99},{"version":"f5622423ee5642dcf2b92d71b37967b458e8df3cf90b468675ff9fddaa532a0f","impliedFormat":99},{"version":"21a942886d6b3e372db0504c5ee277285cbe4f517a27fc4763cf8c48bd0f4310","impliedFormat":99},{"version":"41a4b2454b2d3a13b4fc4ec57d6a0a639127369f87da8f28037943019705d619","impliedFormat":99},{"version":"e9b82ac7186490d18dffaafda695f5d975dfee549096c0bf883387a8b6c3ab5a","impliedFormat":99},{"version":"eed9b5f5a6998abe0b408db4b8847a46eb401c9924ddc5b24b1cede3ebf4ee8c","impliedFormat":99},{"version":"af85fde8986fdad68e96e871ae2d5278adaf2922d9879043b9313b18fae920b1","impliedFormat":99},{"version":"8a1f5d2f7cf4bf851cc9baae82056c3316d3c6d29561df28aff525556095554b","impliedFormat":99},{"version":"9ee1f62857343437430903826226eab4a6731828888c1ac173bfed1dc1e6177f","signature":"7d562126a8607db4d8cb3624830db1372608c9b6b59384dd1eb8417b2c4ab2be"},{"version":"d2360349e11623e033a729c16ccbb93984dfcb59d4cb12fb3ce76d9aadd99de7","signature":"7e5b1852f58978b1095f9a48e6d76d113c0c7b3a6c247302ef18e8b489880e94"},{"version":"7a0a4244d8cb27627752026c0e4be10e8404f2fde1d192b2696a29b8df2427eb","signature":"f02eed248f1ae959203e8f56933540efc81ceca55365cab8bbcebf4fe0413cb8"},{"version":"025912f4e8c29f644ed2169a8f59f0a34ab7e7b5a298de2e6cc495a166618edb","signature":"be4c979512c978ad22544a765039ba9338e90539e656e0adbac357d9d5116890"},{"version":"98431ba8667a72310bf87e8d20a8d9fc6b444c03501234ad270a37c64e9c823a","signature":"58ddaee7d7383718665829fbc6930adc17395d9f46e47bbeb997a36869e48b49"},{"version":"d005d73b140b90106093b7aa32aee7c7385bfc83bbf6bbce16362368cd17910b","signature":"62078e13c0629f619120e6439193760e66dab737560a7bbf73492b17e2b623e6"},{"version":"4d309fce0b8c8cd4fc2fe174785790de4fcb2a21b07b7a22058a2afabe7c4b24","signature":"bf8805d1c9460e86c8913319136ff824429f96aaaec7bc38e43c5671532e8b31"},{"version":"b56fc20d655a0e0eecb61ed1557969d1c6e6c5a8b96bd40df65053cc8cac4c65","signature":"3de8abf8a377118fd5540f4a72d9af24c60ad375b5a3d239c2b866ccce029dee"},{"version":"b5307ecce976f66f0b0dcd0c9a841edd29ba143729cbd86be28e88226529955b","signature":"3de316d0e3fdbfc3f86a39b80815b805efd46df49130a368fd5490cccf0ba983"},{"version":"d7beda47d1fd55e81e09dfc58e0ae3e8ff150936e855ab89c2a4ea0c3b6bce98","signature":"a72817d64cac5d1d92cfa266b8bb5ddb7ec6f12d0be571ed5eeb393dd9795371"},{"version":"b4dae15558cf17805565a38bd72a0f754c528400fb83780b37af87369d72422c","signature":"e2e9e6eba9363c5b2aeb1c03df70e773d0d730143547004f07caf7e3c1fd37d8"},{"version":"168ddd74877e5268b68ffa92c0b4851bcbeb3ffcff03f09f86b75ba98f75b63b","signature":"31a40bb81e0bcdda2d3e78a12df728ed96a8f5b43650c8f10b6650f435345144"},{"version":"fae089d170ac936b0905232b26d816e781ac170d1d360ec7db7e9550a8b2d03c","signature":"270bd604cb5498de3612dbff8cc7e93c32ce404c0e6809a598e3abf7825ccc75"},{"version":"ae34ecb995774d2df9c05e84114804b45b5b153979005a71a41398806d899556","signature":"84debec1e152c45a3dee9d170564b70fa89a162bf380c8350f2a6c1e2a1ad222"},{"version":"10b6e68769cba431d3ca78484351ad6efcc8f0d4955807acc2b5936ec85079a6","signature":"321b88cbbf0caf0cf3c50b7537663af45ea3b597f7c854c842f8ae917d9dfcd1"},{"version":"f4e8f4151c3490cf7b68c685aabe901cbab19f962aaa2f118a97550e22689a76","impliedFormat":1},{"version":"799003c0ab928582fca04977f47b8d85b43a8de610f4eef0ad2d069fbb9f9399","impliedFormat":1},{"version":"d998eea476c695d8e4ff9d007d5b46d49ca2ffa052f74dc20ca516425abd57b1","impliedFormat":1},{"version":"a0bd46d587005aad4819980f6cf2dbcd80ebf584ed1a946202326a27158ba70e","impliedFormat":1},{"version":"07fcbb61a71bd69a92a5bbde69e60654666cf966b5675c2010c3bf9f436f056a","impliedFormat":1},{"version":"88b2eb23d36692162f2bf1e50577ebcde26de017260473e03ed9a0e61e2726a4","impliedFormat":1},{"version":"23ffbd8c0e20a697d2ea5a0cf7513fb6e42c955a7648f021da12541728f62182","impliedFormat":1},{"version":"43fba5fc019a4ce721a6f53ddb97fdc34c55049cfb793bc544d5c864ee5560b9","impliedFormat":1},{"version":"f4e12292c9a7663a13d152195019711c427c552eb0fa02705e0f61370cd5547a","impliedFormat":1},{"version":"c127ebf14d1b59d1604865008fb072865c5ca52277621f566092fe1f42ce0954","impliedFormat":1},{"version":"def638da26d84825a312113a20649d3086861de7c06a18ea13121278702976fd","impliedFormat":1},{"version":"fbaf86f8ba11298dea2727ce0da84b4ab6ae6c265e1919d44aff7d9b2bbc578a","impliedFormat":1},{"version":"c1010caaeaca8e420c6e040c2e822dbe18702459c93a7d2d5de38597d477b8cd","impliedFormat":1},{"version":"e1f0d8392efd9d71f2644eb97d3f33d90827e30ea8051d93b6f92bb11dff520a","impliedFormat":1},{"version":"085211167559ca307d4053bb8d2298d5ad83cbc3d2ae9bb4c8435a4cabf59369","impliedFormat":1},{"version":"55fc49198d8a85a73cdb79e596d9381cfdc9de93c32c77d42e661c1c1e7268ef","impliedFormat":1},{"version":"6a53fb3df8dd32ed1a65502ca30aeae19cfe80990e78ba68162d6cb2a7fed129","impliedFormat":1},{"version":"b5dcc18d7902597a5584a43c1146ca4fe0295ceb5125f724c1348f6a851dd6ed","impliedFormat":1},{"version":"0c6b0f3fbe6eb6a3805170b3766a341118c92ed7b6d1f193b9f35aa82f594846","impliedFormat":1},{"version":"60eaadb36cf157c5cae9c40e84fa367d04f52a150db3920dbe35139780739143","impliedFormat":1},{"version":"4680a32b1098c49dc87881329af1e68af9af94e051e1b9e19fed555a786f6ce6","impliedFormat":1},{"version":"89fcd129ec37f321cddcdb6b258ffe562de4281e90ec3ccbe7c1199ba39359ca","impliedFormat":1},{"version":"4313011f692861c2c1f5205d7f9a473e763adab6444f9853b96937b187fb19f7","impliedFormat":1},{"version":"caa57157e7bdb8d5f1efe56826fb84a6c8f22a1927bba7fa21fd54e2a44ccba2","impliedFormat":1},{"version":"6b74700abfe4a9b88be957fd8e373cfd998efb1a5f6ad122da49a92997e183ad","impliedFormat":1},{"version":"9ef1342f193bd8bae86c64e450c3ac468ef08652110355e1f3cdd45362eb95c4","impliedFormat":1},{"version":"6853c91662c36a2bf4c8371a87177c819007c76a23c293ef3f686ce9157ae4c8","impliedFormat":1},{"version":"9be1c5dabce43380d13fc621100676b03d420b5687b08d1288f479bee68ab7a8","impliedFormat":1},{"version":"8996d218010896712678e6a0337d8ef8b81c1066ab76f637dd8253f0d6ff838d","impliedFormat":1},{"version":"a15603bf387fc45defe28a68f405a6c29105e135c4e8538eeb6d0a1ef5b69a81","impliedFormat":1},{"version":"84e2532e4d42949a2775cdd8bb7b2b97370dd6ddb683d0c199b21bf6978b152d","impliedFormat":1},{"version":"22bf5f19f620db3b8392cfece44bdd587cdbed80ba39c88a53697d427135bf37","impliedFormat":1},{"version":"23ebbd8d484d07e1c1d8783169c20570ed8409966b28f6be6cf8e970d76ef491","impliedFormat":1},{"version":"18b6fa2c778cad6489f2febf76433453f5e2432ec3535f2d45ae7d803b93cc17","impliedFormat":1},{"version":"609d0d7419999cf44529e6ba687e2944b2fc7ad2570d278fd4e6b1683c075149","impliedFormat":1},{"version":"249cf421b8878a3fe948d9c02f6b0bae65491b3bb974c2ffc612341406fa78ff","impliedFormat":1},{"version":"b4aa22522d653428c8148ddbf1dcc1fb3a3471e15eb1964429a67c390d8c7f38","impliedFormat":1},{"version":"30b2cee905b1848b61c7d28082ebfa2675dd5545c0d25d1c093ce21a905cdccc","impliedFormat":1},{"version":"0a2a2eed4137368735205de97c245f2a685af1a7f1bf8d636b918a0ee4ff4326","impliedFormat":1},{"version":"69f342ce86706aa2835a62898e93ea7a1f21b1d89c70845da69371441bb6cd56","impliedFormat":1},{"version":"b5ab4282affcfd860dd1cc3201653f591509a586d110f8e5b1b010508ba79b2c","impliedFormat":1},{"version":"d396233f6cd3edf0d33c2fbfc84ded029c3ea4a05af3c94d09d31a367cced111","impliedFormat":1},{"version":"bc41a726c817624a5136ae893d7aac7c4dc93c771e8d243a670324bccf39b02b","impliedFormat":1},{"version":"710728600e4b3197f834c4dd1956443be787d2e647a72f190bf6519f235aaadd","impliedFormat":1},{"version":"a45097e01ef30ba26640fed365376ab3ccd5faf97d03f20daff3355a7e60286a","impliedFormat":1},{"version":"763cbb7c22199f43fd5c2b1566af5ba96bf7366f125dd31a038a2291cbc89254","impliedFormat":1},{"version":"031933bf279b7563e11100b5e1746397caf3a278596796a87bc0db23cf68dc9e","impliedFormat":1},{"version":"a4a54c1f58fc6e25a82e2c0f651bf680058bd7f72cfb2d43b85ee0ab5fe2e87e","impliedFormat":1},{"version":"9613d789b6f1037f2523a8f70e1b736f1da4566b470593da062be5c9e13dac57","impliedFormat":1},{"version":"0d2a320763a0c9c71493f8f1069971018c8720a6e7e5a8f10c26b6de79aa2f7d","impliedFormat":1},{"version":"817e0df27a237a268dc16e5acffc19f9a74467093af7a0ba164ee927007a4d25","impliedFormat":1},{"version":"43102521b5ca50ff1865188c3c60790feaed94dc9262b25d4adec4dbc76f9035","impliedFormat":1},{"version":"f99947f8d873b960b0115e506ef9c43f4e40c2071b1d20375564538af4a6023b","impliedFormat":1},{"version":"c1e5ad5ca89d18d2a36d25e8ec105623648cf35615825e202c7d8295a49d61ab","impliedFormat":1},{"version":"2b6c9cb81da4e0a2e32a58230e8c0dec49fc5b345efb7f7a3648b98956be4b13","impliedFormat":1},{"version":"99e34af3ede50062dcc826a1c3ce2d45562060dfd0f29f8066381a6ef548bf2a","impliedFormat":1},{"version":"49f5c2a23ea5fc4b2cdb4426f09d1c8b83f8409fa2af13ef38845cc9b9d4bc3d","impliedFormat":1},{"version":"e935227675144b64ecde3489e4a5e242eeb25fdd6b7464b8c21ad1f7a0faa88b","impliedFormat":1},{"version":"b42e6bbe88dc79c2d6dc5605fb9c15184e70f64bdd7b8d4069b802b90ce86df6","impliedFormat":1},{"version":"b9cd712399fdc00fdae07e96c9b39c3cb311e2a8a5425f1bd583f13cab35e44b","impliedFormat":1},{"version":"5a978550ae131b7fef441d67372fd972abab98ea9fdb9fa266e8bdc89edcb8d6","impliedFormat":1},{"version":"4f287919cfc1d26420db9f0457cd5c8780b1ef0a9f949570936abe48d3a43d91","impliedFormat":1},{"version":"496b23b2fd07e614bc01d90dd4388996cb18cd5f3a612d98201e9f683e58ad2e","impliedFormat":1},{"version":"dcfbe42824f37c5fb6dc7b9427ef2500791ec0d30825ecb614f15b8d5bf5a667","impliedFormat":1},{"version":"390124ad2361b46bf01851d25e331cd7eed355d04451d8b2a4aa985c9de4f8ce","impliedFormat":1},{"version":"14d94f17772c3a58eda01b6603490983d845ee2012cd643f7497b4e22566aacb","impliedFormat":1},{"version":"03ef2386c683707ce741a1c30cb126e8c51a908aa0acc01c3471fafb9baaacd5","impliedFormat":1},{"version":"66a372e03c41d2d5e920df5282dadcec2acae4c629cb51cab850825d2a144cea","impliedFormat":1},{"version":"5b48ba9a30a93176a93c87f9e0abf26a9df457eeb808928009439ca578b56f27","impliedFormat":1},{"version":"4707625392316d3c16edbd0716f4ac310e8ff5d346d58f4d01a2b7e0533a23df","impliedFormat":1},{"version":"154d58a4b2d9c552dc864ea39c223d66efd0ed2dd8b55bd13db5225d14322915","impliedFormat":1},{"version":"6a830433fa072931b4ea3eb9aa5fa7d283f470080586a27bfe69837a0f12de9a","impliedFormat":1},{"version":"d25e930e181f4f69b2b128514538f2abb54ef1d48a046ad776ac6f1cda885a72","impliedFormat":1},{"version":"0259b4c21bc93b52ca82c755f97fc90481072bcc44a8010131b2ea7326cf03fe","impliedFormat":1},{"version":"bea43a13a1104a640da0cb049db85c6993f484a6cc03660496b97824719ecc91","impliedFormat":1},{"version":"0224239d61fe66d4900544d912b2e11c2cca24b4707d53fdb94b874a01e29f48","impliedFormat":1},{"version":"2bce8fd2d16a9432110bbe0ba1e663fd02f7d8b8968cd10178ea7bc306c4a5df","impliedFormat":1},{"version":"9c4ad63738346873d685e5c086acbf41199e7022eff5b72bb668931e9ca42404","impliedFormat":1},{"version":"cfb6329bf8ce324e83fe4bbdee537d866a0d5328246f149a0958b75d033de409","impliedFormat":1},{"version":"efc3816f19ea87a7050c84271ea3d3aad9631a517c168013c4f4b6724c287ce0","impliedFormat":1},{"version":"f99f6737336140047e8dd4ade3859f08331aa4b17bc2bd5f156a25c54e0febbc","impliedFormat":1},{"version":"12a2b25c7c9c05c8994adf193e65749926acfcc076381f7166c2f709a97bdf0a","impliedFormat":1},{"version":"0f93a3fdd517c1e45218cd0027c1d6b82237e379dc6b66d693aab1fe74c82e81","impliedFormat":1},{"version":"03c753da0bee80ad0d0f1819b9b42dfe9bf9f436664caf15325aa426246fd891","impliedFormat":1},{"version":"18f5bf1dae429c451f20171427c9e3223fade4346af4dfd817725cbeb247a09d","impliedFormat":1},{"version":"a4eece5fab202e840dd84f7239e511017a8162edb8fc8b54ff2851c5c844125c","impliedFormat":1},{"version":"c4a94af483a63bf947d89f97553a55df5107c605ec8a26f0b9b8bdcc14bd6d89","impliedFormat":1},{"version":"19de2915ccebc0a1482c2337b34cb178d446def2493bf775c4018a4ea355adb8","impliedFormat":1},{"version":"9be8fc03c8b5392cd17d40fd61063d73f08d0ee3457ecf075dcb3768ae1427bd","impliedFormat":1},{"version":"3b568b63f0e8b3873629a4d7a918dce4266ad41461004ab979f8dcdfd13532bb","impliedFormat":1},{"version":"a5e5223c775fe30d606b8aaa521953c925d5ad176a531c2b69437d2461aaabbd","impliedFormat":1},{"version":"8cbf41d2d1ce8ac2066783ae00613c33feef07493796f638e30beaf892e4354a","impliedFormat":1},{"version":"e22ad737718160df198cd428f18da707177d0467934cecdeed4be6e067b0c619","impliedFormat":1},{"version":"15bf5ed8cb7c1a1e1db53fa9b45bc1a1c73c0497735343a8d0c59fdb596a3744","impliedFormat":1},{"version":"791fce84bce8b6948e4f23422d9cbbd7d08c74b3f91cca12dcae83d96079798b","impliedFormat":1},{"version":"8a2619c8e24305f6b9700b35af178394b995dcb28690a57a71cca87ee7e709ae","impliedFormat":1},{"version":"f95fd2fc3cc164921a891f5d6c935fa0d014a576223dd098fc64677e696b0025","impliedFormat":1},{"version":"8c9cecaaa9caba9a8caa47f46dcf24b524b27899b286d8edcc75a81b370d2ba3","impliedFormat":1},{"version":"2b7a82692ecc877c5379df9653902e23f2d0d0bc9f210ec3cf9e47be54413c5c","impliedFormat":1},{"version":"e2ad09c011cf9d7ee128875406bef787eeb504659495f42656a0098c15fe646c","impliedFormat":1},{"version":"eb518567ea6b0b2623f9a6d37c364e1b1ac9d8b508d79e558f64ac05c17e2685","impliedFormat":1},{"version":"630a48fb8f6b07161588e0aee3f9d301c59c97e1532c884118f89368baf4073b","impliedFormat":1},{"version":"14736c608aa46120f8d6d0bc5e0721b46b927bc7eba20e479600571935f27062","impliedFormat":1},{"version":"7574803692d2230db13205a7749b9c3587dccaccdf9e76f003f9e08078bb6d09","impliedFormat":1},{"version":"f3cc1588e666651c51353b1728460bee8acbc6e0f36be8c025eaaf292dca525d","impliedFormat":1},{"version":"0d4ea8a20527dcf3ad6cf1bd188b8ad4e449df174fad09b9e540ed81080af834","impliedFormat":1},{"version":"aa82876d59912d25becff5a79ed7341af04c71bfeb2221cc0417bc34531125e2","impliedFormat":1},{"version":"6f4b0389f439adc84cba35d45428668eabcfbdd351ba17e459d414ca51ab8eb8","impliedFormat":1},{"version":"d5dd33d15fbb07668c264b38065ac542a07a7650af4917727bbc09b58570e862","impliedFormat":1},{"version":"7d90202d0212e9cdc91a20bfddf04a539c89f09fe1d64db3343546fa2eb37e71","impliedFormat":1},{"version":"1a5d073c95a3a4480b17d2fa7fd41862a9df0cb2afaee86834b13649e96bdb45","impliedFormat":1},{"version":"2092495a5b3116c760527a690c4529748f2d8b126cdd5f56b2ce2230b48aba3f","impliedFormat":1},{"version":"620b29d6adbd4061bc0a8fedf145fcc8e8fc9648fb6e0a39726e33babb4e07bc","impliedFormat":1},{"version":"931eda51b5977f7f3fa7a0d9afde01cfd8b0cc1df0bb66dcf8c2cf6e7090384e","impliedFormat":1},{"version":"b084a412374bdd124048c52c4e8a82d64f3adec6c0a9ad5ecbb7317636039b0f","impliedFormat":1},{"version":"11199daa694c3ced3cc2a382a3fa7bd64e95eb40f9bbc3979fc8fb43f5ba38cc","impliedFormat":1},{"version":"2c86f279d7db3c024de0f21cd9c8c2c972972f842357016bfbbd86955723b223","impliedFormat":1},{"version":"dfb53b9d748df3e140b0fddb75f74d21d7623e800bb1f233817a1a2118d4bb24","impliedFormat":1},{"version":"8cfc293b33082003cacbf7856b8b5e2d6dd3bde46abbd575b0c935dc83af4844","impliedFormat":1},{"version":"7730c538d6d35efe95d2c0d246b1371565b13037e893178033360b4c9d2ac863","impliedFormat":1},{"version":"b256694544b0d45495942720852d9597116979d52f2b53c559fda31f635c60df","impliedFormat":1},{"version":"794e8831c68cc471671430ee0998397ea7a62c3b706b30304efdc3eaff77545a","impliedFormat":1},{"version":"9cfc1b227477e31988e3fb18d26b6988618f4a5da9b7da6bc3df7fc12fb2602e","impliedFormat":1},{"version":"264a292b6024567dd901fdabbf3239a8742bea426432cdbda4cf390b224188e1","impliedFormat":1},{"version":"f1556a28bb8e33862dcfa9da7e6f1dca0b149faf433fe6a50153ae76f3362db1","impliedFormat":1},{"version":"1d321aea1c6a77b2a44e02e5c2aeff290e3f1675ead1a86652b6d77f5fea2b32","impliedFormat":1},{"version":"4910efc2ce1f96d6e71a9e7c9437812ffae5764b33ab3831c614663f62294124","impliedFormat":1},{"version":"e3ceab51a36e8b34ab787af1a7cf02b9312b6651bac67c750579b3f05af646c1","impliedFormat":1},{"version":"baf9f145bcee1b765bed6e79fd45e1ff0ca297a81315944de81eb5d6fff2d13d","impliedFormat":1},{"version":"2afd62362b83db93cd20de22489fe4d46c6f51822069802620589a51ccad4b99","impliedFormat":1},{"version":"9f0cd9bd4ab608123b88328c78814738cbdee620f29258b89ef8cd923f07ff9c","impliedFormat":1},{"version":"801186c9e765583c825f28dab63a7ad12db5609e36dc6d9acbdc97d23888a463","impliedFormat":1},{"version":"96c515141c6135ccd6fb655fb9e3500074a9216ba956fb685dc8edc33f689594","impliedFormat":1},{"version":"416af6d65fc76c9ced6795f255cb1096c9d7947bede75b82289732b74d902784","impliedFormat":1},{"version":"a280c68b128ebba35fb044965d67895201c2f83b6b28281bb8b023ade68bf665","impliedFormat":1},{"version":"6fa118f15723b099a41d3beea98ed059bcd1b3eda708acf98c5eff0c7e88832f","impliedFormat":1},{"version":"dcbf582243e20ea50d283f28f4f64e9990b4ed4a608757e996160c63cff6aa99","impliedFormat":1},{"version":"efa432d8fd562529c4e9f859fd936676dd8fef5d3b4bedb06f754e4740056ea9","impliedFormat":1},{"version":"a59b66720b2ccf2e0150fafb49e8da8dabdf4e1be36244a4ccd92f5bd18e1e9e","impliedFormat":1},{"version":"c657fb1ec3b727d6a14a24c71ea20c41cb7d26a503e8e41b726bb919eb964534","impliedFormat":1},{"version":"50d6d3174868f6e974355bf8e8db8c8b3fcf059315282a0c359ecf799d95514a","impliedFormat":1},{"version":"86bf79091014a1424fc55122caa47f08622b721a4d614b97dd620e3037711541","impliedFormat":1},{"version":"7a63313dff3a57f824a926e49a7262f7bd14e0e833cf45fa5af6da25286769c2","impliedFormat":1},{"version":"36dcaeffe1a1aed1cb84d4feba32895bf442795170edccc874fa32232b2354e5","impliedFormat":1},{"version":"686c6962d04d90edafc174aa5940acb9c9db8949c8d425131c01d796cf9a3aef","impliedFormat":1},{"version":"2b1dbc3d5762d6865744b6e7be94b8b9004097698c37e93e06983e42dd8fe93b","impliedFormat":1},{"version":"eb5e8f74826bdf3a6a0644d37a0f48133f8ad0b5298cc2c574102868542ba4eb","impliedFormat":1},{"version":"c6a82a9673ba517cf04dd0803513257d0adf101aed2e3b162a54d840c9a1a3b2","impliedFormat":1},{"version":"fc9f0f415abaa323efcecc4a4e0b6763bfe576e32043546d44f1de6541b6399b","impliedFormat":1},{"version":"2c4d772ac7ac56a44deef82903364eb7c78dd7bc997701123df0ce4639fe39bb","impliedFormat":1},{"version":"9369ef11eed17c1c223fdea9c0fa39e83f3722914ef390b1448db3d71620c93a","impliedFormat":1},{"version":"aa84130dbc9049bba6095f87932138698f53259b642635f6c9e92dd0ddc7512c","impliedFormat":1},{"version":"084ceadd21efabd4b58667dca00d4f644306099151d2ee18cd28a395855b8009","impliedFormat":1},{"version":"b9503e29f06c99b352b7cae052da19e3599fa42899509d32b23a27c9bb5bebf6","impliedFormat":1},{"version":"75188920fe6ccc14070fe9a65c036049f1141d968c627b623d4a897ec3587e15","impliedFormat":1},{"version":"e2e1df7f45013d2b34f8d08e6ae5a9339724b0ea251b5445fcca3e170e640105","impliedFormat":1},{"version":"af06feb5d18a6ea11c088b683bdb571800d1f76b98d848eecdf41e5ec8f317fd","impliedFormat":1},{"version":"0596af52b95e0c8adc2c07f49f109d746b164739c5866fa8bb394dd6329a3725","impliedFormat":1},{"version":"c3365d08fe7a1ccc3b8e8638edc30123007f3241b4604e2585b9f14422ab97d8","impliedFormat":1},{"version":"a7a3d96b04bb0ec8cb7d2669767c4756f97dd70d08548f9e6522dde4de8e8a03","impliedFormat":1},{"version":"745e960e885a4ba04c872225cbb44bd67a7490d169ceaefab7c0dfc444768676","impliedFormat":1},{"version":"0b1ce1768cde3535493a9daf99e3bbb8c7dcc3a7f9d8cd358cb846af71ce5cdf","impliedFormat":1},{"version":"48b9603f6e8a7c94b727277592a089f94261baa64e6c9d18165da0481663a69e","impliedFormat":1},{"version":"3c20a3bb0c50c819419f44aa55acc58476dad4754a16884cef06012d02b0722f","impliedFormat":1},{"version":"4dc64902cb86e677a928293593658fbf53388f9a30d2b934140c70a7267b07ec","impliedFormat":1},{"version":"cb4fd56539a61d163ea9befe6b0292c32aa68a104c1f68f61416f1bc769bcfba","impliedFormat":1},{"version":"0d852bdc2b72b22393a8eebe374ee3efe3e0d44e630037b5e1b6087985388e62","impliedFormat":1},{"version":"b6c9a2deefb6a57ff68d2a38d33c34407b9939487fc9ee9f32ba3ecf2987a88a","impliedFormat":1},{"version":"f6b371377bab3018dac2bca63e27502ecbd5d06f708ad7e312658d3b5315d948","impliedFormat":1},{"version":"faa72893e85cb8ebb1dafde6b427e5204e60bb5f3ee6576bb64c01db1f255bc8","impliedFormat":1},{"version":"95b7ed47b31a6eaddcdd853ee0871f2bb61e39ce36a01d03dfafb83766f6c10c","impliedFormat":1},{"version":"19287d6b76288c2814f1633bdd68d2b76748757ffd355e73e41151644e4773d6","impliedFormat":1},{"version":"fc4e6ec7dade5f9d422b153c5d8f6ad074bd9cc4e280415b7dc58fb5c52b5df1","impliedFormat":1},{"version":"3aea973106e1184db82d8880f0ca134388b6cbc420f7309d1c8947b842886349","impliedFormat":1},{"version":"765e278c464923da94dda7c2b281ece92f58981642421ae097862effe2bd30fa","impliedFormat":1},{"version":"de260bed7f7d25593f59e859bd7c7f8c6e6bb87e8686a0fcafa3774cb5ca02d8","impliedFormat":1},{"version":"d95c4eaad4df9e564859f0c74a177fa0b2e5f8a155939b52580566ab6b311c3f","impliedFormat":1},{"version":"7192a6d17bfa06e83ba14287907b7c671bef9b7111c146f59c6ea753cfc736b9","impliedFormat":1},{"version":"5156d3d392db5d77e1e2f3ea723c0a8bd3ca8acffe3b754b10c84b12f55a6e10","impliedFormat":1},{"version":"a6494e7833ee04386a9f0c686726f7cb05f52f6e069d9293475ccb1e791ee0da","impliedFormat":1},{"version":"d9af0c89a310256851238f509a22aa1071a464d35dc22ea8c2a0bae42dd81bc5","impliedFormat":1},{"version":"291642a66e55e6ca38b029bc6921c7301f5c7b7acf21ae588a5f352e6c1f6d58","impliedFormat":1},{"version":"43cd7c37298b051d1ce0307d94105bcd792c6c7e017282c9d13f1097c27408e8","impliedFormat":1},{"version":"e00d8cce6e2e627654e49c543b582568ad0bf27c1d4ad1018d26aff78d7599df","impliedFormat":1},{"version":"ed13354f0d96fb6d5878655b1fead51722b54875e91d5e53ef16de5b71a0e278","impliedFormat":1},{"version":"fcb934d0fcdee06a8571bd90aa3a63aa288c784b3ebcecfe7ae90d3104d321f4","impliedFormat":1},{"version":"af682dfabe85688289b420d939020a10eb61f0120e393d53c127f1968b3e9f66","impliedFormat":1},{"version":"0dca04006bf13f72240c6a6a502df9c0b49c41c3cab2be75e81e9b592dcd4ea8","impliedFormat":1},{"version":"7dc0b5e3d7be8e1f451f0545448c2eaa02683f230797d24434b36f9820d5a641","impliedFormat":1},{"version":"247af61cdc3f4ec7876b9e993a2ecdd069e10934ff790c9cee5811842bff49eb","impliedFormat":1},{"version":"4be8c2c63d5cd1381081d90021ddfaef106881df4129eddeeaba906f2d0f75d0","impliedFormat":1},{"version":"012f621d6eb28172afb1b2dc23898d8bc74cf35a6d76b63e5581aa8e50fa71b3","impliedFormat":1},{"version":"3a561fa91097e4580c5349ce72e69d247c31c11d29f39e1d0bd3716042ff2c0b","impliedFormat":1},{"version":"bc9981a79dda3badea61d716d368a280c370267e900f43321f828495f4fef23c","impliedFormat":1},{"version":"2ed3b93d55aea416d7be8d49fe25016430caab0fe64c87d641e4c2c551130d17","impliedFormat":1},{"version":"3d66dfc31dd26092c3663d9623b6fc5cec90878606941a19e2b884c4eacd1a24","impliedFormat":1},{"version":"6916c678060af14a8ce8d78a1929d84184e9507fba7ab75142c1bcb646e1c789","impliedFormat":1},{"version":"3eea74afae095028597b3954bde69390f568afc66d457f64fff56e416ea47811","impliedFormat":1},{"version":"549fb2d19deb7d7cae64922918ddddf190109508cc6c7c47033478f7359556d2","impliedFormat":1},{"version":"e7023afc677a74f03f8ccb567532fe9eedd1f5241ee74be7b75ac2336514f6f6","impliedFormat":1},{"version":"ff55505622eac7d104b9ab9570f4cc67166ba47dd8f3badfb85605d55dd6bdc9","impliedFormat":1},{"version":"102fac015b1eebfa13305cb90fd91a4f0bbcabb10f2343556b3483bbb0a04b62","impliedFormat":1},{"version":"18a1f4493f2dbad5fd4f7d9bfba683c98cf5ed5a4fa704fa0d9884e3876e2446","impliedFormat":1},{"version":"f57e6707d035ab89a03797d34faef37deefd3dd90aa17d90de2f33dce46a2c56","impliedFormat":1},{"version":"cc8b559b2cf9380ca72922c64576a43f000275c72042b2af2415ce0fb88d7077","impliedFormat":1},{"version":"1a337ca294c428ba8f2eb01e887b28d080ee4a4307ae87e02e468b1d26af4a74","impliedFormat":1},{"version":"310fe80ff40a158c2de408efbe9de11e249c53d2de5e33ca32798e6f3fbc8822","impliedFormat":1},{"version":"d6ce96c7bb34945c1d444101f44e0f8ba0bba8ab7587a6cc009a9934b538c335","impliedFormat":1},{"version":"1b10a2715917601939a9288d49beccd45b591723256495b229569cd67bbe48a8","impliedFormat":1},{"version":"7498dfdeed2e003ec49cdf726ff6c293002d1d7fdadbc398ce8aafe6d0688de7","impliedFormat":1},{"version":"8492306a4864a1dc6fc7e0cc0de0ae9279cbd37f3aae3e9dc1065afcdc83dddc","impliedFormat":1},{"version":"9c86abbc4fd0248f56abc12aaecd76854517389af405d5ec2eb187fdb00a606f","impliedFormat":1},{"version":"9ffd906f14f8b059d6b95d6640920f530507e596e548f7a595da58ab66e3ce76","impliedFormat":1},{"version":"1884bccc10ce40adca470c2c371c1c938b36824f169c56f7f43d860416ca0a4c","impliedFormat":1},{"version":"986b55b4f920c99d77c1845f2542df6f746cb5adc9ab93eb1545a7e6ef37590d","impliedFormat":1},{"version":"cd00906068b81fbd8a22d021580ac505e272844408174520fafed0ae00627a5d","impliedFormat":1},{"version":"69fab68a769c17a52a24b868aeb644f3ee14abaa5064115f575ddd59231105ce","impliedFormat":1},{"version":"e181eb86b2caf80fe18c72efce6b913bc226e4a69a5456eaf4f859f1c29c6fd6","impliedFormat":1},{"version":"93f7871380478bc6acf02ad9f3dc7da0c21997caebbe782eb93a11b7bd06a46d","impliedFormat":1},{"version":"d00279ab020713264f570d5181c89ca362b7de8abddf96733de86bce0eca082c","impliedFormat":1},{"version":"f7db473f1d5d2a124f14886ac9dbfeccfbb94a98bbe1610a47c30c2933afa279","impliedFormat":1},{"version":"f44cf6c6d608ef925831e550b19841b5d71bd87195bd346604ff05644fb0d29c","impliedFormat":1},{"version":"154f23902d7a3fcdace4c20b654da7355fee4b7f807d1f77d6c9a24a8756013a","impliedFormat":1},{"version":"562f4f3c75a497d3ad7709381f850bb8c7646a9c6e94fdf8e91928e23d155411","impliedFormat":1},{"version":"4583380b676ee59b70a9696b42acfa986cd5f32430f37672e04f31f40b05df74","impliedFormat":1},{"version":"ad0a13f35a0d88803979f8ea9050ad7441e09d21a509abf2f303e18c1267af17","impliedFormat":1},{"version":"ba9781c718ab3d09cbde1216029072698d2da6135f0d2f856ba387d6caceb13e","impliedFormat":1},{"version":"d7c597c14698ba5fc8010076afa426f029b2d8edabb5073270c070cc645ba638","impliedFormat":1},{"version":"bd2afc69cf1d85cd950a99813bc7eff007d8afa496e7c2142a845cd1181d0474","impliedFormat":1},{"version":"558b462b23ea186d094dbff158d652acd58c0988c9fd53af81a8903412aa5901","impliedFormat":1},{"version":"0e984ae642a15973d652fd7b0d2712a284787d0d7a1db99aa49af0121e47f1df","impliedFormat":1},{"version":"0ad53ee208a23eef2a5cb3d85f2a9dc1019fd5e69179c4b0c02dc56c40d611c4","impliedFormat":1},{"version":"7a6898b26947bd356f33f4efef3eb23e61174d85dca19f41a8780d6bb4bfb405","impliedFormat":1},{"version":"9fe30349d26f34e85209fb06340bac34177f7eae3d6bb69dc12cd179d2c13ddf","impliedFormat":1},{"version":"d568c51d2c4360fd407445e39f4d86891dba04083402602bf5f24fd3969cacbb","impliedFormat":1},{"version":"b2483a924349ec835f4d778dd6787447a2f8bfbb651164851bff29d5b3d990a6","impliedFormat":1},{"version":"aae66889332cff4b2f7586c5c8758abc394d8d1c48f9b04b0c257e58f629d285","impliedFormat":1},{"version":"0f86c85130c64d6dbe6a9090bb3df71c4b0987bce4a08afe1ac4ece597655b9c","impliedFormat":1},{"version":"0ce28ad2671baed24517e1c1f4f2a986029137635bce788ee8fb542f002ac5b8","impliedFormat":1},{"version":"cd12e4fe77d24db98d66049360a4269299bcfb9dc3a1b47078ab1b4afac394cb","impliedFormat":1},{"version":"1589e5ac394b2b2e64264da3e1798d0e103b4f408f5bae1527d9e706f98269c7","impliedFormat":1},{"version":"ff8181aa0fde5ec2d737aecc5ebaa9e881379041f13e5ce1745620e17f78dcf9","impliedFormat":1},{"version":"0b2e54504b568c08df1e7db11c105786742866ba51e20486ab9b2286637d268f","impliedFormat":1},{"version":"bc1ffc3a2dca8ee715571739be3ec74d079e60505e1d0d2446e4978f6c75ba5c","impliedFormat":1},{"version":"770a40373470dff27b3f7022937ea2668a0854d7977c9d22073e1c62af537727","impliedFormat":1},{"version":"a0f8ce72cb02247a112ce4a2fa0f122478a8e99c90a5e6b676b41a68b1891ad2","impliedFormat":1},{"version":"6e957ea18b2bf951cf3995d115ad9bfa439e8d891aeb1afc901d793202c0b90d","impliedFormat":1},{"version":"a1c65bd78725f9172b5846c3c58ddf4bcbb43a30ab19e951f0102552fbfd3d5d","impliedFormat":1},{"version":"04718c7325e7df4bac9a6d026a0a2bd5a8b54501f274aaf93a03b5d1d0635bd1","impliedFormat":1},{"version":"405205f932d4e0ce688a380fa3150b1c7ff60e7fc89909e11a33eab7af240edb","impliedFormat":1},{"version":"566fc1a6616a522f8b45082032a33e6d37ff7df3f7d4d63c3cce9017d0345178","impliedFormat":1},{"version":"3b699b08db04559803b85aa0809748e61427b3d831f77834b8206e9f2ed20c93","impliedFormat":1},{"version":"b27242dd3af2a5548d0c7231db7da63d6373636d6c4e72d9b616adaa2acef7e1","impliedFormat":1},{"version":"e0ee7ba0571b83c53a3d6ec761cf391e7128d8f8f590f8832c28661b73c21b68","impliedFormat":1},{"version":"072bfd97fc61c894ef260723f43a416d49ebd8b703696f647c8322671c598873","impliedFormat":1},{"version":"e70875232f5d5528f1650dd6f5c94a5bed344ecf04bdbb998f7f78a3c1317d02","impliedFormat":1},{"version":"8e495129cb6cd8008de6f4ff8ce34fe1302a9e0dcff8d13714bd5593be3f7898","impliedFormat":99},{"version":"8079d851ffa1dbe193fe36643b3d67f4fdf8d360df4c900065788eff44bc15a7","impliedFormat":1},{"version":"c40b58c43a5df3bc9410d7c1359f740aa97448464407c55a26237ec5712645fc","signature":"18cee1b4db6c6caa50d98f11c8022dbd1c2534e5284554920aa5b421f16ba552"},{"version":"e516240bc1e5e9faef055432b900bc0d3c9ca7edce177fdabbc6c53d728cced8","impliedFormat":99},{"version":"5402765feacf44e052068ccb4535a346716fa1318713e3dae1af46e1e85f29a9","impliedFormat":99},{"version":"e16ec5d4796e7a765810efee80373675cedc4aa4814cf7272025a88addf5f0be","impliedFormat":99},{"version":"1f57157fcd45f9300c6efcfc53e2071fbe43396b0a7ed2701fbd1efb5599f07f","impliedFormat":99},{"version":"9f1886f3efddfac35babcada2d454acd4e23164345d11c979966c594af63468b","impliedFormat":99},{"version":"a3541c308f223863526df064933e408eba640c0208c7345769d7dc330ad90407","impliedFormat":99},{"version":"59af208befeb7b3c9ab0cb6c511e4fec54ede11922f2ffb7b497351deaf8aa2e","impliedFormat":99},{"version":"928b16f344f6cddaba565da8238f4cf2ddf12fe03eb426ab46a7560e9b3078fa","impliedFormat":99},{"version":"120bdf62bccef4ea96562a3d30dd60c9d55481662f5cf31c19725f56c0056b34","impliedFormat":99},{"version":"39e0da933908de42ba76ea1a92e4657305ae195804cfaa8760664e80baac2d6a","impliedFormat":99},{"version":"55ce6ca8df9d774d60cef58dd5d716807d5cc8410b8b065c06d3edac13f2e726","impliedFormat":99},{"version":"788a0faf3f28d43ce3793b4147b7539418a887b4a15a00ffb037214ed8f0b7f6","impliedFormat":99},{"version":"a3e66e7b8ccdab967cd4ada0f178151f1c42746eabb589a06958482fd4ed354e","impliedFormat":99},{"version":"bf45a2964a872c9966d06b971d0823daecbd707f97e927f2368ba54bb1b13a90","impliedFormat":99},{"version":"39973a12c57e06face646fb79462aabe8002e5523eec4e86e399228eb34b32c9","impliedFormat":99},{"version":"f01091e9b5028acfb38208113ae051fad8a0b4b8ec1f7137a2a5cf903c47eefc","impliedFormat":99},{"version":"b3e87824c9e7e3a3be7f76246e45c8d603ce83d116733047200b3aa95875445b","impliedFormat":99},{"version":"7e1f7f9ae14e362d41167dc861be6a8d76eca30dde3a9893c42946dc5a5fc686","impliedFormat":99},{"version":"9308ef3b9433063ac753a55c3f36d6d89fa38a8e6c51e05d9d8329c7f1174f24","impliedFormat":99},{"version":"cd3bb1aa24726a0abd67558fde5759fe968c3c6aa3ec7bad272e718851502894","impliedFormat":99},{"version":"1ae0f22c3b8420b5c2fec118f07b7ebd5ae9716339ab3477f63c603fe7a151c8","impliedFormat":99},{"version":"919ff537fff349930acc8ad8b875fd985a17582fb1beb43e2f558c541fd6ecd9","impliedFormat":99},{"version":"4e67811e45bae6c44bd6f13a160e4188d72fd643665f40c2ac3e8a27552d3fd9","impliedFormat":99},{"version":"3d1450fd1576c1073f6f4db9ebae5104e52e2c4599afb68d7d6c3d283bdbaf4f","impliedFormat":99},{"version":"c072af873c33ff11af126c56a846dfada32461b393983a72b6da7bff373e0002","impliedFormat":99},{"version":"de66e997ea5376d4aeb16d77b86f01c7b7d6d72fbb738241966459d42a4089e0","impliedFormat":99},{"version":"d77ea3b91e4bc44d710b7c9487c2c6158e8e5a3439d25fc578befeb27b03efd7","impliedFormat":99},{"version":"a3d5c695c3d1ebc9b0bd55804afaf2ac7c97328667cbeedf2c0861b933c45d3e","impliedFormat":99},{"version":"270724545d446036f42ddea422ee4d06963db1563ccc5e18b01c76f6e67968ae","impliedFormat":99},{"version":"85441c4f6883f7cfd1c5a211c26e702d33695acbabec8044e7fa6831ed501b45","impliedFormat":99},{"version":"0f268017a6b1891fdeea69c2a11d576646d7fd9cdfc8aac74d003cd7e87e9c5a","impliedFormat":99},{"version":"9ece188c336c80358742a5a0279f2f550175f5a07264349d8e0ce64db9701c0b","impliedFormat":99},{"version":"cf41b0fc7d57643d1a8d21af07b0247db2f2d7e2391c2e55929e9c00fbe6ab9a","impliedFormat":99},{"version":"11e7ddddd9eddaac56a6f23d8699ae7a94c2a55ae8c986fdabc719d3c3e875a1","impliedFormat":99},{"version":"dd129c2d348be7dbf9f15d34661defdfc11ee00628ca6f7161bead46095c6bc3","impliedFormat":99},{"version":"c38d8e7cfc64bbfc14a63346388249c1cfa2cc02166c5f37e5a57da4790ce27f","impliedFormat":99},{"version":"04fe74b54ee95b6cd9fac1094a9651fb4624963aa4b77051f9b4ce01a1de2603","signature":"77a8091fc8ef1f8b7608330b519ca909ac3e9ce1329af32c1153ef8851762ed2"},{"version":"7e3373dde2bba74076250204bd2af3aa44225717435e46396ef076b1954d2729","impliedFormat":1},{"version":"1c3dfad66ff0ba98b41c98c6f41af096fc56e959150bc3f44b2141fb278082fd","impliedFormat":1},{"version":"56208c500dcb5f42be7e18e8cb578f257a1a89b94b3280c506818fed06391805","impliedFormat":1},{"version":"0c94c2e497e1b9bcfda66aea239d5d36cd980d12a6d9d59e66f4be1fa3da5d5a","impliedFormat":1},{"version":"eb9271b3c585ea9dc7b19b906a921bf93f30f22330408ffec6df6a22057f3296","impliedFormat":1},{"version":"0205ee059bd2c4e12dcadc8e2cbd0132e27aeba84082a632681bd6c6c61db710","impliedFormat":1},{"version":"a694d38afadc2f7c20a8b1d150c68ac44d1d6c0229195c4d52947a89980126bc","impliedFormat":1},{"version":"9f1e00eab512de990ba27afa8634ca07362192063315be1f8166bc3dcc7f0e0f","impliedFormat":1},{"version":"9674788d4c5fcbd55c938e6719177ac932c304c94e0906551cc57a7942d2b53b","impliedFormat":1},{"version":"86dac6ce3fcd0a069b67a1ac9abdbce28588ea547fd2b42d73c1a2b7841cf182","impliedFormat":1},{"version":"4d34fbeadba0009ed3a1a5e77c99a1feedec65d88c4d9640910ff905e4e679f7","impliedFormat":1},{"version":"9d90361f495ed7057462bcaa9ae8d8dbad441147c27716d53b3dfeaea5bb7fc8","impliedFormat":1},{"version":"8fcc5571404796a8fe56e5c4d05049acdeac9c7a72205ac15b35cb463916d614","impliedFormat":1},{"version":"a3b3a1712610260c7ab96e270aad82bd7b28a53e5776f25a9a538831057ff44c","impliedFormat":1},{"version":"33a2af54111b3888415e1d81a7a803d37fada1ed2f419c427413742de3948ff5","impliedFormat":1},{"version":"d5a4fca3b69f2f740e447efb9565eecdbbe4e13f170b74dd4a829c5c9a5b8ebf","impliedFormat":1},{"version":"56f1e1a0c56efce87b94501a354729d0a0898508197cb50ab3e18322eb822199","impliedFormat":1},{"version":"8960e8c1730aa7efb87fcf1c02886865229fdbf3a8120dd08bb2305d2241bd7e","impliedFormat":1},{"version":"27bf82d1d38ea76a590cbe56873846103958cae2b6f4023dc59dd8282b66a38a","impliedFormat":1},{"version":"0daaab2afb95d5e1b75f87f59ee26f85a5f8d3005a799ac48b38976b9b521e69","impliedFormat":1},{"version":"2c378d9368abcd2eba8c29b294d40909845f68557bc0b38117e4f04fc56e5f9c","impliedFormat":1},{"version":"bb220eaac1677e2ad82ac4e7fd3e609a0c7b6f2d6d9c673a35068c97f9fcd5cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c60b14c297cc569c648ddaea70bc1540903b7f4da416edd46687e88a543515a1","impliedFormat":1},{"version":"94a802503ca276212549e04e4c6b11c4c14f4fa78722f90f7f0682e8847af434","impliedFormat":1},{"version":"9c0217750253e3bf9c7e3821e51cff04551c00e63258d5e190cf8bd3181d5d4a","impliedFormat":1},{"version":"5c2e7f800b757863f3ddf1a98d7521b8da892a95c1b2eafb48d652a782891677","impliedFormat":1},{"version":"21317aac25f94069dbcaa54492c014574c7e4d680b3b99423510b51c4e36035f","impliedFormat":1},{"version":"c61d8275c35a76cb12c271b5fa8707bb46b1e5778a370fd6037c244c4df6a725","impliedFormat":1},{"version":"c7793cb5cd2bef461059ca340fbcd19d7ddac7ab3dcc6cd1c90432fca260a6ae","impliedFormat":1},{"version":"fd3bf6d545e796ebd31acc33c3b20255a5bc61d963787fc8473035ea1c09d870","impliedFormat":1},{"version":"c7af51101b509721c540c86bb5fc952094404d22e8a18ced30c38a79619916fa","impliedFormat":1},{"version":"59c8f7d68f79c6e3015f8aee218282d47d3f15b85e5defc2d9d1961b6ffed7a0","impliedFormat":1},{"version":"93a2049cbc80c66aa33582ec2648e1df2df59d2b353d6b4a97c9afcbb111ccab","impliedFormat":1},{"version":"d04d359e40db3ae8a8c23d0f096ad3f9f73a9ef980f7cb252a1fdc1e7b3a2fb9","impliedFormat":1},{"version":"84aa4f0c33c729557185805aae6e0df3bd084e311da67a10972bbcf400321ff0","impliedFormat":1},{"version":"cf6cbe50e3f87b2f4fd1f39c0dc746b452d7ce41b48aadfdb724f44da5b6f6ed","impliedFormat":1},{"version":"3cf494506a50b60bf506175dead23f43716a088c031d3aa00f7220b3fbcd56c9","impliedFormat":1},{"version":"f2d47126f1544c40f2b16fc82a66f97a97beac2085053cf89b49730a0e34d231","impliedFormat":1},{"version":"724ac138ba41e752ae562072920ddee03ba69fe4de5dafb812e0a35ef7fb2c7e","impliedFormat":1},{"version":"e4eb3f8a4e2728c3f2c3cb8e6b60cadeb9a189605ee53184d02d265e2820865c","impliedFormat":1},{"version":"f16cb1b503f1a64b371d80a0018949135fbe06fb4c5f78d4f637b17921a49ee8","impliedFormat":1},{"version":"f4808c828723e236a4b35a1415f8f550ff5dec621f81deea79bf3a051a84ffd0","impliedFormat":1},{"version":"3b810aa3410a680b1850ab478d479c2f03ed4318d1e5bf7972b49c4d82bacd8d","impliedFormat":1},{"version":"0ce7166bff5669fcb826bc6b54b246b1cf559837ea9cc87c3414cc70858e6097","impliedFormat":1},{"version":"6ea095c807bc7cc36bc1774bc2a0ef7174bf1c6f7a4f6b499170b802ce214bfe","impliedFormat":1},{"version":"3549400d56ee2625bb5cc51074d3237702f1f9ffa984d61d9a2db2a116786c22","impliedFormat":1},{"version":"5327f9a620d003b202eff5db6be0b44e22079793c9a926e0a7a251b1dbbdd33f","impliedFormat":1},{"version":"b60f6734309d20efb9b0e0c7e6e68282ee451592b9c079dd1a988bb7a5eeb5e7","impliedFormat":1},{"version":"f4187a4e2973251fd9655598aa7e6e8bba879939a73188ee3290bb090cc46b15","impliedFormat":1},{"version":"44c1a26f578277f8ccef3215a4bd642a0a4fbbaf187cf9ae3053591c891fdc9c","impliedFormat":1},{"version":"a5989cd5e1e4ca9b327d2f93f43e7c981f25ee12a81c2ebde85ec7eb30f34213","impliedFormat":1},{"version":"f65b8fa1532dfe0ef2c261d63e72c46fe5f089b28edcd35b3526328d42b412b8","impliedFormat":1},{"version":"1060083aacfc46e7b7b766557bff5dafb99de3128e7bab772240877e5bfe849d","impliedFormat":1},{"version":"d61a3fa4243c8795139e7352694102315f7a6d815ad0aeb29074cfea1eb67e93","impliedFormat":1},{"version":"1f66b80bad5fa29d9597276821375ddf482c84cfb12e8adb718dc893ffce79e0","impliedFormat":1},{"version":"1ed8606c7b3612e15ff2b6541e5a926985cbb4d028813e969c1976b7f4133d73","impliedFormat":1},{"version":"c086ab778e9ba4b8dbb2829f42ef78e2b28204fc1a483e42f54e45d7a96e5737","impliedFormat":1},{"version":"dd0b9b00a39436c1d9f7358be8b1f32571b327c05b5ed0e88cc91f9d6b6bc3c9","impliedFormat":1},{"version":"a951a7b2224a4e48963762f155f5ad44ca1145f23655dde623ae312d8faeb2f2","impliedFormat":1},{"version":"cd960c347c006ace9a821d0a3cffb1d3fbc2518a4630fb3d77fe95f7fd0758b8","impliedFormat":1},{"version":"fe1f3b21a6cc1a6bc37276453bd2ac85910a8bdc16842dc49b711588e89b1b77","impliedFormat":1},{"version":"1a6a21ff41d509ab631dbe1ea14397c518b8551f040e78819f9718ef80f13975","impliedFormat":1},{"version":"0a55c554e9e858e243f714ce25caebb089e5cc7468d5fd022c1e8fa3d8e8173d","impliedFormat":1},{"version":"3a5e0fe9dcd4b1a9af657c487519a3c39b92a67b1b21073ff20e37f7d7852e32","impliedFormat":1},{"version":"977aeb024f773799d20985c6817a4c0db8fed3f601982a52d4093e0c60aba85f","impliedFormat":1},{"version":"d59cf5116848e162c7d3d954694f215b276ad10047c2854ed2ee6d14a481411f","impliedFormat":1},{"version":"50098be78e7cbfc324dfc04983571c80539e55e11a0428f83a090c13c41824a2","impliedFormat":1},{"version":"08e767d9d3a7e704a9ea5f057b0f020fd5880bc63fbb4aa6ffee73be36690014","impliedFormat":1},{"version":"dd6051c7b02af0d521857069c49897adb8595d1f0e94487d53ebc157294ef864","impliedFormat":1},{"version":"79c6a11f75a62151848da39f6098549af0dd13b22206244961048326f451b2a8","impliedFormat":1},{"version":"dcca73931cbcaddec4d6c01d39e9ed65d2bf95a06e1e17e8d69ea580df318847","signature":"9c61db3519329b720cd3f73efc6c31616faf8f8ed6a6ce21ddc49164889129c7"},{"version":"a189d741df65c764bd851c4c42c7d6ebfb8ad1a93fe13f90403d6fc0efd7564c","signature":"36b328f629e1ddb764e4620846380d6758f02514308a74eb128378fe6207da55"},{"version":"dfcf16e716338e9fe8cf790ac7756f61c85b83b699861df970661e97bf482692","impliedFormat":99},{"version":"bb703864a1bc9ca5ac3589ffd83785f6dc86f7f6c485c97d7ffd53438777cb9e","impliedFormat":1},{"version":"afd1edacaa854443388a01c10bb5e54727d42bf548eb7504660e063adbf78a84","signature":"45ccdc2d955ebe212fdfb23d17c76984d86c91ee90f269447ed2d2f24540c020"},{"version":"e7441be68f390975c6155c805cea8f54cc1b7f3656b6b9440ecbbbd7753499e6","impliedFormat":99},{"version":"3dd468a9cc452e3857900a9ac10856d2eda56d59d804323a1a948ea496158a64","signature":"c4678287db674a348a9d703a599dab7f1dd4768be8b2a7ce8ac02026abf87f7a"},{"version":"91b4ce96f6ad631a0a6920eb0ab928159ff01a439ae0e266ecdc9ea83126a195","impliedFormat":1},{"version":"88efe27bebddb62da9655a9f093e0c27719647e96747f16650489dc9671075d6","impliedFormat":1},{"version":"e348f128032c4807ad9359a1fff29fcbc5f551c81be807bfa86db5a45649b7ba","impliedFormat":1},{"version":"8ee6b07974528da39b7835556e12dd3198c0a13e4a9de321217cd2044f3de22e","impliedFormat":1},{"version":"5e1d8a07714f909beaaaf4d0ffe507345a99f2db967493dd8ebbfbb4f18e83ca","impliedFormat":1},{"version":"5f12132800d430adbe59b49c2c0354d85a71ada7d756e34250a655baa8ad4ae5","impliedFormat":1},{"version":"1996d1cd7d585a8359a35878f67abdd73cc35b1f675c9c6b147b202fdd8dfc3f","impliedFormat":1},{"version":"5a50dbfc042633fdb558e53b30b0a005e0b78e142a1fe1147a8d6618ca69ec99","impliedFormat":1},{"version":"a8b0f3d8b205c32395727230bff7849c947150fdd6288855cbe75bc662c4e236","impliedFormat":1},{"version":"6fb55bb881f4a7167649e6925df076f64a1db2f50632df4674e4621a9445c954","impliedFormat":1},{"version":"4374cefdde5c6e9bad52b0436e887b8325b8f407c12035194ad02c28f1553a3a","impliedFormat":1},{"version":"9b70cad270593f676aecfe4d1611dc766464f0b8138527b0ebbf1ff773578d69","impliedFormat":1},{"version":"b4f85bfb7e831703ac81737361842f1ae4d924b42c5d1af2bff93cca521de4d1","impliedFormat":1},{"version":"5fea76008a2d537ca09d569ffae4e08b991b4a5ff90e9f4783bc983584454ede","impliedFormat":1},{"version":"21575cdeaca6a2c2a0beb8c2ecbc981d9deb95f879f82dc7d6e325fe8737b5ba","impliedFormat":1},{"version":"40ec58f0fadd0b3981b3d383e1c12fa0680115ae9f018387fc2cfc0bbcf23204","impliedFormat":1},{"version":"849b9e7283b7309a4556c9b90bb8e2dfc27751f157798065bbc513dcddb09a8c","impliedFormat":1},{"version":"10e109212c7be8a9f66e988e5d6c2a8900c9d14bf6beadf5fa70d32ada3425cf","impliedFormat":1},{"version":"2b821aeb31e690092f8eae671dd961a9d0fd598ff4883ce0a600c90e9e8fa716","impliedFormat":1},{"version":"26602933b613e4df3868a6c82e14fffa2393a08531cb333ed27b151923462981","impliedFormat":1},{"version":"f57a588d8f6b3ce5c8b494f2dc759a8885eaee18e80a4952df47de45403fedbe","impliedFormat":1},{"version":"34735727b3fe7a0ed0651a0f88d06449163d1989a2b2de7f047473adc7c1c383","impliedFormat":1},{"version":"a5b13abc88ab3186e713c445e59e2f6eee20c6167943517bc2f56985d89b8c55","impliedFormat":1},{"version":"3844b45a774bafe226260cf0772376dce72121ebb801d03902c70a7f11da832b","impliedFormat":1},{"version":"7ae65fe95b18205e241e6695cb2c61c0828d660aca7d08f68781b439a800e6b8","impliedFormat":1},{"version":"e025419f23ccceafd7f5ab3141a86a6bb9fc3b33c44fe62b288d7b19baffc95b","impliedFormat":1},{"version":"369b7270eeeb37982203b2cb18c7302947b89bf5818c1d3d2e95a0418f02b74e","impliedFormat":1},{"version":"94f95d223e2783b0aef4d15d7f6990a6a550fe17d099c501395f690337f7105e","impliedFormat":1},{"version":"039bd8d1e0d151570b66e75ee152877fb0e2f42eca43718632ac195e6884be34","impliedFormat":1},{"version":"89fb1e22c3c98cbb86dc3e5949012bdae217f2b5d768a2cc74e1c4b413c25ad2","impliedFormat":1},{"version":"0ffd8bf120b14b8621d5e44374ee2ef43eb61eb799532f9f69679c839a72bcea","signature":"335e6e2b14f23ae70e5608a6b757c9c5f8ab9f1264a3c45d8194e9b05ef948bd"},{"version":"ce2ed38348f98d43d204dc925560fc17f874c4a6f0fecd48165f832a9964bb07","signature":"994534597e772bc135a36815cd936a8a63f27a29879b249eac14caf6e341364d"},{"version":"146b1e4efbe82a5818759b7c814c46b2ee0304cfb640bc84d3a51f987a2964a0","signature":"79df09b0ca5f4171bed6c7a0003aff6d9a5d2ca31c55d13dea4e7551c9e8d045"},{"version":"b843496b17a2bbd79c83809c73fd9c59fab53d3e361e04e52e2d489524eea764","impliedFormat":1},{"version":"a61194a2845f307263916752060412f080fb81259f7551fef4fbcbaad7b1e6d2","signature":"beea2d803c513304f23cdcd064aa4ec04e9b170d1633f6de0b9e5efb57d84285"},{"version":"9bf936220a96f6b4b6421d8a6c873a4000fcd4bbe3087009eb66e9b14ba67402","signature":"c864e85d82bcda21c3823324b9f852cb1ba3bf754af15388a10376ff8e0373f5"},{"version":"89b53c7301d85f91f25fa79fe6b2f27c3d8a18d2008a6e4978e65c0de0afadab","signature":"bc566a7efbfa5e0f5ae124a0d2c2f66291391387483da8da6278e9c4e642615e"},{"version":"6647dabde65059a98e8ff76f79eb686e34197557c2e64ee71b4ac5ac10ae5a67","signature":"118b46eb19d27e24b754ecda23cdae72b28a02b38734c3a1ca88d43ef535631c"},{"version":"4d9bffaca7e0f0880868bab5fd351f9e4d57fcc6567654c4c330516fea7932aa","impliedFormat":99},{"version":"867b845defb7e20f8928fdb8c5e2e7c473f701bb54e8f6624cdc3ebfec2e1c50","impliedFormat":99},{"version":"fcebf6064ee19f019cd677748310bbea900dc57fd8646427cf3418af70902d86","impliedFormat":99},{"version":"a93a11986f470d2c99c689ee101a04003d3b08d66e884782c147865017c15484","impliedFormat":99},{"version":"73b48bdb2946a0fa88829e88d32a69daee9b7c22db26524f89e9abe31f9b7cca","impliedFormat":99},{"version":"c59591435db37f16f2b6ff851d5abed0dea4acacd893da80ae270c7353845328","signature":"6e792f758932bcb89403f0efca4da19a9a8b02bf358f6f1846bdb49d0f1dbbd6"},{"version":"5b6350bc2042ac593a5866b5a6b5d1e5c13c87c3a5b00a35957354bac071df4d","signature":"ee8f7490d800ed0d3034d1323f59c9b3f84bc6eff75eab4659b22e0c24ed91d1"},{"version":"f7990d2b35828a207c0e0599ce4034ed4f38043f5c5f0d1fcbf8c81165e171a5","signature":"af84054c9bbd37500c026a1453c398ad1b002598c1e3adea687daa440a08933e"},{"version":"bfaf89cd935c7d0a4307b2a38e422e96369ebf264c4604fac9d7b1bb3064ddd3","signature":"c60274b5dcedff867dd1807e99c8f7ccaccb60da522c7906cf316baef83dc008"},{"version":"049af00eaaa8e81f03190edfb1efdce7143a83c70b10254b82dbc18efb55e64f","signature":"32f7c168ee545e9b432d2a861f4fb0bc645e21e88c774cedf54e72d1e3ccc049"},{"version":"3ba6aaaea131f31f3760a6f08be19f49a5249651aaaca602816266ea1a92ce39","signature":"c8492e39783ead38203aa0fac387e51a30b75f59effd500c06aadbf0d1d5a9b8"},{"version":"3b1af9d0a088cc300eec0d026a133bd09e98a22499251c7c2a7774bc7e7d2dee","signature":"f77dac591bbb93fd5024c15a73ccb10025f76c5b33a001760c579e13341ae834"},{"version":"22adff6a682588e50ae2fc66805aa5a34b3a9c0cc6c906558df4c517b04b514c","signature":"523cbf15f5b12fdc02dbcf3f59602623f8b49c4cc351678ce8b0106575cdddbf"},{"version":"db057b2f5fbed438f9ba8d622f846102b68856507be1fdc7aa9c012bcc94a0a5","signature":"7b19c29db78da0b295d52145f5a8c8926bdbe05316cddd45bfa891b869f8089e"},{"version":"1cfede71071e11bbc648d0313653f724d071922e661ae4ffc07261892b2df433","signature":"69c1bca7d225c0d1c0e98c3bb671e2caa0ad5bbb569d61dee619d523f6b33806"},{"version":"862634e7bf895b8f4704a19a20feeee34d1e482a015aa544007699511095dda4","signature":"f1af6c273588e3cab7ac3adb929621e150468d24e7d5a9fb38478fd15ea86150"},{"version":"274e2d57a93ac9a4adcd221af61148d5a60a35875fec8f15e44ec7e98a71ebab","signature":"56e8d9b65fa494ad967a207e0c661c7b7db20a2938d13b7f03094d2a0d912a3c"},"c3085aa7c267e4a12c37d1330a7a4a29c38f8626db50456302ec5a79c215f656",{"version":"60408f4159f05be198a1beb9aa2aa250df5551c50a7f68e15f0211430a5f656f","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"85e529e13fdeb532931202713e4eea179f01fab950fa8f73092332d4242f33ae","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"3c1d9ca0ceaaa29de976db76c30328fdcda50798d92f6b036508d0c608f96550","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"897b55c91ef49548e1edd80c5865f1b22a15e05c00ec1705489c78b8eec25c80","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"e8a763a4ebce303ca18717d2166d67950b0362ff3319def0c28ecb794b9f04d3","affectsGlobalScope":true,"impliedFormat":1},{"version":"ee31fab138939ef1903831933d524de9944511759778eedaaed56d6eb7f8697d","impliedFormat":1},{"version":"e45cc72cc9e7ad726ec83141fa4cd221d432062de34586ff107a0442ae28bf19","impliedFormat":1},{"version":"d9455aaf258770f187384ebe910495634a7fb904ee7a1c11755427a1e611eea8","impliedFormat":1},{"version":"309f3a357cc08760a602bd9b1177d4474426e6e2897a7295c898920198d968fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"ee31fab138939ef1903831933d524de9944511759778eedaaed56d6eb7f8697d","impliedFormat":1},{"version":"e45cc72cc9e7ad726ec83141fa4cd221d432062de34586ff107a0442ae28bf19","impliedFormat":1},{"version":"e24ee8b47c634d66662923650caa3d1510803debcd210085ca883f85cbecce4e","impliedFormat":1},{"version":"6d7ec38e96b4ad4d977e7376d9a92253927c1342ed6c102bd4dc4950deed1dd1","impliedFormat":1},{"version":"34810cb47e6bee7cd4bad2f174793f5926ba5889c5d180e29b02c1871a820476","affectsGlobalScope":true,"impliedFormat":1},{"version":"7115f1157a00937d712e042a011eb85e9d80b13eff78bac5f210ee852f96879d","impliedFormat":1},{"version":"0ac74c7586880e26b6a599c710b59284a284e084a2bbc82cd40fb3fbfdea71ae","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce12357dadbb8efc4e4ec4dab709c8071bf992722fc9adfea2fe0bd5b50923f","impliedFormat":1},{"version":"56c685ea062afe11fd775c31dc33acc449f780b17ba392ac154799323ebc9647","impliedFormat":1},{"version":"a21a5564fa4fc44ea813ce3055030b0060df12acca6a183d77b2090429be618a","impliedFormat":1},{"version":"b05b9ef20d18697e468c3ae9cecfff3f47e8976f9522d067047e3f236db06a41","affectsGlobalScope":true,"impliedFormat":1},{"version":"eec5e9a5629f6740aac21e49783a373a3767770ad559cd41285ebbb0db39a4a2","affectsGlobalScope":true,"impliedFormat":1},{"version":"1745f0b1ab53f414b4f8ebb2c6a902fda28d40f454edac8e92b4d7c974a2051c","affectsGlobalScope":true,"impliedFormat":1},{"version":"f7f5d83fe8eff2f1910e8b0437527041e5cc45aa15cda443f27dbadc3d5805e7","impliedFormat":1},{"version":"1a7a729938558fe198d979d3f53dece9c9112124b7b081a7fa0adcc98bf15fd8","impliedFormat":1},{"version":"c61c37176b7a6c043df76f437e402ea9abc9f19e9652a0d37629dfc8b7e83497","impliedFormat":1},{"version":"067f76ab5254b1bdfc94154730b7a30c12e3aad8b9d04ec62c0d6b7a1f40ea0e","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f95bf00d9d01de72cddbeabe5bdcb019248c209df4976a814756504afdb9291","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be812b06e518320ba82e2aff3ac2ca37370a9df917db708f081b9043fa3315","impliedFormat":1},{"version":"6d7ec38e96b4ad4d977e7376d9a92253927c1342ed6c102bd4dc4950deed1dd1","impliedFormat":1},{"version":"fc9e630f9302d0414ccd6c8ed2706659cff5ae454a56560c6122fa4a3fac5bbd","affectsGlobalScope":true,"impliedFormat":1},{"version":"7115f1157a00937d712e042a011eb85e9d80b13eff78bac5f210ee852f96879d","impliedFormat":1},{"version":"0ac74c7586880e26b6a599c710b59284a284e084a2bbc82cd40fb3fbfdea71ae","affectsGlobalScope":true,"impliedFormat":1},{"version":"2ce12357dadbb8efc4e4ec4dab709c8071bf992722fc9adfea2fe0bd5b50923f","impliedFormat":1},{"version":"56c685ea062afe11fd775c31dc33acc449f780b17ba392ac154799323ebc9647","impliedFormat":1},{"version":"085b6073465a6358e693823dcc03128f359e28780e8a497bf5fcf1b577b5c960","impliedFormat":1},{"version":"b05b9ef20d18697e468c3ae9cecfff3f47e8976f9522d067047e3f236db06a41","affectsGlobalScope":true,"impliedFormat":1},{"version":"b12b645134e106bea2c135a8a64c933329e195d3b8ca2fc6eeeec73dd8836924","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbe8d85bf780a22fb2838e9807c53b3ea2610f46ae925a771eba421c44c5a4c6","affectsGlobalScope":true,"impliedFormat":1},{"version":"f7f5d83fe8eff2f1910e8b0437527041e5cc45aa15cda443f27dbadc3d5805e7","impliedFormat":1},{"version":"f5e8617ad68d001f3e26035ee699dad75df20ada6adc88524cb631d9f9b871fa","impliedFormat":1},{"version":"c61c37176b7a6c043df76f437e402ea9abc9f19e9652a0d37629dfc8b7e83497","impliedFormat":1},{"version":"067f76ab5254b1bdfc94154730b7a30c12e3aad8b9d04ec62c0d6b7a1f40ea0e","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f95bf00d9d01de72cddbeabe5bdcb019248c209df4976a814756504afdb9291","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be812b06e518320ba82e2aff3ac2ca37370a9df917db708f081b9043fa3315","impliedFormat":1},{"version":"f60e3e3060207ac982da13363181fd7ee4beecc19a7c569f0d6bb034331066c2","impliedFormat":1},{"version":"17230b34bb564a3a2e36f9d3985372ccab4ad1722df2c43f7c5c2b553f68e5db","impliedFormat":1},{"version":"6e5c9272f6b3783be7bdddaf207cccdb8e033be3d14c5beacc03ae9d27d50929","impliedFormat":1},{"version":"9b4f7ff9681448c72abe38ea8eefd7ffe0c3aefe495137f02012a08801373f71","impliedFormat":1},{"version":"0dfe35191a04e8f9dc7caeb9f52f2ee07402736563d12cbccd15fb5f31ac877f","impliedFormat":1},{"version":"798367363a3274220cbed839b883fe2f52ba7197b25e8cb2ac59c1e1fd8af6b7","impliedFormat":1},{"version":"fe62b82c98a4d5bca3f8de616b606d20211b18c14e881bb6856807d9ab58131b","impliedFormat":1},{"version":"e0c868a08451c879984ccf4d4e3c1240b3be15af8988d230214977a3a3dad4ce","impliedFormat":1},{"version":"6fc1a4f64372593767a9b7b774e9b3b92bf04e8785c3f9ea98973aa9f4bbe490","impliedFormat":1},{"version":"ff09b6fbdcf74d8af4e131b8866925c5e18d225540b9b19ce9485ca93e574d84","impliedFormat":1},{"version":"d5895252efa27a50f134a9b580aa61f7def5ab73d0a8071f9b5bf9a317c01c2d","impliedFormat":1},{"version":"2c378d9368abcd2eba8c29b294d40909845f68557bc0b38117e4f04fc56e5f9c","impliedFormat":1},{"version":"0c94c2e497e1b9bcfda66aea239d5d36cd980d12a6d9d59e66f4be1fa3da5d5a","impliedFormat":1},{"version":"bb220eaac1677e2ad82ac4e7fd3e609a0c7b6f2d6d9c673a35068c97f9fcd5cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"56208c500dcb5f42be7e18e8cb578f257a1a89b94b3280c506818fed06391805","impliedFormat":1},{"version":"1f366bde16e0513fa7b64f87f86689c4d36efd85afce7eb24753e9c99b91c319","impliedFormat":1},{"version":"87d9d29dbc745f182683f63187bf3d53fd8673e5fca38ad5eaab69798ed29fbc","impliedFormat":1},{"version":"7fa8d75d229eeaee235a801758d9c694e94405013fe77d5d1dd8e3201fc414f1","impliedFormat":1}],"root":[182,487,489,514,[602,607],667,668,1353,1354,[1361,1363],1365,[1370,1379],[1383,1395],[1402,1412],[1460,1464],1470,[1474,1478],[1481,1483],1485,[1491,1497],[1504,1518],[1540,1559],[1565,1581],[1615,1629],1888,1925,1996,1997,2000,2002,[2033,2035],[2037,2040],[2046,2062]],"options":{"allowJs":true,"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true,"target":4},"referencedMap":[[2061,1],[2059,2],[2060,3],[2062,4],[2058,5],[182,6],[487,7],[489,8],[1511,9],[1512,10],[1353,11],[1354,12],[1362,13],[1363,14],[1516,15],[1514,16],[1518,17],[1616,18],[1485,19],[605,20],[1505,21],[1617,22],[1622,23],[1623,24],[606,20],[1365,25],[668,26],[1624,22],[1625,27],[1576,28],[1618,29],[1580,30],[1581,31],[1565,32],[1542,33],[1550,34],[1370,35],[1541,36],[1549,37],[1547,38],[1548,39],[1577,40],[1552,41],[1559,42],[1553,41],[1557,43],[1558,44],[1570,45],[1571,46],[1626,47],[1572,48],[1567,49],[1569,50],[1568,51],[1504,52],[1496,53],[1497,54],[1493,55],[1579,56],[1494,57],[1495,58],[1615,59],[1619,60],[1483,61],[1627,62],[1628,63],[1510,64],[1545,65],[1574,66],[1513,67],[1517,64],[1629,62],[1491,68],[1888,69],[1506,53],[1925,70],[1996,71],[1620,62],[1997,65],[2000,72],[1543,73],[1578,74],[1546,75],[2002,76],[1566,73],[1555,77],[2033,78],[2034,67],[2035,79],[2037,80],[1507,81],[1508,68],[2038,62],[2039,73],[2040,81],[2046,82],[1575,67],[2047,67],[1515,53],[2048,62],[1540,83],[1551,67],[1544,73],[1509,84],[2049,73],[2051,85],[1621,43],[1556,67],[1481,86],[1492,57],[2052,67],[2053,53],[2054,67],[1554,53],[1460,73],[2055,87],[2057,88],[2056,68],[1482,67],[1573,66],[1371,45],[1372,55],[604,55],[1389,41],[1390,55],[602,89],[1462,90],[1463,90],[1391,91],[1392,45],[1395,92],[1404,93],[1405,93],[1406,93],[2050,45],[1407,94],[1408,45],[1409,95],[1410,96],[1411,97],[1412,45],[1461,98],[667,99],[1464,55],[1470,100],[1474,101],[1475,102],[1361,103],[1375,104],[1376,104],[1377,105],[1374,106],[1476,55],[1385,41],[1383,107],[1477,108],[603,12],[1379,109],[1403,110],[1387,111],[1478,112],[1394,113],[1384,114],[1386,115],[1378,55],[1402,116],[1393,55],[607,55],[1373,55],[1388,117],[514,118],[1024,55],[1466,119],[1467,120],[1465,55],[1469,121],[1468,55],[244,55],[1413,45],[1417,122],[1422,123],[1426,124],[1423,124],[1424,125],[1425,126],[1416,125],[1431,127],[1414,45],[1421,128],[1432,45],[1418,124],[1433,127],[1419,124],[1435,129],[1436,130],[1434,124],[1430,131],[1437,132],[1439,133],[1440,134],[1441,45],[1442,135],[1428,136],[1420,124],[1415,45],[1443,125],[1444,137],[1429,125],[1445,125],[1446,135],[1447,124],[1448,125],[1449,45],[1450,125],[1451,137],[1452,138],[1454,139],[1453,124],[1455,140],[1456,130],[1438,124],[1427,55],[517,55],[515,55],[516,141],[533,55],[518,142],[534,143],[2087,144],[2103,145],[1946,55],[1929,146],[1947,147],[1928,55],[618,148],[1582,148],[2110,149],[2109,150],[185,55],[198,151],[346,45],[199,152],[197,45],[347,153],[195,154],[196,155],[183,55],[186,156],[344,45],[319,45],[608,55],[1359,157],[1360,158],[1358,159],[1357,55],[1480,55],[1352,160],[1351,161],[1350,162],[1349,55],[1041,163],[1346,164],[1040,165],[1037,166],[1039,167],[1038,55],[1023,168],[1022,169],[988,55],[987,170],[986,55],[1484,171],[488,172],[1355,55],[2071,173],[2085,55],[2081,174],[2073,175],[2084,176],[2072,177],[2070,178],[2074,179],[2068,180],[2075,55],[2086,181],[2076,182],[2080,183],[2082,184],[2069,185],[2083,186],[2077,187],[2078,188],[2079,189],[2067,190],[2101,55],[2097,191],[2089,192],[2100,193],[2088,194],[2066,195],[2090,196],[2064,197],[2091,55],[2102,198],[2092,199],[2096,200],[2098,201],[2065,202],[2099,203],[2093,204],[2094,205],[2095,206],[1459,207],[1458,208],[1381,55],[1999,209],[184,55],[1717,210],[1696,211],[1793,55],[1697,212],[1633,210],[1634,55],[1635,55],[1636,55],[1637,55],[1638,55],[1639,55],[1640,55],[1641,55],[1642,55],[1643,55],[1644,55],[1645,210],[1646,210],[1647,55],[1648,55],[1649,55],[1650,55],[1651,55],[1652,55],[1653,55],[1654,55],[1655,55],[1657,55],[1656,55],[1658,55],[1659,55],[1660,210],[1661,55],[1662,55],[1663,210],[1664,55],[1665,55],[1666,210],[1667,55],[1668,210],[1669,210],[1670,210],[1671,55],[1672,210],[1673,210],[1674,210],[1675,210],[1676,210],[1678,210],[1679,55],[1680,55],[1677,210],[1681,210],[1682,55],[1683,55],[1684,55],[1685,55],[1686,55],[1687,55],[1688,55],[1689,55],[1690,55],[1691,55],[1692,55],[1693,210],[1694,55],[1695,55],[1698,213],[1699,210],[1700,210],[1701,214],[1702,215],[1703,210],[1704,210],[1705,210],[1706,210],[1709,210],[1707,55],[1708,55],[1631,55],[1710,55],[1711,55],[1712,55],[1713,55],[1714,55],[1715,55],[1716,55],[1718,216],[1719,55],[1720,55],[1721,55],[1723,55],[1722,55],[1724,55],[1725,55],[1726,55],[1727,210],[1728,55],[1729,55],[1730,55],[1731,55],[1732,210],[1733,210],[1735,210],[1734,210],[1736,55],[1737,55],[1738,55],[1739,55],[1886,217],[1740,210],[1741,210],[1742,55],[1743,55],[1744,55],[1745,55],[1746,55],[1747,55],[1748,55],[1749,55],[1750,55],[1751,55],[1752,55],[1753,55],[1754,210],[1755,55],[1756,55],[1757,55],[1758,55],[1759,55],[1760,55],[1761,55],[1762,55],[1763,55],[1764,55],[1765,210],[1766,55],[1767,55],[1768,55],[1769,55],[1770,55],[1771,55],[1772,55],[1773,55],[1774,55],[1775,210],[1776,55],[1777,55],[1778,55],[1779,55],[1780,55],[1781,55],[1782,55],[1783,55],[1784,210],[1785,55],[1786,55],[1787,55],[1788,55],[1789,55],[1790,55],[1791,210],[1792,55],[1794,218],[1630,210],[1795,55],[1796,210],[1797,55],[1798,55],[1799,55],[1800,55],[1801,55],[1802,55],[1803,55],[1804,55],[1805,55],[1806,210],[1807,55],[1808,55],[1809,55],[1810,55],[1811,55],[1812,55],[1813,55],[1818,219],[1816,220],[1817,221],[1815,222],[1814,210],[1819,55],[1820,55],[1821,210],[1822,55],[1823,55],[1824,55],[1825,55],[1826,55],[1827,55],[1828,55],[1829,55],[1830,55],[1831,210],[1832,210],[1833,55],[1834,55],[1835,55],[1836,210],[1837,55],[1838,210],[1839,55],[1840,216],[1841,55],[1842,55],[1843,55],[1844,55],[1845,55],[1846,55],[1847,55],[1848,55],[1849,55],[1850,210],[1851,210],[1852,55],[1853,55],[1854,55],[1855,55],[1856,55],[1857,55],[1858,55],[1859,55],[1860,55],[1861,55],[1862,55],[1863,55],[1864,210],[1865,210],[1866,55],[1867,55],[1868,210],[1869,55],[1870,55],[1871,55],[1872,55],[1873,55],[1874,55],[1875,55],[1876,55],[1877,55],[1878,55],[1879,55],[1880,55],[1881,210],[1632,223],[1882,55],[1883,55],[1884,55],[1885,55],[181,224],[81,225],[82,226],[1331,227],[1335,228],[1280,229],[1095,55],[1045,230],[1329,231],[1330,232],[1043,55],[1332,233],[1117,234],[1060,235],[1083,236],[1092,237],[1063,237],[1064,238],[1065,238],[1091,239],[1066,240],[1067,238],[1073,241],[1068,242],[1069,238],[1070,238],[1093,243],[1062,244],[1071,237],[1072,242],[1074,245],[1075,245],[1076,242],[1077,238],[1078,237],[1079,238],[1080,246],[1081,246],[1082,238],[1104,247],[1112,248],[1090,249],[1120,250],[1084,251],[1086,252],[1087,249],[1098,253],[1106,254],[1111,255],[1108,256],[1113,257],[1101,258],[1102,259],[1109,260],[1110,261],[1116,262],[1107,263],[1085,233],[1118,264],[1061,233],[1105,265],[1103,266],[1089,267],[1088,249],[1119,268],[1094,269],[1114,55],[1115,270],[1334,271],[1044,233],[1155,55],[1172,272],[1121,273],[1146,274],[1153,275],[1122,275],[1123,275],[1124,276],[1152,277],[1125,278],[1140,275],[1126,279],[1127,279],[1128,276],[1129,275],[1130,276],[1131,275],[1154,280],[1132,275],[1133,275],[1134,281],[1135,275],[1136,275],[1137,281],[1138,276],[1139,275],[1141,282],[1142,281],[1143,275],[1144,276],[1145,275],[1167,283],[1163,284],[1151,285],[1175,286],[1147,287],[1148,285],[1164,288],[1156,289],[1165,290],[1162,291],[1160,292],[1166,293],[1159,294],[1171,295],[1161,296],[1173,297],[1168,298],[1157,299],[1150,300],[1149,285],[1174,301],[1158,269],[1169,55],[1170,302],[1047,303],[1237,304],[1176,305],[1211,306],[1220,307],[1177,308],[1178,308],[1179,309],[1180,308],[1219,310],[1181,311],[1182,312],[1183,313],[1184,308],[1221,314],[1222,315],[1185,308],[1187,316],[1188,307],[1190,317],[1191,318],[1192,318],[1193,309],[1194,308],[1195,308],[1196,314],[1197,309],[1198,309],[1199,318],[1200,308],[1201,307],[1202,308],[1203,309],[1204,319],[1189,320],[1205,308],[1206,309],[1207,308],[1208,308],[1209,308],[1210,308],[1339,321],[1232,322],[1218,323],[1242,324],[1212,325],[1214,326],[1215,323],[1336,327],[1225,328],[1231,329],[1227,330],[1233,331],[1337,332],[1338,259],[1228,333],[1230,334],[1236,335],[1226,336],[1213,233],[1238,337],[1186,233],[1224,338],[1229,339],[1217,340],[1216,323],[1239,341],[1240,55],[1241,342],[1223,269],[1234,55],[1235,343],[1341,344],[1342,345],[1340,346],[1056,347],[1049,348],[1099,233],[1096,349],[1100,350],[1097,351],[1291,352],[1268,353],[1274,354],[1243,354],[1244,354],[1245,355],[1273,356],[1246,357],[1261,354],[1247,358],[1248,358],[1249,355],[1250,354],[1251,359],[1252,354],[1275,360],[1253,354],[1254,354],[1255,361],[1256,354],[1257,354],[1258,361],[1259,355],[1260,354],[1262,362],[1263,361],[1264,354],[1265,355],[1266,354],[1267,354],[1288,363],[1279,364],[1294,365],[1269,366],[1270,367],[1283,368],[1276,369],[1287,370],[1278,371],[1286,372],[1285,373],[1290,374],[1277,375],[1292,376],[1289,377],[1284,378],[1272,379],[1271,367],[1293,380],[1282,381],[1281,382],[1052,383],[1054,384],[1053,383],[1055,383],[1058,385],[1057,386],[1059,387],[1050,388],[1327,389],[1295,390],[1320,391],[1324,392],[1323,393],[1296,394],[1325,395],[1316,396],[1317,392],[1318,397],[1319,398],[1304,399],[1312,400],[1322,401],[1328,402],[1297,403],[1298,401],[1301,404],[1307,405],[1311,406],[1309,407],[1313,408],[1302,409],[1305,410],[1310,411],[1326,412],[1308,413],[1306,414],[1303,415],[1321,416],[1299,417],[1315,418],[1300,269],[1314,419],[1048,269],[1046,420],[1051,421],[1333,55],[1923,422],[1924,423],[1889,55],[1897,424],[1891,425],[1898,55],[1920,426],[1895,427],[1919,428],[1916,429],[1899,430],[1900,55],[1893,55],[1890,55],[1921,431],[1917,432],[1901,55],[1918,433],[1902,434],[1904,435],[1905,436],[1894,437],[1906,438],[1907,437],[1909,438],[1910,439],[1911,440],[1913,441],[1908,442],[1914,443],[1915,444],[1892,445],[1912,446],[1896,447],[1903,55],[1922,448],[625,55],[626,449],[623,55],[624,55],[1364,55],[1488,450],[1489,451],[646,452],[643,55],[645,453],[644,454],[642,455],[641,456],[659,457],[658,458],[664,459],[662,458],[663,460],[654,461],[653,462],[2036,45],[1021,463],[990,464],[1000,464],[991,464],[1001,464],[992,464],[993,464],[1008,464],[1007,464],[1009,464],[1010,464],[1002,464],[994,464],[1003,464],[995,464],[1004,464],[996,464],[998,464],[1006,465],[999,464],[1005,465],[1011,465],[997,464],[1012,464],[1017,464],[1018,464],[1013,464],[989,55],[1019,55],[1015,464],[1014,464],[1016,464],[1020,464],[826,55],[948,466],[827,467],[828,468],[967,469],[968,470],[969,471],[970,472],[971,473],[972,474],[960,475],[955,476],[956,477],[957,478],[959,473],[958,479],[954,475],[961,476],[963,480],[962,481],[953,473],[952,482],[966,475],[949,476],[950,483],[951,484],[965,473],[964,485],[829,476],[824,486],[945,487],[825,488],[947,489],[946,490],[852,491],[849,492],[909,493],[887,494],[866,495],[794,496],[985,497],[931,498],[974,499],[973,467],[751,500],[760,501],[764,502],[873,503],[784,504],[755,505],[766,506],[863,504],[843,504],[878,507],[942,504],[737,508],[781,508],[750,509],[738,508],[811,504],[789,510],[790,511],[759,512],[768,513],[769,508],[770,514],[772,515],[802,516],[835,504],[937,504],[739,504],[818,517],[752,518],[761,508],[763,519],[803,508],[804,520],[805,521],[806,521],[796,522],[799,523],[756,524],[773,504],[939,504],[740,504],[774,504],[775,525],[776,504],[736,504],[815,526],[778,527],[882,528],[880,504],[881,529],[883,530],[779,504],[936,504],[941,504],[810,531],[762,500],[780,504],[812,532],[813,533],[777,504],[793,504],[981,534],[943,535],[735,55],[844,504],[814,504],[864,504],[782,536],[783,537],[807,504],[872,538],[865,504],[870,539],[871,540],[757,541],[910,504],[819,542],[754,504],[786,543],[749,544],[820,521],[753,518],[765,508],[808,545],[741,508],[785,504],[792,504],[801,546],[788,547],[797,504],[787,548],[742,521],[800,504],[940,504],[938,504],[758,541],[816,549],[817,504],[771,504],[798,504],[911,550],[809,504],[767,504],[791,551],[847,552],[869,553],[854,55],[836,554],[833,555],[923,556],[888,557],[857,558],[912,559],[851,560],[926,561],[856,562],[874,563],[889,564],[914,565],[929,566],[886,567],[853,568],[861,569],[850,570],[885,571],[984,572],[924,573],[913,574],[845,575],[922,576],[975,577],[976,577],[980,578],[979,579],[830,580],[978,577],[977,577],[876,581],[879,582],[921,583],[920,584],[744,55],[877,585],[860,586],[918,587],[743,55],[848,588],[884,589],[925,590],[747,55],[859,591],[916,592],[867,593],[855,594],[917,595],[875,596],[915,597],[842,598],[868,599],[919,600],[745,55],[858,601],[822,602],[944,603],[823,604],[927,605],[934,606],[935,607],[933,608],[901,609],[831,610],[902,611],[932,612],[838,613],[840,614],[890,615],[894,616],[841,617],[839,617],[893,618],[834,619],[895,620],[896,621],[897,622],[905,623],[903,624],[898,625],[899,626],[900,627],[906,628],[904,629],[837,630],[892,631],[907,632],[908,633],[891,634],[846,635],[832,486],[795,636],[982,637],[983,55],[928,638],[930,490],[821,55],[862,55],[746,55],[748,639],[2042,640],[2043,640],[2041,55],[1366,45],[1610,641],[1584,642],[1585,643],[1586,643],[1587,643],[1588,643],[1589,643],[1590,643],[1591,643],[1592,643],[1593,643],[1594,643],[1608,644],[1595,643],[1596,643],[1597,643],[1598,643],[1599,643],[1600,643],[1601,643],[1602,643],[1604,643],[1605,643],[1603,643],[1606,643],[1607,643],[1609,643],[1583,645],[1487,646],[1486,55],[1490,647],[1025,55],[1028,648],[1030,649],[1032,650],[1031,55],[1036,651],[1033,648],[1034,652],[1035,652],[1027,652],[1026,653],[1029,55],[1479,45],[193,654],[434,655],[439,5],[441,656],[220,657],[248,658],[417,659],[243,660],[231,55],[212,55],[218,55],[407,661],[272,662],[219,55],[386,663],[253,664],[254,665],[343,666],[404,667],[359,668],[411,669],[412,670],[410,671],[409,55],[408,672],[250,673],[221,674],[293,55],[294,675],[216,55],[232,676],[222,677],[277,676],[274,676],[205,676],[246,678],[245,55],[416,679],[426,55],[211,55],[320,680],[321,681],[314,45],[462,55],[323,55],[324,682],[315,683],[336,45],[467,684],[466,685],[461,55],[403,686],[402,55],[460,687],[316,45],[355,688],[353,689],[463,55],[465,690],[464,55],[354,691],[455,692],[458,693],[284,694],[283,695],[282,696],[470,45],[281,697],[266,55],[473,55],[1472,698],[1471,55],[476,55],[475,45],[477,699],[201,55],[413,700],[414,701],[415,702],[234,55],[210,703],[200,55],[203,704],[335,705],[334,706],[325,55],[326,55],[333,55],[328,55],[331,707],[327,55],[329,708],[332,709],[330,708],[217,55],[208,55],[209,676],[256,55],[341,682],[361,682],[433,710],[442,711],[446,712],[420,713],[419,55],[269,55],[478,714],[429,715],[317,716],[318,717],[309,718],[299,55],[340,719],[300,720],[342,721],[338,722],[337,55],[339,55],[352,723],[421,724],[422,725],[301,726],[306,727],[297,728],[399,729],[428,730],[276,731],[376,732],[206,733],[427,734],[202,660],[257,55],[258,735],[388,736],[255,55],[387,737],[194,55],[381,738],[233,55],[295,739],[377,55],[207,55],[259,55],[385,740],[215,55],[264,741],[305,742],[418,743],[304,55],[384,55],[390,744],[391,745],[213,55],[393,746],[395,747],[394,748],[236,55],[383,733],[397,749],[382,750],[389,751],[224,55],[227,55],[225,55],[229,55],[226,55],[228,55],[230,752],[223,55],[369,753],[368,55],[374,754],[370,755],[373,756],[372,756],[375,754],[371,755],[263,757],[362,758],[425,759],[480,55],[450,760],[452,761],[303,55],[451,762],[423,724],[479,763],[322,724],[214,55],[302,764],[260,765],[261,766],[262,767],[292,768],[398,768],[278,768],[363,769],[279,769],[252,770],[251,55],[367,771],[366,772],[365,773],[364,774],[424,775],[313,776],[349,777],[312,778],[345,779],[348,780],[406,781],[405,782],[401,783],[358,784],[360,785],[357,786],[396,787],[351,55],[438,55],[350,788],[400,55],[265,789],[298,700],[296,790],[267,791],[270,792],[474,55],[268,793],[271,793],[436,55],[435,55],[437,55],[472,55],[273,794],[311,45],[192,55],[356,795],[249,55],[238,796],[307,55],[444,45],[454,797],[291,45],[448,682],[290,798],[431,799],[289,797],[204,55],[456,800],[287,45],[288,45],[280,55],[237,55],[286,801],[285,802],[235,803],[308,804],[275,804],[392,55],[379,805],[378,55],[440,55],[310,45],[432,806],[187,45],[190,807],[191,808],[188,45],[189,55],[247,809],[242,810],[241,55],[240,811],[239,55],[430,812],[443,813],[445,814],[447,815],[1473,816],[449,817],[453,818],[486,819],[457,819],[485,820],[459,821],[468,822],[469,823],[471,824],[481,825],[484,703],[483,55],[482,826],[621,827],[634,828],[619,55],[620,829],[635,830],[630,831],[631,832],[629,833],[633,834],[627,835],[622,836],[632,837],[628,828],[2108,838],[2105,826],[2107,839],[2106,55],[2104,55],[506,840],[504,841],[505,842],[493,843],[494,841],[501,844],[492,845],[497,846],[507,55],[498,847],[503,848],[509,849],[508,850],[491,851],[499,852],[500,853],[495,854],[502,840],[496,855],[1042,856],[640,857],[637,858],[638,55],[639,55],[636,859],[1457,860],[1887,861],[2003,55],[2018,862],[2019,862],[2032,863],[2020,864],[2021,864],[2022,865],[2016,866],[2014,867],[2005,55],[2009,868],[2013,869],[2011,870],[2017,871],[2006,872],[2007,873],[2008,874],[2010,875],[2012,876],[2015,877],[2023,864],[2024,864],[2025,864],[2026,862],[2027,864],[2028,864],[2004,864],[2029,55],[2031,878],[2030,864],[1503,879],[1499,45],[1500,45],[1498,55],[1501,880],[1502,879],[1614,881],[1613,882],[2045,883],[2044,884],[1524,55],[1538,885],[1519,45],[1521,886],[1523,887],[1522,888],[1520,55],[1525,55],[1526,55],[1527,55],[1528,55],[1529,55],[1530,55],[1531,55],[1532,55],[1533,55],[1534,889],[1536,890],[1537,890],[1535,55],[1539,891],[1969,892],[1971,893],[1961,894],[1966,895],[1967,896],[1973,897],[1968,898],[1965,899],[1964,900],[1963,901],[1974,902],[1931,895],[1932,895],[1972,895],[1977,903],[1987,904],[1981,904],[1989,904],[1993,904],[1979,905],[1980,904],[1982,904],[1985,904],[1988,904],[1984,906],[1986,904],[1990,45],[1983,895],[1978,907],[1940,45],[1944,45],[1934,895],[1937,45],[1942,895],[1943,908],[1936,909],[1939,45],[1941,45],[1938,910],[1927,45],[1926,45],[1995,911],[1992,912],[1958,913],[1957,895],[1955,45],[1956,895],[1959,914],[1960,915],[1953,45],[1949,916],[1952,895],[1951,895],[1950,895],[1945,895],[1954,916],[1991,895],[1970,917],[1976,918],[1975,919],[1994,55],[1962,55],[1935,55],[1933,920],[661,921],[660,922],[648,923],[647,924],[666,925],[665,926],[657,927],[656,458],[655,928],[1612,929],[1611,930],[380,931],[1380,45],[490,55],[652,932],[650,933],[651,934],[649,55],[1382,55],[512,935],[511,55],[510,55],[513,936],[615,937],[614,55],[79,55],[80,55],[13,55],[14,55],[16,55],[15,55],[2,55],[17,55],[18,55],[19,55],[20,55],[21,55],[22,55],[23,55],[24,55],[3,55],[25,55],[26,55],[4,55],[27,55],[31,55],[28,55],[29,55],[30,55],[32,55],[33,55],[34,55],[5,55],[35,55],[36,55],[37,55],[38,55],[6,55],[42,55],[39,55],[40,55],[41,55],[43,55],[7,55],[44,55],[49,55],[50,55],[45,55],[46,55],[47,55],[48,55],[8,55],[54,55],[51,55],[52,55],[53,55],[55,55],[9,55],[56,55],[57,55],[58,55],[60,55],[59,55],[61,55],[62,55],[10,55],[63,55],[64,55],[65,55],[11,55],[66,55],[67,55],[68,55],[69,55],[70,55],[1,55],[71,55],[72,55],[12,55],[76,55],[74,55],[78,55],[73,55],[77,55],[75,55],[2063,938],[617,939],[613,55],[616,940],[2001,209],[610,941],[609,148],[612,942],[611,943],[1930,944],[1948,945],[1561,946],[1562,55],[1560,55],[1563,947],[1564,948],[532,949],[524,950],[531,951],[526,55],[527,55],[525,952],[528,953],[519,55],[520,55],[521,949],[523,954],[529,55],[530,955],[522,956],[728,957],[731,958],[729,958],[725,957],[732,959],[733,960],[730,958],[726,961],[727,962],[721,963],[673,964],[675,965],[719,55],[674,966],[720,967],[724,968],[722,55],[676,964],[677,55],[718,969],[672,970],[669,55],[723,971],[670,972],[671,55],[734,973],[678,974],[679,974],[680,974],[681,974],[682,974],[683,974],[684,974],[685,974],[686,974],[687,974],[688,974],[690,974],[689,974],[691,974],[692,974],[693,974],[717,975],[694,974],[695,974],[696,974],[697,974],[698,974],[699,974],[700,974],[701,974],[702,974],[704,974],[703,974],[705,974],[706,974],[707,974],[708,974],[709,974],[710,974],[711,974],[712,974],[713,974],[714,974],[715,974],[716,974],[599,976],[594,977],[597,978],[595,978],[591,977],[598,979],[596,978],[592,980],[593,981],[587,982],[539,983],[541,984],[585,55],[540,985],[586,986],[590,987],[588,55],[542,983],[543,55],[584,988],[538,989],[535,55],[589,990],[536,991],[537,55],[544,992],[545,992],[546,992],[547,992],[548,992],[549,992],[550,992],[551,992],[552,992],[553,992],[554,992],[556,992],[555,992],[557,992],[558,992],[559,992],[583,993],[560,992],[561,992],[562,992],[563,992],[564,992],[565,992],[566,992],[567,992],[568,992],[570,992],[569,992],[571,992],[572,992],[573,992],[574,992],[575,992],[576,992],[577,992],[578,992],[579,992],[580,992],[581,992],[582,992],[1369,994],[1401,995],[1399,996],[1397,996],[1400,996],[1396,996],[1398,996],[1368,996],[1367,55],[1998,128],[2111,55],[2112,55],[2113,55],[2114,997],[2115,55],[2116,146],[2117,147],[2118,55],[2119,55],[127,998],[128,998],[129,999],[88,1000],[130,1001],[131,1002],[132,1003],[83,55],[86,1004],[84,55],[85,55],[133,1005],[134,1006],[135,1007],[136,1008],[137,1009],[138,1010],[139,1010],[141,55],[140,1011],[142,1012],[143,1013],[144,1014],[126,1015],[87,55],[145,1016],[146,1017],[147,1018],[180,1019],[148,1020],[149,1021],[150,1022],[151,1023],[152,1024],[153,1025],[154,1026],[155,1027],[156,804],[157,1028],[158,1028],[159,1029],[160,55],[161,55],[162,1030],[164,1031],[163,1032],[165,1033],[166,1034],[167,1035],[168,1036],[169,1037],[170,1038],[171,1039],[172,1040],[173,1041],[174,1042],[175,1043],[176,1044],[177,1045],[178,1046],[179,1047],[2120,55],[2121,55],[1356,55],[104,1048],[114,1049],[103,1048],[124,1050],[95,1051],[94,1052],[123,826],[117,1053],[122,1054],[97,1055],[111,1056],[96,1057],[120,1058],[92,1059],[91,826],[121,1060],[93,1061],[98,1062],[99,55],[102,1062],[89,55],[125,938],[115,1063],[106,1064],[107,1065],[109,1066],[105,1067],[108,1068],[118,826],[100,1069],[101,1070],[110,1071],[90,856],[113,1063],[112,1062],[116,55],[119,1072],[1347,1073],[1348,1074],[600,1075],[1345,1076],[1344,1077],[601,1075],[1343,1078]],"affectedFilesPendingEmit":[2061,2059,2060,2062,182,489,1511,1512,1353,1354,1362,1363,1516,1514,1518,1616,1485,605,1505,1617,1622,1623,606,1365,668,1624,1625,1576,1618,1580,1581,1565,1542,1550,1370,1541,1549,1547,1548,1577,1552,1559,1553,1557,1558,1570,1571,1626,1572,1567,1569,1568,1504,1496,1497,1493,1579,1494,1495,1615,1619,1483,1627,1628,1510,1545,1574,1513,1517,1629,1491,1888,1506,1925,1996,1620,1997,2000,1543,1578,1546,2002,1566,1555,2033,2034,2035,2037,1507,1508,2038,2039,2040,2046,1575,2047,1515,2048,1540,1551,1544,1509,2049,2051,1621,1556,1481,1492,2052,2053,2054,1554,1460,2055,2057,2056,1482,1573,1371,1372,604,1389,1390,602,1462,1463,1391,1392,1395,1404,1405,1406,2050,1407,1408,1409,1410,1411,1412,1461,667,1464,1470,1474,1475,1361,1375,1376,1377,1374,1476,1385,1383,1477,603,1379,1403,1387,1478,1394,1384,1386,1378,1402,1393,607,1373,1388,514],"version":"5.8.3"}
\ No newline at end of file |
