diff --git a/public_html/js/action-script.js b/public_html/js/action-script.js index fde0710..ca4df82 100644 --- a/public_html/js/action-script.js +++ b/public_html/js/action-script.js @@ -11,6 +11,7 @@ * http://seekdasky.ovh/ * **************************/ + { /* [0] Initialisation =========================================================*/ @@ -21,9 +22,6 @@ imageLoader: $('#image-loader') }; - /* (2) dat.GUI initialization */ - var Controller = new dat.GUI(); - /* (3) Canvas initialisation */ var _CAN = DOM.canvas; _CAN.width = _CAN.height = 1000; @@ -39,211 +37,230 @@ var trackerTask; var trackerTask; + var Controller, + init, + zones, + track, + tracker, + initialized = false; + } -{ /* [1] Initialisation du process - =========================================================*/ +var ControllerRememberer = new PermanentStorage(); +ControllerRememberer.fetch(function(loaded_data){ + log('Preset loaded.', '[PermanentStorage]') - var init = function(){ - /* (1) Image par défaut */ - this.src = 'front/male/1.jpg'; + { /* [1] Initialisation du process + =========================================================*/ + /* (1) dat.GUI initialization */ + Controller = new dat.GUI({ load: JSON.parse(loaded_data), preset: 'default' }); - /* (2) Attachement de dat.GUI */ - Controller.addFolder('Source Picture'); - Controller.add(this, 'src', this._images).listen(); + init = function(){ + /* (1) Image par défaut */ + this.src = 'front/male/1.jpg'; - last = this.src; - }; + /* (2) Attachement de dat.GUI */ + Controller.addFolder('Source Picture'); + Controller.remember(this); + Controller.add(this, 'src', this._images).listen(); - /* (2) Gestion de tracking.js */ - var zones; + last = this.src; - /* (3) Gestion du track de l'image */ - var track = { - track: function(){ - zones = []; - trackerTask = tracking.track(_CAN, tracker); - } - }; + initialized = true; + }; - var tracker = new tracking.ObjectTracker(['face', 'eye', 'mouth']); + /* (2) Gestion de tracking.js */ + zones; - tracker.setStepSize(1.9); + /* (3) Gestion du track de l'image */ + track = { + track: function(){ + zones = []; + trackerTask = tracking.track(_CAN, tracker); + } + }; - Controller.addFolder('Tracking.js'); - Controller.add(track, 'track'); + tracker = new tracking.ObjectTracker(['face', 'eye', 'mouth']); - tracker.on('track', function(event){ + tracker.setStepSize(1.9); - event.data.forEach(function(rect){ + Controller.addFolder('Tracking.js'); + Controller.add(track, 'track'); + + tracker.on('track', function(event){ + + event.data.forEach(function(rect){ + + zones.push({ + x: rect.x / _CAN.width, + y: rect.y / _CAN.height, + w: rect.width / _CAN.width, + h: rect.height / _CAN.height + }); - zones.push({ - x: rect.x / _CAN.width, - y: rect.y / _CAN.height, - w: rect.width / _CAN.width, - h: rect.height / _CAN.height }); + // On enregistre dans `zones` les zones trackées + log('Recognition done', '[Tracking.js]'); + + // On met à jour le rendu (affichage des zones) + process.bind(DOM.imageLoader)(); + }); - // On enregistre dans `zones` les zones trackées - log('Recognition done', '[Tracking.js]'); - - // On met à jour le rendu (affichage des zones) - process.bind(DOM.imageLoader)(); - - }); - -} + } -/* [2] Routine principale -=========================================================*/ -process = function(){ - // Si erreur de `bind()`, on quitte - if( !(this instanceof HTMLImageElement) ) - return; - - console.time('PROCESS'); - - /* [0.0] Gestion du changement d'image + /* [2] Routine principale =========================================================*/ - if( this.src != last ){ - zones = []; - exec = false; - last = this.src; - } + process = function(){ + // Si erreur de `bind()`, on quitte + if( !initialized || !(this instanceof HTMLImageElement) ) + return; + console.time('PROCESS'); - /* [0.1] Gestion de la première exécution (par image) - =========================================================*/ - if( !exec ){ - - /* (1) On enregistre les dimensions par défaut - ---------------------------------------------------------*/ - this.defaultWidth = this.width; - this.defaultHeight = this.height; - log('Image copied', '[Canvas]'); - - // On change la valeur de `exec` pour qu'il n'entre plus dans ce `if` - exec = true; - } - - - /* [1] On initialise/efface le `` - =========================================================*/ - _CON.clearRect(0, 0, _CAN.width, _CAN.height); - - - - { /* [2] Copie sur le `` - =========================================================*/ - /* (1) Resolution */ - filterManager.get('resolution').apply(); - } - - - { /* [3] Filtrage pre-processing - =========================================================*/ - /* (1) Contraste */ - filterManager.get('contrast').apply(); - - /* (2) Sobel */ - filterManager.get('sobel').apply(); - - /* (3) Gaussian Filter */ - filterManager.get('gaussian').apply(); - - /* (4) Canny Filter */ - filterManager.get('canny').apply(); - } - - - { /* [4] Tracking.js - =========================================================*/ - - /* (1) On reporte chaque zone trackée sur le `` */ - for( var i in zones ){ - var x = zones[i].x * _CAN.width; - var y = zones[i].y * _CAN.height; - var w = zones[i].w * _CAN.width; - var h = zones[i].h * _CAN.height; - _CON.beginPath(); - _CON.moveTo( x, y ); - _CON.lineTo( x, y+h ); - _CON.lineTo( x+w, y+h ); - _CON.lineTo( x+w, y ); - _CON.lineTo( x, y ); - _CON.lineWidth = 5; - _CON.strokeStyle = '#f00'; - _CON.stroke(); + /* [0.0] Gestion du changement d'image + =========================================================*/ + if( this.src != last ){ + zones = []; + exec = false; + last = this.src; } - } + + /* [0.1] Gestion de la première exécution (par image) + =========================================================*/ + if( !exec ){ + + /* (1) On enregistre les dimensions par défaut + ---------------------------------------------------------*/ + this.defaultWidth = this.width; + this.defaultHeight = this.height; + log('Image copied', '[Canvas]'); + + // On change la valeur de `exec` pour qu'il n'entre plus dans ce `if` + exec = true; + } - { /* [5] Filtrage post-processing + /* [1] On initialise/efface le `` + =========================================================*/ + _CON.clearRect(0, 0, _CAN.width, _CAN.height); + + + + { /* [2] Copie sur le `` + =========================================================*/ + /* (1) Resolution */ + filterManager.get('resolution').apply(); + } + + + { /* [3] Filtrage pre-processing + =========================================================*/ + /* (1) Contraste */ + filterManager.get('contrast').apply(); + + /* (2) Sobel */ + filterManager.get('sobel').apply(); + + /* (3) Gaussian Filter */ + filterManager.get('gaussian').apply(); + + /* (4) Canny Filter */ + filterManager.get('canny').apply(); + } + + + { /* [4] Tracking.js + =========================================================*/ + + /* (1) On reporte chaque zone trackée sur le `` */ + for( var i in zones ){ + var x = zones[i].x * _CAN.width; + var y = zones[i].y * _CAN.height; + var w = zones[i].w * _CAN.width; + var h = zones[i].h * _CAN.height; + _CON.beginPath(); + _CON.moveTo( x, y ); + _CON.lineTo( x, y+h ); + _CON.lineTo( x+w, y+h ); + _CON.lineTo( x+w, y ); + _CON.lineTo( x, y ); + _CON.lineWidth = 5; + _CON.strokeStyle = '#f00'; + _CON.stroke(); + } + + } + + + { /* [5] Filtrage post-processing + =========================================================*/ + + } + + console.timeEnd('PROCESS'); + }; + + + + { /* [3] Gestion des `ReactiveFilter` =========================================================*/ + /* (1) Création du Manager */ + filterManager = new ReactiveFilterManager(DOM.imageLoader, _CAN, process); + + /* (2) Ajout des filtres */ + filterManager.add('resolution', reactiveResolution); + filterManager.add('contrast', reactiveContrast); + filterManager.add('sobel', reactiveSobel); + filterManager.add('gaussian', reactiveGaussianBlur); + filterManager.add('canny', reactiveCanny); + + /* (3) Gestion des backups */ + Controller.remember(filterManager.get('resolution')); + Controller.remember(filterManager.get('contrast')); + Controller.remember(filterManager.get('sobel')); + Controller.remember(filterManager.get('canny')); + Controller.remember(filterManager.get('gaussian')); + + /* (4) On attache tout à dat.GUI */ + Controller.addFolder('Image Resolution'); + Controller.add(filterManager.get('resolution'), 'width', 0, 2).step(0.1);//listen(); + Controller.add(filterManager.get('resolution'), 'height', 0, 2).step(0.1);//listen(); + Controller.addFolder('Basic Image Processing'); + Controller.add(filterManager.get('contrast'), 'contrast', 0, 100);//listen(); + Controller.addFolder('Gaussian Blur'); + Controller.add(filterManager.get('gaussian'), 'sigma', 0, 10).step(0.5);//listen(); + Controller.add(filterManager.get('gaussian'), 'radius', 1, 11).step(1);//listen(); + Controller.addFolder('Convolution Filters'); + Controller.add(filterManager.get('sobel'), 'sobelActive');//listen(); + Controller.add(filterManager.get('canny'), 'canny_radius');//listen(); + + + /* (5) Gestion du @PermanentStorage */ + Controller.__save_row.children[2].addEventListener('click', function(){ + /* (1) Update properties */ + Controller.save(); + + /* (2) Get stored data */ + try{ + var stored = JSON.stringify( Controller.getSaveObject() ); + ControllerRememberer.store(stored, function(){ log('dat.GUI preset stored.', '[PermanentStorage]'); return true; }); + + }catch(e){ log('Corrupted data.', '[PermanentStorage]'); } + + }, false); } - console.timeEnd('PROCESS'); -}; + /* [x] Chargement image + =========================================================*/ + iL = new ImageLoader( DOM.imageLoader, init, process ); - -{ /* [3] Gestion des `ReactiveFilter` - =========================================================*/ - /* (1) Création du Manager */ - filterManager = new ReactiveFilterManager(DOM.imageLoader, _CAN, process); - - /* (2) Ajout des filtres */ - filterManager.add('resolution', reactiveResolution); - filterManager.add('contrast', reactiveContrast); - filterManager.add('sobel', reactiveSobel); - filterManager.add('gaussian', reactiveGaussianBlur); - filterManager.add('canny', reactiveCanny); - - /* (3) On attache tout à dat.GUI */ - Controller.addFolder('Image Resolution'); - Controller.add(filterManager.get('resolution'), 'width', 0, 2).step(0.1).listen(); - Controller.add(filterManager.get('resolution'), 'height', 0, 2).step(0.1).listen(); - Controller.addFolder('Basic Image Processing'); - Controller.add(filterManager.get('contrast'), 'contrast', 0, 100).listen(); - Controller.addFolder('Gaussian Blur'); - Controller.add(filterManager.get('gaussian'), 'sigma', 0, 10).step(0.5).listen(); - Controller.add(filterManager.get('gaussian'), 'radius', 1, 11).step(1).listen(); - Controller.addFolder('Convolution Filters'); - Controller.add(filterManager.get('sobel'), 'sobelActive').listen(); - Controller.add(filterManager.get('canny'), 'canny_radius').listen(); - - /* (4) Gestion des backups */ - Controller.remember(filterManager.get('resolution')); - Controller.remember(filterManager.get('contrast')); - Controller.remember(filterManager.get('sobel')); - Controller.remember(filterManager.get('canny')); - Controller.remember(filterManager.get('gaussian')); - - /* (5) Gestion du @PermanentStorage */ - Controller.__save_row.children[2].addEventListener('click', function(e){ - /* (1) Update properties */ - Controller.save(); - - /* (2) Get stored data */ - try{ - var stored = JSON.stringify( Controller.load.remembered ); - - - - }catch(e){ log('Error parsing/storing data.', '[PermanentStorage]'); } - - }, false); - -} - - -/* [x] Chargement image -=========================================================*/ -iL = new ImageLoader( DOM.imageLoader, init, process ); + return true; +}); diff --git a/public_html/js/lib/min/permanent-storage.js b/public_html/js/lib/min/permanent-storage.js index 06ea5ae..be647d7 100644 --- a/public_html/js/lib/min/permanent-storage.js +++ b/public_html/js/lib/min/permanent-storage.js @@ -1,3 +1,3 @@ var PermanentStorage=function(){}; -PermanentStorage.prototype={store:function(a,c){var d,b;a=a||null;a="string"===typeof a?a:null;if(!(a&&c instanceof Function))return!1;d=new FormData;d.append("data",a);b=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHttpRequest");b.addEventListener("readystatechange",function(a){b.readyState-4||!~[0,200].indexOf(b.status)||c.bind(b.responseText)},!1);b.open("POST","./permanent-storage/",!0);b.send(d)},fetch:function(){var a;if(!(callback instanceof Function))return!1;a= -window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHttpRequest");a.addEventListener("readystatechange",function(c){a.readyState-4||!~[0,200].indexOf(a.status)||callback.bind(a.responseText)},!1);a.open("POST","./permanent-storage/",!0);a.send(null)}}; +PermanentStorage.prototype={store:function(a,b){var c,d;a=a||null;a="string"===typeof a?a:null;if(!(a&&b instanceof Function))return!1;c=new FormData;c.append("command","store");c.append("data",a);d=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHttpRequest");d.addEventListener("readystatechange",function(a){d.readyState-4||!~[0,200].indexOf(d.status)||"success"==d.responseText&&b()||console.warn("[PermanentStorage] storeError")},!1);d.open("POST","./permanent-storage/", +!0);d.send(c);return!0},fetch:function(a){var b,c;if(!(a instanceof Function))return!1;c=new FormData;c.append("command","fetch");b=window.XMLHttpRequest?new XMLHttpRequest:new ActiveXObject("Microsoft.XMLHttpRequest");b.addEventListener("readystatechange",function(c){b.readyState-4||!~[0,200].indexOf(b.status)||"error"!=b.responseText&&a(b.responseText)||console.warn("[PermanentStorage] fetchError")},!1);b.open("POST","./permanent-storage/",!0);b.send(c)}}; diff --git a/public_html/js/lib/permanent-storage.js b/public_html/js/lib/permanent-storage.js index e5de405..733cdfa 100644 --- a/public_html/js/lib/permanent-storage.js +++ b/public_html/js/lib/permanent-storage.js @@ -44,20 +44,22 @@ PermanentStorage.prototype = { { /* (3) Format data and wrap it into FormData */ fd = new FormData(); - fd.append('data', raw_data); + fd.append('command', 'store'); + fd.append('data', raw_data); } { /* (4) Sends data to server */ xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHttpRequest'); xhr.addEventListener('readystatechange', function(e){ - !(xhr.readyState-4) && !!~[0,200].indexOf(xhr.status) && callback.bind(xhr.responseText); + !(xhr.readyState-4) && !!~[0,200].indexOf(xhr.status) && ( xhr.responseText == 'success' && callback() || console.warn('[PermanentStorage] storeError') ); }, false); xhr.open( 'POST', './permanent-storage/', true ); xhr.send( fd ); } + return true; }, /* FETCHES DATA FROM REMOTE STORAGE @@ -65,27 +67,31 @@ PermanentStorage.prototype = { * @callback Callback function that'll take the @fetched_data as result * * @return raw_data Fetched data - * | error NULL is returned if an error occured * */ - fetch: function(){ + fetch: function(callback){ /* (0) Initialization */ - var xhr; + var xhr, fd; { /* (1) Checks @callback argument */ if( !(callback instanceof Function) ) return false; } + { /* (2) Set FormData */ + fd = new FormData(); + fd.append('command', 'fetch'); + } + { /* (2) Sends data to server */ xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHttpRequest'); xhr.addEventListener('readystatechange', function(e){ - !(xhr.readyState-4) && !!~[0,200].indexOf(xhr.status) && callback.bind(xhr.responseText); + !(xhr.readyState-4) && !!~[0,200].indexOf(xhr.status) && ( xhr.responseText != 'error' && callback(xhr.responseText) || console.warn('[PermanentStorage] fetchError') ); }, false); xhr.open( 'POST', './permanent-storage/', true ); - xhr.send( null ); + xhr.send( fd ); } } diff --git a/public_html/js/lib/reactive-filter.js b/public_html/js/lib/reactive-filter.js index 26b4a14..f0a1e31 100644 --- a/public_html/js/lib/reactive-filter.js +++ b/public_html/js/lib/reactive-filter.js @@ -42,8 +42,6 @@ var ReactiveFilter = function(attr){ this.apply = function(){}; }; - - /* CONSTRUCTEUR -> Gestionnaire des ReactiveFilter * * @pImageTarget Image cible diff --git a/public_html/js/min/action-script.js b/public_html/js/min/action-script.js index b8539fe..95258b9 100644 --- a/public_html/js/min/action-script.js +++ b/public_html/js/min/action-script.js @@ -1,8 +1,8 @@ -var DOM={body:$("body"),canvas:$("canvas"),imageLoader:$("#image-loader")},Controller=new dat.GUI,_CAN=DOM.canvas;_CAN.width=_CAN.height=1E3; -var _CON=_CAN.getContext("2d"),iL,filterManager,process=function(){},exec=!1,last,trackerTask,init=function(){this.src="front/male/1.jpg";Controller.addFolder("Source Picture");Controller.add(this,"src",this._images).listen();last=this.src},zones,track={track:function(){zones=[];trackerTask=tracking.track(_CAN,tracker)}},tracker=new tracking.ObjectTracker(["face","eye","mouth"]);tracker.setStepSize(1.9);Controller.addFolder("Tracking.js");Controller.add(track,"track"); -tracker.on("track",function(b){b.data.forEach(function(a){zones.push({x:a.x/_CAN.width,y:a.y/_CAN.height,w:a.width/_CAN.width,h:a.height/_CAN.height})});log("Recognition done","[Tracking.js]");process.bind(DOM.imageLoader)()}); -process=function(){if(this instanceof HTMLImageElement){console.time("PROCESS");this.src!=last&&(zones=[],exec=!1,last=this.src);exec||(this.defaultWidth=this.width,this.defaultHeight=this.height,log("Image copied","[Canvas]"),exec=!0);_CON.clearRect(0,0,_CAN.width,_CAN.height);filterManager.get("resolution").apply();filterManager.get("contrast").apply();filterManager.get("sobel").apply();filterManager.get("gaussian").apply();filterManager.get("canny").apply();for(var b in zones){var a=zones[b].x* -_CAN.width,c=zones[b].y*_CAN.height,d=zones[b].w*_CAN.width,e=zones[b].h*_CAN.height;_CON.beginPath();_CON.moveTo(a,c);_CON.lineTo(a,c+e);_CON.lineTo(a+d,c+e);_CON.lineTo(a+d,c);_CON.lineTo(a,c);_CON.lineWidth=5;_CON.strokeStyle="#f00";_CON.stroke()}console.timeEnd("PROCESS")}};filterManager=new ReactiveFilterManager(DOM.imageLoader,_CAN,process);filterManager.add("resolution",reactiveResolution);filterManager.add("contrast",reactiveContrast);filterManager.add("sobel",reactiveSobel); -filterManager.add("gaussian",reactiveGaussianBlur);filterManager.add("canny",reactiveCanny);Controller.addFolder("Image Resolution");Controller.add(filterManager.get("resolution"),"width",0,2).step(.1).listen();Controller.add(filterManager.get("resolution"),"height",0,2).step(.1).listen();Controller.addFolder("Basic Image Processing");Controller.add(filterManager.get("contrast"),"contrast",0,100).listen();Controller.addFolder("Gaussian Blur"); -Controller.add(filterManager.get("gaussian"),"sigma",0,10).step(.5).listen();Controller.add(filterManager.get("gaussian"),"radius",1,11).step(1).listen();Controller.addFolder("Convolution Filters");Controller.add(filterManager.get("sobel"),"sobelActive").listen();Controller.add(filterManager.get("canny"),"canny_radius").listen();Controller.remember(filterManager.get("resolution"));Controller.remember(filterManager.get("contrast"));Controller.remember(filterManager.get("sobel"));Controller.remember(filterManager.get("canny")); -Controller.remember(filterManager.get("gaussian"));Controller.__save_row.children[2].addEventListener("click",function(b){Controller.save();try{JSON.stringify(Controller.load.remembered)}catch(a){log("Error parsing/storing data.","[PermanentStorage]")}},!1);iL=new ImageLoader(DOM.imageLoader,init,process); +var DOM={body:$("body"),canvas:$("canvas"),imageLoader:$("#image-loader")},_CAN=DOM.canvas;_CAN.width=_CAN.height=1E3;var _CON=_CAN.getContext("2d"),iL,filterManager,process=function(){},exec=!1,last,trackerTask,Controller,init,zones,track,tracker,initialized=!1,ControllerRememberer=new PermanentStorage; +ControllerRememberer.fetch(function(f){log("Preset loaded.","[PermanentStorage]");Controller=new dat.GUI({load:JSON.parse(f),preset:"default"});init=function(){this.src="front/male/1.jpg";Controller.addFolder("Source Picture");Controller.remember(this);Controller.add(this,"src",this._images).listen();last=this.src;initialized=!0};zones;track={track:function(){zones=[];trackerTask=tracking.track(_CAN,tracker)}};tracker=new tracking.ObjectTracker(["face","eye","mouth"]);tracker.setStepSize(1.9);Controller.addFolder("Tracking.js"); +Controller.add(track,"track");tracker.on("track",function(b){b.data.forEach(function(a){zones.push({x:a.x/_CAN.width,y:a.y/_CAN.height,w:a.width/_CAN.width,h:a.height/_CAN.height})});log("Recognition done","[Tracking.js]");process.bind(DOM.imageLoader)()});process=function(){if(initialized&&this instanceof HTMLImageElement){console.time("PROCESS");this.src!=last&&(zones=[],exec=!1,last=this.src);exec||(this.defaultWidth=this.width,this.defaultHeight=this.height,log("Image copied","[Canvas]"),exec= +!0);_CON.clearRect(0,0,_CAN.width,_CAN.height);filterManager.get("resolution").apply();filterManager.get("contrast").apply();filterManager.get("sobel").apply();filterManager.get("gaussian").apply();filterManager.get("canny").apply();for(var b in zones){var a=zones[b].x*_CAN.width,c=zones[b].y*_CAN.height,d=zones[b].w*_CAN.width,e=zones[b].h*_CAN.height;_CON.beginPath();_CON.moveTo(a,c);_CON.lineTo(a,c+e);_CON.lineTo(a+d,c+e);_CON.lineTo(a+d,c);_CON.lineTo(a,c);_CON.lineWidth=5;_CON.strokeStyle="#f00"; +_CON.stroke()}console.timeEnd("PROCESS")}};filterManager=new ReactiveFilterManager(DOM.imageLoader,_CAN,process);filterManager.add("resolution",reactiveResolution);filterManager.add("contrast",reactiveContrast);filterManager.add("sobel",reactiveSobel);filterManager.add("gaussian",reactiveGaussianBlur);filterManager.add("canny",reactiveCanny);Controller.remember(filterManager.get("resolution"));Controller.remember(filterManager.get("contrast"));Controller.remember(filterManager.get("sobel"));Controller.remember(filterManager.get("canny")); +Controller.remember(filterManager.get("gaussian"));Controller.addFolder("Image Resolution");Controller.add(filterManager.get("resolution"),"width",0,2).step(.1);Controller.add(filterManager.get("resolution"),"height",0,2).step(.1);Controller.addFolder("Basic Image Processing");Controller.add(filterManager.get("contrast"),"contrast",0,100);Controller.addFolder("Gaussian Blur");Controller.add(filterManager.get("gaussian"),"sigma",0,10).step(.5);Controller.add(filterManager.get("gaussian"),"radius", +1,11).step(1);Controller.addFolder("Convolution Filters");Controller.add(filterManager.get("sobel"),"sobelActive");Controller.add(filterManager.get("canny"),"canny_radius");Controller.__save_row.children[2].addEventListener("click",function(){Controller.save();try{var b=JSON.stringify(Controller.getSaveObject());ControllerRememberer.store(b,function(){log("dat.GUI preset stored.","[PermanentStorage]");return!0})}catch(a){log("Corrupted data.","[PermanentStorage]")}},!1);iL=new ImageLoader(DOM.imageLoader, +init,process);return!0}); diff --git a/public_html/permanent-storage/index.php b/public_html/permanent-storage/index.php new file mode 100644 index 0000000..1c1e12b --- /dev/null +++ b/public_html/permanent-storage/index.php @@ -0,0 +1,36 @@ + error + =========================================================*/ + die('error'); diff --git a/public_html/permanent-storage/permanent-storage.php b/public_html/permanent-storage/permanent-storage.php deleted file mode 100644 index 92e5f72..0000000 --- a/public_html/permanent-storage/permanent-storage.php +++ /dev/null @@ -1,3 +0,0 @@ -