");
+ }
+ }
+ });
+ infoDiv.append(infoList);
+ extractDiv.addClass("col-md-8");
+ contentDiv.append(extractDiv);
+ contentDiv.append(infoDiv);
+ }
+ else {
+ extractDiv.addClass("col-md-12");
+ contentDiv.append(extractDiv);
+ }
+ divMatches.append(contentDiv);
+ }
+
+ countAsync--;
+ checkAsyncResults();
+
+ }).fail(function(err) {
+ throw err;
+ });
+}
+
+
+
+function queryWikiAPI(searchWordArray) {
+
+ var wikiURL = "https://en.wikipedia.org/w/api.php?" + $.param({
+ "action": "query",
+ "list": "search",
+ "srsearch": searchWordArray.join(" "),
+ "srwhat": "text",
+ "format": "json"
+ });
+
+ $.ajax({
+ url: wikiURL,
+ dataType: "jsonp"
+ }).done(function(result) {
+ console.log("wikipedia query results", result.query.search);
+ countAsync = 0;
+ divMatches.empty();
+ result.query.search.forEach(function(article) {
+ if ((article.title.search("List")) && (article.title.search("Cloud")) && (article.title.indexOf("Media") === -1)) {
+ countAsync++;
+ // Need two API calls because can't return categories and extracts for each article in same call - generator max 1
+ parseWikiAPI(article.pageid, article.title);
+ }
+ });
+
+ }).fail(function(err) {
+ throw err;
+ });
+}
+
+
+
+function queryVisionAPI(imageData) {
+ // imageData is either a url or base 64 encoded string
+ var imageDataString;
+ if (isURL(imageData)) {
+ imageDataString = '"source":{"imageUri":"' + imageData + '"}';
+ } else {
+ imageDataString = '"content":"' + imageData + '"';
+ }
+ var request = '{"requests":[{"image":{' + imageDataString + '},"features":[{"type":"WEB_DETECTION","maxResults":10},{"type":"LABEL_DETECTION","maxResults":10}]}]}';
+
+ var response = new XMLHttpRequest;
+ response.open("POST", "https://vision.googleapis.com/v1/images:annotate?key=" + apiKey.vision, !0);
+ response.send(request);
+
+ response.onload = function() {
+
+ var visionResults = [];
+ var result = JSON.parse(response.responseText);
+
+ if (result.responses[0].error) {
+ // Check if there was a response
+ // TODO: notify user there was a time-out
+ console.log(result.responses[0].error);
+ displayError(result.responses[0].error.message);
+ } else {
+ var queryResults = result.responses[0].webDetection.webEntities.concat(result.responses[0].labelAnnotations);
+ queryResults.sort(function(a, b) { // Sort the vision api results by score
+ return parseFloat(b.score) - parseFloat(a.score);
+ });
+ console.log(queryResults);
+ for (var i = 0; i < queryResults.length; i++) {
+ var resultWord = queryResults[i].description;
+ if (resultWord) {
+ resultWord = resultWord.toLowerCase();
+ var wordArray = resultWord.split(" ");
+ for (var j = 0; j < wordArray.length; j++) {
+ if (visionResults.indexOf(wordArray[j]) === -1) {
+ visionResults.push(wordArray[j]);
+ }
+ }
+ }
+ }
+ console.log(visionResults);
+ var searchWordArray = getCloudDescriptor(visionResults);
+ if (searchWordArray.length > 0) {
+ // if the cloud type was found in our cloud word array
+ queryWikiAPI(searchWordArray);
+ } else {
+ checkAsyncResults();
+ }
+ }
+ };
+};
+
+
+
+$("#submit").on("click", function(event) {
+ event.preventDefault();
+ var imageData = $("#image-url").val().trim();
+ if (imageData !== "") {
+ displayPic(imageData);
+ $("#image-url").val("");
+ $("#image-url").attr("placeholder", imageData);
+ queryVisionAPI(imageData);
+ }
+});
+
+
+var wikiInfoBox = [
+ "name",
+ "abbreviation",
+ "genus",
+ "species",
+ "altitude",
+ "appearance",
+ "precipitation"
+];
+
+var cloudGeneraArray = [
+ "nimbostratus",
+ "cumulonimbus",
+ "cirrus",
+ "cirrostratus",
+ "cirrocumulus",
+ "altostratus",
+ "altocumulus",
+ "stratus",
+ "stratocumulus",
+ "cumulus"
+];
+
+var cloudSpeciesArray = [
+ "virga",
+ "tornato",
+ "sundogs",
+ "pyrocumulus",
+ "pileus",
+ "noctilucent",
+ "nacreous",
+ "mammatus",
+ "kelvin–helmholtz",
+ "fallstreak",
+ "distrail",
+ "contrail",
+ "contrails",
+ "arcus",
+ "mushroom",
+ "spissatus",
+ "calvus",
+ "capillatus",
+ "cirrocumulogenitus",
+ "cumulonimbogenitus",
+ "homogenitus",
+ "cirromutatus",
+ "cirrocumulomutatus",
+ "altostratomutatus",
+ "cirrostratomutatus",
+ "altocumulogenitus",
+ "stratocumuliform",
+ "altocumulomutatus",
+ "cumuliform",
+ "volutus",
+ "undulatus",
+ "translucidus",
+ "radiatus",
+ "lacunosus",
+ "uncinus",
+ "stratiformis",
+ "stratiformus",
+ "stratiform",
+ "mediocris",
+ "lenticularis",
+ "lenticular",
+ "humilis",
+ "fractus",
+ "fibratus",
+ "congestus",
+ "castellanus",
+ "nebulosus",
+ "opacus",
+ "perlucidus",
+ "duplicatus",
+ "floccus",
+ "intortus",
+ "vertebratus",
+ "iridescence",
+ "circumhorizontal",
+ "mutatus",
+ "genitus",
+ "mackerel",
+ "incus",
+ "pannus",
+ "praecipitatio",
+ "tuba",
+ "velum",
+ "cirriform",
+ "columnar",
+ "tropospheric",
+ "asperitas",
+ "stratospheric",
+ "polar",
+ "non-nacreous"
+];
\ No newline at end of file
diff --git a/assets/javascript/imgur.js b/assets/javascript/imgur.js
new file mode 100644
index 0000000..edb5dcf
--- /dev/null
+++ b/assets/javascript/imgur.js
@@ -0,0 +1,344 @@
+// Sends image directly to vision api
+// Don't use if image is over 4MB
+// Also rotates the image if necessary for display
+// image is a base64 image URL string
+// orientation is a number between 1 and 8 that should be obtained
+// with the getOrientation method.
+function sendImageDirect(image, orientation = 1) {
+ var base64result = image.replace(/^data:image\/[a-z]+;base64,/, "");
+ console.log("Image is less than 4MB")
+ queryVisionAPI(base64result);
+}
+
+// Sends the image to Imgur to be stored and then Vision.
+// Use if image is greater than 4MB.
+// Requires a base64Image string with the prepending tags striped out.
+function sendImageImgur(image, orientation = 1) {
+ var base64result = image.replace(/^data:image\/[a-z]+;base64,/, "");
+ console.log("Image is greater than 4MB, wait for Imgur");
+ var form = new FormData();
+ form.append("image", base64result);
+
+ var settings = {
+ "async": true,
+ "crossDomain": true,
+ "url": "https://api.imgur.com/3/image",
+ "method": "POST",
+ "headers": {
+ "authorization": `Client-ID ${apiKey.imgur_client_id}`
+ },
+ "processData": false,
+ "contentType": false,
+ "mimeType": "multipart/form-data",
+ "data": form
+ }
+
+ $.ajax(settings).done(function(response) {
+ var res = JSON.parse(response);
+ console.log(res);
+ queryVisionAPI(res.data.link);
+ // displayPic(res.data.link);
+ });
+}
+
+//from http://stackoverflow.com/a/32490603
+//Gets the orientation alteration of an image
+// based on this picture https://i.stack.imgur.com/VGsAj.gif
+//file is a file blob
+//call back is the function to perform after completion
+// with the paramater of the orientation variable
+function getOrientation(file, callback) {
+ var reader = new FileReader();
+
+ reader.onload = function(event) {
+ var view = new DataView(event.target.result);
+
+ if (view.getUint16(0, false) != 0xFFD8) return callback(-2);
+
+ var length = view.byteLength,
+ offset = 2;
+
+ while (offset < length) {
+ var marker = view.getUint16(offset, false);
+ offset += 2;
+
+ if (marker == 0xFFE1) {
+ if (view.getUint32(offset += 2, false) != 0x45786966) {
+ return callback(-1);
+ }
+ var little = view.getUint16(offset += 6, false) == 0x4949;
+ offset += view.getUint32(offset + 4, little);
+ var tags = view.getUint16(offset, little);
+ offset += 2;
+
+ for (var i = 0; i < tags; i++)
+ if (view.getUint16(offset + (i * 12), little) == 0x0112)
+ return callback(view.getUint16(offset + (i * 12) + 8, little));
+ } else if ((marker & 0xFF00) != 0xFF00) break;
+ else offset += view.getUint16(offset, false);
+ }
+ return callback(-1);
+ };
+
+ reader.readAsArrayBuffer(file.slice(0, 64 * 1024));
+};
+
+//from https://stackoverflow.com/a/40867559/8630411
+//Resets the orientation of an base64 image url string
+// based on the orientation from getOrientaion
+// or this image https://i.stack.imgur.com/VGsAj.gif
+//srcBase64 is a base64 url string
+//srcOrientation is a number between 2 and 8
+//callback is the function to perform after the orientaion has finished
+function resetOrientation(srcBase64, srcOrientation, callback) {
+ console.log("Transforming image, please wait");
+ var img = new Image();
+
+ img.onload = function() {
+ var width = img.width,
+ height = img.height,
+ canvas = document.createElement('canvas'),
+ ctx = canvas.getContext("2d");
+
+ // set proper canvas dimensions before transform & export
+ if (4 < srcOrientation && srcOrientation < 9) {
+ canvas.width = height;
+ canvas.height = width;
+ } else {
+ canvas.width = width;
+ canvas.height = height;
+ }
+
+ // transform context before drawing image
+ switch (srcOrientation) {
+ case 2:
+ ctx.transform(-1, 0, 0, 1, width, 0);
+ break;
+ case 3:
+ ctx.transform(-1, 0, 0, -1, width, height);
+ break;
+ case 4:
+ ctx.transform(1, 0, 0, -1, 0, height);
+ break;
+ case 5:
+ ctx.transform(0, 1, 1, 0, 0, 0);
+ break;
+ case 6:
+ ctx.transform(0, 1, -1, 0, height, 0);
+ break;
+ case 7:
+ ctx.transform(0, -1, -1, 0, height, width);
+ break;
+ case 8:
+ ctx.transform(0, -1, 1, 0, 0, width);
+ break;
+ default:
+ break;
+ }
+
+ // draw image
+ ctx.drawImage(img, 0, 0);
+
+ // export base64
+ callback(canvas.toDataURL());
+ };
+
+ img.src = srcBase64;
+}
+
+//If the image is not oriented properly uses the resetOrientation function to
+// reorient the image
+function orientDisplayPic(picture, orientation) {
+ if (orientation > 1) {
+ resetOrientation(picture, orientation, function rotate(rotated) {
+ displayPic(rotated);
+ });
+ } else {
+ displayPic(picture);
+ }
+}
+
+//Displays picture on the page
+//picture is a valid string for that an image src tag can use
+function displayPic(picture) {
+ $("#displayImage").attr("src", picture);
+ $("#displayImage").removeClass("hidden");
+ $("#drag").removeClass("uploadWanted");
+ displayLoad();
+
+}
+
+
+//Display a message and gif to give the user feed back that the program is doing something
+//Empties the cloudDesc element, puts it there and uses clouds.gif
+function displayLoad() {
+ var load = $("");
+ load.addClass("img-center img-responsive");
+ load.attr("src", "assets/images/clouds.gif");
+ load.attr("id", "cloud-gif");
+ $("#cloudDesc").empty();
+ $("#cloudDesc").attr("hidden", false);
+ $("#cloudDesc").append("
Searching for cloud types
");
+ $("#cloudDesc").append(load);
+}
+
+//Display a message to the user, meant to be for errors
+//Empties the cloudDesc element and puts the message there
+function displayError(message, id = "cloudDesc") {
+ $("#" + id).empty();
+ setTimeout(function() {
+ $("#" + id).attr("hidden", false);
+ $("#" + id).append("
" + message + "
");
+ }, 48);
+}
+
+//Make sure that a file is an image and if so sends to the FileReader
+//file is a valid file blob
+function readPic(file) {
+ console.log(file);
+ var fileType = file["type"].split("/")[0];
+ if (fileType !== "image") {
+ displayError("Not an image, please use a valid image format: \
+ JPEG, PNG8, PNG24, GIF, Animated GIF (first frame only), BMP, WEBP, RAW, or ICO");
+
+ } else {
+ loadImage.parseMetaData(file, function(data) {
+ //default image orientation
+ var orientation = 0;
+ //if exif data available, update orientation
+ if (data.exif) {
+ orientation = data.exif.get('Orientation');
+ }
+ var loadingImage = loadImage(
+ file,
+ function(canvas) {
+ //here's the base64 data result
+ var base64data = canvas.toDataURL('image/jpeg');
+ displayPic(base64data);
+ if (file.size < 4000000) {
+ sendImageDirect(base64data);
+ } else {
+ sendImageImgur(base64data);
+ }
+ }, {
+ //should be set to canvas : true to activate auto fix orientation
+ canvas: true,
+ orientation: orientation
+ }
+ );
+ });
+ // getOrientation(file, function checkRotate(orientation) {
+ // console.log(orientation);
+ // var reader = new FileReader();
+ // getImageBase64(file, function(image) {
+ // if (file.size < 4000000) {
+ // orientDisplayPic(image, orientation);
+ // sendImageDirect(image, orientation);
+ // } else {
+ // orientDisplayPic(image, orientation);
+ // sendImageImgur(image, orientation);
+ // }
+ // });
+ // });
+ }
+}
+
+
+//Takes a file blob and returns a base64dataURL
+function getImageBase64(file, callback) {
+ var reader = new FileReader();
+ reader.onload = function gotImage(event) {
+ var image = event.target.result;
+ callback(image)
+ };
+ reader.readAsDataURL(file);
+}
+
+//Checks if a string is a base65URL
+//returns boolean
+function isBase64image(base64string) {
+ var legal = base64string[base64string.length - 1] === "=";
+ console.log(legal);
+ var base64reg = new RegExp(/data:image\/([a-zA-Z]*);base64,([^\"]*)/);
+ var valid = base64reg.test(base64string);
+ console.log(valid);
+ var image = base64string.search(/data:image/) !== -1;
+ console.log(image);
+ return (legal && valid && image);
+}
+
+$(document).ready(function addUpload() {
+
+ var imgur_client_id = "cffdbdcf9cb88c7";
+ var imgur_sec = "4e806c50fb260cc521bfe11d4e7edfa22cfbf684";
+ var authURL = "https://api.imgur.com/oauth2/authorize?client_id=" + imgur_client_id + "&response_type=token"
+ var auth_token = ""
+
+ var refreshForm = new FormData();
+ refreshForm.append("refresh_token", "4c771b1e1055e3eb3adee452a2155ebd258392d1");
+ refreshForm.append("client_id", "cffdbdcf9cb88c7");
+ refreshForm.append("client_secret", "4e806c50fb260cc521bfe11d4e7edfa22cfbf684");
+ refreshForm.append("grant_type", "refresh_token");
+
+ //adds drag and drop listeners to the drag element
+ $("#drag").on('dragover', function(event) {
+ event.stopPropagation();
+ event.preventDefault();
+ console.log('dragover');
+ $(this).css('border', '2px solid #66aede');
+ $(this).css('background-color', 'rgba(255,255,255,0.6)');
+ $(this).css('color', '#173848');
+ });
+ $("#drag").on('dragleave', function(event) {
+ event.stopPropagation();
+ event.preventDefault();
+ console.log('dragleave');
+ $(this).css('border', '2px dotted #66aede');
+ $(this).css('background-color', 'rgba(255,255,255,0.4)');
+ $(this).css('color', '#31708f');
+ });
+ $("#drag").on('drop', function(event) {
+ event.stopPropagation();
+ event.preventDefault();
+ $(this).css('border', '2px dotted #66aede');
+ $(this).css('background-color', 'rgba(255,255,255,0.4)');
+ $(this).css('color', '#31708f');
+
+ var files = event.originalEvent.dataTransfer.files;
+ console.log(files.length === 0);
+ if (files.length !== 0) {
+ //We need to send dropped files to Server
+ console.log(files);
+ for (var i = 0; i < files.length; i++) {
+ readPic(files[i]);
+ }
+ } else {
+ var url = $(event.originalEvent.dataTransfer.getData('text/html')).filter('img').attr('src');
+ console.log(url);
+ if (isURL(url)) {
+ console.log("Upload from another site");
+ displayPic(url);
+ queryVisionAPI(url);
+ } else
+ if (isBase64image(url)) {
+ console.log("Upload from another site");
+ displayPic(url);
+ queryVisionAPI(url);
+ } else {
+ displayError("Not a valid URL");
+ }
+ }
+ });
+
+ $("#uploadBtn").on("change", function readFile(event) {
+
+ console.log(event);
+ console.log($(this));
+
+ for (var i = 0; i < this.files.length; i++) {
+ readPic(this.files[i]);
+ }
+
+ });
+
+});
\ No newline at end of file
diff --git a/assets/javascript/keys.js b/assets/javascript/keys.js
new file mode 100644
index 0000000..d9b70f7
--- /dev/null
+++ b/assets/javascript/keys.js
@@ -0,0 +1,4 @@
+var apiKey = {
+ vision: "AIzaSyCx1GhLhN-MJGgS4uItlichD2gxgtWQag8",
+ imgur_client_id: "cffdbdcf9cb88c7"
+}
\ No newline at end of file
diff --git a/assets/javascript/load-image.all.min.js b/assets/javascript/load-image.all.min.js
new file mode 100644
index 0000000..acd7113
--- /dev/null
+++ b/assets/javascript/load-image.all.min.js
@@ -0,0 +1,2 @@
+!function(e){"use strict";function t(e,i,a){var o,n=document.createElement("img");return n.onerror=function(o){return t.onerror(n,o,e,i,a)},n.onload=function(o){return t.onload(n,o,e,i,a)},"string"==typeof e?(t.fetchBlob(e,function(i){i?(e=i,o=t.createObjectURL(e)):(o=e,a&&a.crossOrigin&&(n.crossOrigin=a.crossOrigin)),n.src=o},a),n):t.isInstanceOf("Blob",e)||t.isInstanceOf("File",e)?(o=n._objectURL=t.createObjectURL(e))?(n.src=o,n):t.readFile(e,function(e){var t=e.target;t&&t.result?n.src=t.result:i&&i(e)}):void 0}function i(e,i){!e._objectURL||i&&i.noRevoke||(t.revokeObjectURL(e._objectURL),delete e._objectURL)}var a=e.createObjectURL&&e||e.URL&&URL.revokeObjectURL&&URL||e.webkitURL&&webkitURL;t.fetchBlob=function(e,t,i){t()},t.isInstanceOf=function(e,t){return Object.prototype.toString.call(t)==="[object "+e+"]"},t.transform=function(e,t,i,a,o){i(e,o)},t.onerror=function(e,t,a,o,n){i(e,n),o&&o.call(e,t)},t.onload=function(e,a,o,n,r){i(e,r),n&&t.transform(e,r,n,o,{})},t.createObjectURL=function(e){return!!a&&a.createObjectURL(e)},t.revokeObjectURL=function(e){return!!a&&a.revokeObjectURL(e)},t.readFile=function(t,i,a){if(e.FileReader){var o=new FileReader;if(o.onload=o.onerror=i,a=a||"readAsDataURL",o[a])return o[a](t),o}return!1},"function"==typeof define&&define.amd?define(function(){return t}):"object"==typeof module&&module.exports?module.exports=t:e.loadImage=t}("undefined"!=typeof window&&window||this),function(e){"use strict";"function"==typeof define&&define.amd?define(["./load-image"],e):e("object"==typeof module&&module.exports?require("./load-image"):window.loadImage)}(function(e){"use strict";var t=e.transform;e.transform=function(i,a,o,n,r){t.call(e,e.scale(i,a,r),a,o,n,r)},e.transformCoordinates=function(){},e.getTransformedOptions=function(e,t){var i,a,o,n,r=t.aspectRatio;if(!r)return t;i={};for(a in t)t.hasOwnProperty(a)&&(i[a]=t[a]);return i.crop=!0,o=e.naturalWidth||e.width,n=e.naturalHeight||e.height,o/n>r?(i.maxWidth=n*r,i.maxHeight=n):(i.maxWidth=o,i.maxHeight=o/r),i},e.renderImageToCanvas=function(e,t,i,a,o,n,r,s,l,d){return e.getContext("2d").drawImage(t,i,a,o,n,r,s,l,d),e},e.hasCanvasOption=function(e){return e.canvas||e.crop||!!e.aspectRatio},e.scale=function(t,i,a){function o(){var e=Math.max((l||v)/v,(d||P)/P);e>1&&(v*=e,P*=e)}function n(){var e=Math.min((r||v)/v,(s||P)/P);e<1&&(v*=e,P*=e)}i=i||{};var r,s,l,d,c,u,f,g,h,m,p,S=document.createElement("canvas"),b=t.getContext||e.hasCanvasOption(i)&&S.getContext,y=t.naturalWidth||t.width,x=t.naturalHeight||t.height,v=y,P=x;if(b&&(f=(i=e.getTransformedOptions(t,i,a)).left||0,g=i.top||0,i.sourceWidth?(c=i.sourceWidth,void 0!==i.right&&void 0===i.left&&(f=y-c-i.right)):c=y-f-(i.right||0),i.sourceHeight?(u=i.sourceHeight,void 0!==i.bottom&&void 0===i.top&&(g=x-u-i.bottom)):u=x-g-(i.bottom||0),v=c,P=u),r=i.maxWidth,s=i.maxHeight,l=i.minWidth,d=i.minHeight,b&&r&&s&&i.crop?(v=r,P=s,(p=c/u-r/s)<0?(u=s*c/r,void 0===i.top&&void 0===i.bottom&&(g=(x-u)/2)):p>0&&(c=r*u/s,void 0===i.left&&void 0===i.right&&(f=(y-c)/2))):((i.contain||i.cover)&&(l=r=r||l,d=s=s||d),i.cover?(n(),o()):(o(),n())),b){if((h=i.pixelRatio)>1&&(S.style.width=v+"px",S.style.height=P+"px",v*=h,P*=h,S.getContext("2d").scale(h,h)),(m=i.downsamplingRatio)>0&&m<1&&vv;)S.width=c*m,S.height=u*m,e.renderImageToCanvas(S,t,f,g,c,u,0,0,S.width,S.height),f=0,g=0,c=S.width,u=S.height,(t=document.createElement("canvas")).width=c,t.height=u,e.renderImageToCanvas(t,S,0,0,c,u,0,0,c,u);return S.width=v,S.height=P,e.transformCoordinates(S,i),e.renderImageToCanvas(S,t,f,g,c,u,0,0,v,P)}return t.width=v,t.height=P,t}}),function(e){"use strict";"function"==typeof define&&define.amd?define(["./load-image"],e):e("object"==typeof module&&module.exports?require("./load-image"):window.loadImage)}(function(e){"use strict";var t="undefined"!=typeof Blob&&(Blob.prototype.slice||Blob.prototype.webkitSlice||Blob.prototype.mozSlice);e.blobSlice=t&&function(){return(this.slice||this.webkitSlice||this.mozSlice).apply(this,arguments)},e.metaDataParsers={jpeg:{65505:[]}},e.parseMetaData=function(t,i,a,o){a=a||{},o=o||{};var n=this,r=a.maxMetaDataSize||262144;!!("undefined"!=typeof DataView&&t&&t.size>=12&&"image/jpeg"===t.type&&e.blobSlice)&&e.readFile(e.blobSlice.call(t,0,r),function(t){if(t.target.error)return console.log(t.target.error),void i(o);var r,s,l,d,c=t.target.result,u=new DataView(c),f=2,g=u.byteLength-4,h=f;if(65496===u.getUint16(0)){for(;f=65504&&r<=65519||65534===r);){if(s=u.getUint16(f+2)+2,f+s>u.byteLength){console.log("Invalid meta data: Invalid segment size.");break}if(l=e.metaDataParsers.jpeg[r])for(d=0;d6&&(c.slice?o.imageHead=c.slice(0,h):o.imageHead=new Uint8Array(c).subarray(0,h))}else console.log("Invalid JPEG file: Missing JPEG marker.");i(o)},"readAsArrayBuffer")||i(o)},e.hasMetaOption=function(e){return e&&e.meta};var i=e.transform;e.transform=function(t,a,o,n,r){e.hasMetaOption(a)?e.parseMetaData(n,function(r){i.call(e,t,a,o,n,r)},a,r):i.apply(e,arguments)}}),function(e){"use strict";"function"==typeof define&&define.amd?define(["./load-image","./load-image-meta"],e):"object"==typeof module&&module.exports?e(require("./load-image"),require("./load-image-meta")):e(window.loadImage)}(function(e){"use strict";"undefined"!=typeof fetch&&"undefined"!=typeof Request&&(e.fetchBlob=function(t,i,a){if(e.hasMetaOption(a))return fetch(new Request(t,a)).then(function(e){return e.blob()}).then(i).catch(function(e){console.log(e),i()});i()})}),function(e){"use strict";"function"==typeof define&&define.amd?define(["./load-image","./load-image-meta"],e):"object"==typeof module&&module.exports?e(require("./load-image"),require("./load-image-meta")):e(window.loadImage)}(function(e){"use strict";e.ExifMap=function(){return this},e.ExifMap.prototype.map={Orientation:274},e.ExifMap.prototype.get=function(e){return this[e]||this[this.map[e]]},e.getExifThumbnail=function(e,t,i){var a,o,n;{if(i&&!(t+i>e.byteLength)){for(a=[],o=0;o4?i+t.getUint32(a+8,r):a+8)+s>t.byteLength)){if(1===n)return g.getValue(t,l,r);for(d=[],c=0;ce.byteLength)console.log("Invalid Exif data: Invalid directory offset.");else{if(n=e.getUint16(i,a),!((r=i+2+12*n)+4>e.byteLength)){for(s=0;st.byteLength)console.log("Invalid Exif data: Invalid segment size.");else if(0===t.getUint16(i+8)){switch(t.getUint16(d)){case 18761:r=!0;break;case 19789:r=!1;break;default:return void console.log("Invalid Exif data: Invalid byte alignment marker.")}42===t.getUint16(d+2,r)?(s=t.getUint32(d+4,r),o.exif=new e.ExifMap,(s=e.parseExifTags(t,d,d+s,r,o))&&!n.disableExifThumbnail&&(l={exif:{}},s=e.parseExifTags(t,d,d+s,r,l),l.exif[513]&&(o.exif.Thumbnail=e.getExifThumbnail(t,d+l.exif[513],l.exif[514]))),o.exif[34665]&&!n.disableExifSub&&e.parseExifTags(t,d,d+o.exif[34665],r,o),o.exif[34853]&&!n.disableExifGps&&e.parseExifTags(t,d,d+o.exif[34853],r,o)):console.log("Invalid Exif data: Missing TIFF marker.")}else console.log("Invalid Exif data: Missing byte alignment offset.")}},e.metaDataParsers.jpeg[65505].push(e.parseExifData)}),function(e){"use strict";"function"==typeof define&&define.amd?define(["./load-image","./load-image-exif"],e):"object"==typeof module&&module.exports?e(require("./load-image"),require("./load-image-exif")):e(window.loadImage)}(function(e){"use strict";e.ExifMap.prototype.tags={256:"ImageWidth",257:"ImageHeight",34665:"ExifIFDPointer",34853:"GPSInfoIFDPointer",40965:"InteroperabilityIFDPointer",258:"BitsPerSample",259:"Compression",262:"PhotometricInterpretation",274:"Orientation",277:"SamplesPerPixel",284:"PlanarConfiguration",530:"YCbCrSubSampling",531:"YCbCrPositioning",282:"XResolution",283:"YResolution",296:"ResolutionUnit",273:"StripOffsets",278:"RowsPerStrip",279:"StripByteCounts",513:"JPEGInterchangeFormat",514:"JPEGInterchangeFormatLength",301:"TransferFunction",318:"WhitePoint",319:"PrimaryChromaticities",529:"YCbCrCoefficients",532:"ReferenceBlackWhite",306:"DateTime",270:"ImageDescription",271:"Make",272:"Model",305:"Software",315:"Artist",33432:"Copyright",36864:"ExifVersion",40960:"FlashpixVersion",40961:"ColorSpace",40962:"PixelXDimension",40963:"PixelYDimension",42240:"Gamma",37121:"ComponentsConfiguration",37122:"CompressedBitsPerPixel",37500:"MakerNote",37510:"UserComment",40964:"RelatedSoundFile",36867:"DateTimeOriginal",36868:"DateTimeDigitized",37520:"SubSecTime",37521:"SubSecTimeOriginal",37522:"SubSecTimeDigitized",33434:"ExposureTime",33437:"FNumber",34850:"ExposureProgram",34852:"SpectralSensitivity",34855:"PhotographicSensitivity",34856:"OECF",34864:"SensitivityType",34865:"StandardOutputSensitivity",34866:"RecommendedExposureIndex",34867:"ISOSpeed",34868:"ISOSpeedLatitudeyyy",34869:"ISOSpeedLatitudezzz",37377:"ShutterSpeedValue",37378:"ApertureValue",37379:"BrightnessValue",37380:"ExposureBias",37381:"MaxApertureValue",37382:"SubjectDistance",37383:"MeteringMode",37384:"LightSource",37385:"Flash",37396:"SubjectArea",37386:"FocalLength",41483:"FlashEnergy",41484:"SpatialFrequencyResponse",41486:"FocalPlaneXResolution",41487:"FocalPlaneYResolution",41488:"FocalPlaneResolutionUnit",41492:"SubjectLocation",41493:"ExposureIndex",41495:"SensingMethod",41728:"FileSource",41729:"SceneType",41730:"CFAPattern",41985:"CustomRendered",41986:"ExposureMode",41987:"WhiteBalance",41988:"DigitalZoomRatio",41989:"FocalLengthIn35mmFilm",41990:"SceneCaptureType",41991:"GainControl",41992:"Contrast",41993:"Saturation",41994:"Sharpness",41995:"DeviceSettingDescription",41996:"SubjectDistanceRange",42016:"ImageUniqueID",42032:"CameraOwnerName",42033:"BodySerialNumber",42034:"LensSpecification",42035:"LensMake",42036:"LensModel",42037:"LensSerialNumber",0:"GPSVersionID",1:"GPSLatitudeRef",2:"GPSLatitude",3:"GPSLongitudeRef",4:"GPSLongitude",5:"GPSAltitudeRef",6:"GPSAltitude",7:"GPSTimeStamp",8:"GPSSatellites",9:"GPSStatus",10:"GPSMeasureMode",11:"GPSDOP",12:"GPSSpeedRef",13:"GPSSpeed",14:"GPSTrackRef",15:"GPSTrack",16:"GPSImgDirectionRef",17:"GPSImgDirection",18:"GPSMapDatum",19:"GPSDestLatitudeRef",20:"GPSDestLatitude",21:"GPSDestLongitudeRef",22:"GPSDestLongitude",23:"GPSDestBearingRef",24:"GPSDestBearing",25:"GPSDestDistanceRef",26:"GPSDestDistance",27:"GPSProcessingMethod",28:"GPSAreaInformation",29:"GPSDateStamp",30:"GPSDifferential",31:"GPSHPositioningError"},e.ExifMap.prototype.stringValues={ExposureProgram:{0:"Undefined",1:"Manual",2:"Normal program",3:"Aperture priority",4:"Shutter priority",5:"Creative program",6:"Action program",7:"Portrait mode",8:"Landscape mode"},MeteringMode:{0:"Unknown",1:"Average",2:"CenterWeightedAverage",3:"Spot",4:"MultiSpot",5:"Pattern",6:"Partial",255:"Other"},LightSource:{0:"Unknown",1:"Daylight",2:"Fluorescent",3:"Tungsten (incandescent light)",4:"Flash",9:"Fine weather",10:"Cloudy weather",11:"Shade",12:"Daylight fluorescent (D 5700 - 7100K)",13:"Day white fluorescent (N 4600 - 5400K)",14:"Cool white fluorescent (W 3900 - 4500K)",15:"White fluorescent (WW 3200 - 3700K)",17:"Standard light A",18:"Standard light B",19:"Standard light C",20:"D55",21:"D65",22:"D75",23:"D50",24:"ISO studio tungsten",255:"Other"},Flash:{0:"Flash did not fire",1:"Flash fired",5:"Strobe return light not detected",7:"Strobe return light detected",9:"Flash fired, compulsory flash mode",13:"Flash fired, compulsory flash mode, return light not detected",15:"Flash fired, compulsory flash mode, return light detected",16:"Flash did not fire, compulsory flash mode",24:"Flash did not fire, auto mode",25:"Flash fired, auto mode",29:"Flash fired, auto mode, return light not detected",31:"Flash fired, auto mode, return light detected",32:"No flash function",65:"Flash fired, red-eye reduction mode",69:"Flash fired, red-eye reduction mode, return light not detected",71:"Flash fired, red-eye reduction mode, return light detected",73:"Flash fired, compulsory flash mode, red-eye reduction mode",77:"Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",79:"Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",89:"Flash fired, auto mode, red-eye reduction mode",93:"Flash fired, auto mode, return light not detected, red-eye reduction mode",95:"Flash fired, auto mode, return light detected, red-eye reduction mode"},SensingMethod:{1:"Undefined",2:"One-chip color area sensor",3:"Two-chip color area sensor",4:"Three-chip color area sensor",5:"Color sequential area sensor",7:"Trilinear sensor",8:"Color sequential linear sensor"},SceneCaptureType:{0:"Standard",1:"Landscape",2:"Portrait",3:"Night scene"},SceneType:{1:"Directly photographed"},CustomRendered:{0:"Normal process",1:"Custom process"},WhiteBalance:{0:"Auto white balance",1:"Manual white balance"},GainControl:{0:"None",1:"Low gain up",2:"High gain up",3:"Low gain down",4:"High gain down"},Contrast:{0:"Normal",1:"Soft",2:"Hard"},Saturation:{0:"Normal",1:"Low saturation",2:"High saturation"},Sharpness:{0:"Normal",1:"Soft",2:"Hard"},SubjectDistanceRange:{0:"Unknown",1:"Macro",2:"Close view",3:"Distant view"},FileSource:{3:"DSC"},ComponentsConfiguration:{0:"",1:"Y",2:"Cb",3:"Cr",4:"R",5:"G",6:"B"},Orientation:{1:"top-left",2:"top-right",3:"bottom-right",4:"bottom-left",5:"left-top",6:"right-top",7:"right-bottom",8:"left-bottom"}},e.ExifMap.prototype.getText=function(e){var t=this.get(e);switch(e){case"LightSource":case"Flash":case"MeteringMode":case"ExposureProgram":case"SensingMethod":case"SceneCaptureType":case"SceneType":case"CustomRendered":case"WhiteBalance":case"GainControl":case"Contrast":case"Saturation":case"Sharpness":case"SubjectDistanceRange":case"FileSource":case"Orientation":return this.stringValues[e][t];case"ExifVersion":case"FlashpixVersion":if(!t)return;return String.fromCharCode(t[0],t[1],t[2],t[3]);case"ComponentsConfiguration":if(!t)return;return this.stringValues[e][t[0]]+this.stringValues[e][t[1]]+this.stringValues[e][t[2]]+this.stringValues[e][t[3]];case"GPSVersionID":if(!t)return;return t[0]+"."+t[1]+"."+t[2]+"."+t[3]}return String(t)},function(e){var t,i=e.tags,a=e.map;for(t in i)i.hasOwnProperty(t)&&(a[i[t]]=t)}(e.ExifMap.prototype),e.ExifMap.prototype.getAll=function(){var e,t,i={};for(e in this)this.hasOwnProperty(e)&&(t=this.tags[e])&&(i[t]=this.getText(t));return i}}),function(e){"use strict";"function"==typeof define&&define.amd?define(["./load-image","./load-image-scale","./load-image-meta"],e):"object"==typeof module&&module.exports?e(require("./load-image"),require("./load-image-scale"),require("./load-image-meta")):e(window.loadImage)}(function(e){"use strict";var t=e.hasCanvasOption,i=e.hasMetaOption,a=e.transformCoordinates,o=e.getTransformedOptions;e.hasCanvasOption=function(i){return!!i.orientation||t.call(e,i)},e.hasMetaOption=function(t){return t&&!0===t.orientation||i.call(e,t)},e.transformCoordinates=function(t,i){a.call(e,t,i);var o=t.getContext("2d"),n=t.width,r=t.height,s=t.style.width,l=t.style.height,d=i.orientation;if(d&&!(d>8))switch(d>4&&(t.width=r,t.height=n,t.style.width=l,t.style.height=s),d){case 2:o.translate(n,0),o.scale(-1,1);break;case 3:o.translate(n,r),o.rotate(Math.PI);break;case 4:o.translate(0,r),o.scale(1,-1);break;case 5:o.rotate(.5*Math.PI),o.scale(1,-1);break;case 6:o.rotate(.5*Math.PI),o.translate(0,-r);break;case 7:o.rotate(.5*Math.PI),o.translate(n,-r),o.scale(-1,1);break;case 8:o.rotate(-.5*Math.PI),o.translate(-n,0)}},e.getTransformedOptions=function(t,i,a){var n,r,s=o.call(e,t,i),l=s.orientation;if(!0===l&&a&&a.exif&&(l=a.exif.get("Orientation")),!l||l>8||1===l)return s;n={};for(r in s)s.hasOwnProperty(r)&&(n[r]=s[r]);switch(n.orientation=l,l){case 2:n.left=s.right,n.right=s.left;break;case 3:n.left=s.right,n.top=s.bottom,n.right=s.left,n.bottom=s.top;break;case 4:n.top=s.bottom,n.bottom=s.top;break;case 5:n.left=s.top,n.top=s.left,n.right=s.bottom,n.bottom=s.right;break;case 6:n.left=s.top,n.top=s.right,n.right=s.bottom,n.bottom=s.left;break;case 7:n.left=s.bottom,n.top=s.right,n.right=s.top,n.bottom=s.left;break;case 8:n.left=s.bottom,n.top=s.left,n.right=s.top,n.bottom=s.right}return n.orientation>4&&(n.maxWidth=s.maxHeight,n.maxHeight=s.maxWidth,n.minWidth=s.minHeight,n.minHeight=s.minWidth,n.sourceWidth=s.sourceHeight,n.sourceHeight=s.sourceWidth),n}});
+//# sourceMappingURL=load-image.all.min.js.map
\ No newline at end of file
diff --git a/assets/javascript/load-image.all.min.js.map b/assets/javascript/load-image.all.min.js.map
new file mode 100644
index 0000000..ee5f23d
--- /dev/null
+++ b/assets/javascript/load-image.all.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["load-image.js","load-image-scale.js","load-image-meta.js","load-image-fetch.js","load-image-exif.js","load-image-exif-map.js","load-image-orientation.js"],"names":["$","loadImage","file","callback","options","url","img","document","createElement","onerror","event","onload","fetchBlob","blob","createObjectURL","crossOrigin","src","isInstanceOf","_objectURL","readFile","e","target","result","revokeHelper","noRevoke","revokeObjectURL","urlAPI","URL","webkitURL","type","obj","Object","prototype","toString","call","transform","data","method","FileReader","fileReader","define","amd","module","exports","window","this","factory","require","originalTransform","scale","transformCoordinates","getTransformedOptions","newOptions","i","width","height","aspectRatio","hasOwnProperty","crop","naturalWidth","naturalHeight","maxWidth","maxHeight","renderImageToCanvas","canvas","sourceX","sourceY","sourceWidth","sourceHeight","destX","destY","destWidth","destHeight","getContext","drawImage","hasCanvasOption","scaleUp","Math","max","minWidth","minHeight","scaleDown","min","pixelRatio","downsamplingRatio","tmp","useCanvas","left","top","undefined","right","bottom","contain","cover","style","hasblobSlice","Blob","slice","webkitSlice","mozSlice","blobSlice","apply","arguments","metaDataParsers","jpeg","65505","parseMetaData","that","maxMetaDataSize","DataView","size","error","console","log","markerBytes","markerLength","parsers","buffer","dataView","offset","maxOffset","byteLength","headLength","getUint16","length","disableImageHead","imageHead","Uint8Array","subarray","hasMetaOption","meta","fetch","Request","then","response","catch","err","ExifMap","map","Orientation","get","id","getExifThumbnail","hexData","b","getUint8","push","join","exifTagTypes","1","getValue","dataOffset","2","String","fromCharCode","ascii","3","littleEndian","4","getUint32","5","9","getInt32","10","getExifValue","tiffOffset","tagSize","values","str","c","tagType","parseExifTag","tag","exif","parseExifTags","dirOffset","tagsNumber","dirEndOffset","parseExifData","disableExif","thumbnailData","disableExifThumbnail","Thumbnail","disableExifSub","disableExifGps","tags","256","257","34665","34853","40965","258","259","262","274","277","284","530","531","282","283","296","273","278","279","513","514","301","318","319","529","532","306","270","271","272","305","315","33432","36864","40960","40961","40962","40963","42240","37121","37122","37500","37510","40964","36867","36868","37520","37521","37522","33434","33437","34850","34852","34855","34856","34864","34865","34866","34867","34868","34869","37377","37378","37379","37380","37381","37382","37383","37384","37385","37396","37386","41483","41484","41486","41487","41488","41492","41493","41495","41728","41729","41730","41985","41986","41987","41988","41989","41990","41991","41992","41993","41994","41995","41996","42016","42032","42033","42034","42035","42036","42037","0","6","7","8","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","stringValues","ExposureProgram","MeteringMode","255","LightSource","Flash","32","65","69","71","73","77","79","89","93","95","SensingMethod","SceneCaptureType","SceneType","CustomRendered","WhiteBalance","GainControl","Contrast","Saturation","Sharpness","SubjectDistanceRange","FileSource","ComponentsConfiguration","getText","value","exifMapPrototype","prop","getAll","originalHasCanvasOption","originalHasMetaOption","originalTransformCoordinates","originalGetTransformedOptions","orientation","ctx","styleWidth","styleHeight","translate","rotate","PI","opts"],"mappings":"CAaC,SAAWA,GACV,aAKA,SAASC,EAAWC,EAAMC,EAAUC,GAClC,IACIC,EADAC,EAAMC,SAASC,cAAc,OAQjC,OANAF,EAAIG,QAAU,SAAUC,GACtB,OAAOT,EAAUQ,QAAQH,EAAKI,EAAOR,EAAMC,EAAUC,IAEvDE,EAAIK,OAAS,SAAUD,GACrB,OAAOT,EAAUU,OAAOL,EAAKI,EAAOR,EAAMC,EAAUC,IAElC,iBAATF,GACTD,EAAUW,UACRV,EACA,SAAUW,GACJA,GACFX,EAAOW,EACPR,EAAMJ,EAAUa,gBAAgBZ,KAEhCG,EAAMH,EACFE,GAAWA,EAAQW,cACrBT,EAAIS,YAAcX,EAAQW,cAG9BT,EAAIU,IAAMX,GAEZD,GAEKE,GAEPL,EAAUgB,aAAa,OAAQf,IAG/BD,EAAUgB,aAAa,OAAQf,IAE/BG,EAAMC,EAAIY,WAAajB,EAAUa,gBAAgBZ,KAE/CI,EAAIU,IAAMX,EACHC,GAEFL,EAAUkB,SAASjB,EAAM,SAAUkB,GACxC,IAAIC,EAASD,EAAEC,OACXA,GAAUA,EAAOC,OACnBhB,EAAIU,IAAMK,EAAOC,OACRnB,GACTA,EAASiB,UAhBR,EA4BT,SAASG,EAAcjB,EAAKF,IACtBE,EAAIY,YAAgBd,GAAWA,EAAQoB,WACzCvB,EAAUwB,gBAAgBnB,EAAIY,mBACvBZ,EAAIY,YARf,IAAIQ,EACD1B,EAAEc,iBAAmBd,GACrBA,EAAE2B,KAAOA,IAAIF,iBAAmBE,KAChC3B,EAAE4B,WAAaA,UAYlB3B,EAAUW,UAAY,SAAUP,EAAKF,EAAUC,GAC7CD,KAGFF,EAAUgB,aAAe,SAAUY,EAAMC,GAEvC,OAAOC,OAAOC,UAAUC,SAASC,KAAKJ,KAAS,WAAaD,EAAO,KAGrE5B,EAAUkC,UAAY,SAAU7B,EAAKF,EAASD,EAAUD,EAAMkC,GAC5DjC,EAASG,EAAK8B,IAGhBnC,EAAUQ,QAAU,SAAUH,EAAKI,EAAOR,EAAMC,EAAUC,GACxDmB,EAAajB,EAAKF,GACdD,GACFA,EAAS+B,KAAK5B,EAAKI,IAIvBT,EAAUU,OAAS,SAAUL,EAAKI,EAAOR,EAAMC,EAAUC,GACvDmB,EAAajB,EAAKF,GACdD,GACFF,EAAUkC,UAAU7B,EAAKF,EAASD,EAAUD,OAIhDD,EAAUa,gBAAkB,SAAUZ,GACpC,QAAOwB,GAASA,EAAOZ,gBAAgBZ,IAGzCD,EAAUwB,gBAAkB,SAAUpB,GACpC,QAAOqB,GAASA,EAAOD,gBAAgBpB,IAMzCJ,EAAUkB,SAAW,SAAUjB,EAAMC,EAAUkC,GAC7C,GAAIrC,EAAEsC,WAAY,CAChB,IAAIC,EAAa,IAAID,WAGrB,GAFAC,EAAW5B,OAAS4B,EAAW9B,QAAUN,EACzCkC,EAASA,GAAU,gBACfE,EAAWF,GAEb,OADAE,EAAWF,GAAQnC,GACZqC,EAGX,OAAO,GAGa,mBAAXC,QAAyBA,OAAOC,IACzCD,OAAO,WACL,OAAOvC,IAEkB,iBAAXyC,QAAuBA,OAAOC,QAC9CD,OAAOC,QAAU1C,EAEjBD,EAAEC,UAAYA,EAjIjB,CAmIqB,oBAAX2C,QAA0BA,QAAWC,MCnI/C,SAAWC,GACV,aACsB,mBAAXN,QAAyBA,OAAOC,IAEzCD,QAAQ,gBAAiBM,GAEzBA,EAD2B,iBAAXJ,QAAuBA,OAAOC,QACtCI,QAAQ,gBAGRH,OAAO3C,WATlB,CAWE,SAAUA,GACX,aAEA,IAAI+C,EAAoB/C,EAAUkC,UAElClC,EAAUkC,UAAY,SAAU7B,EAAKF,EAASD,EAAUD,EAAMkC,GAC5DY,EAAkBd,KAChBjC,EACAA,EAAUgD,MAAM3C,EAAKF,EAASgC,GAC9BhC,EACAD,EACAD,EACAkC,IAOJnC,EAAUiD,qBAAuB,aAKjCjD,EAAUkD,sBAAwB,SAAU7C,EAAKF,GAC/C,IACIgD,EACAC,EACAC,EACAC,EAJAC,EAAcpD,EAAQoD,YAK1B,IAAKA,EACH,OAAOpD,EAETgD,KACA,IAAKC,KAAKjD,EACJA,EAAQqD,eAAeJ,KACzBD,EAAWC,GAAKjD,EAAQiD,IAa5B,OAVAD,EAAWM,MAAO,EAClBJ,EAAQhD,EAAIqD,cAAgBrD,EAAIgD,MAChCC,EAASjD,EAAIsD,eAAiBtD,EAAIiD,OAC9BD,EAAQC,EAASC,GACnBJ,EAAWS,SAAWN,EAASC,EAC/BJ,EAAWU,UAAYP,IAEvBH,EAAWS,SAAWP,EACtBF,EAAWU,UAAYR,EAAQE,GAE1BJ,GAITnD,EAAU8D,oBAAsB,SAC9BC,EACA1D,EACA2D,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAeA,OAbAR,EACGS,WAAW,MACXC,UACCpE,EACA2D,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAEGR,GAIT/D,EAAU0E,gBAAkB,SAAUvE,GACpC,OAAOA,EAAQ4D,QAAU5D,EAAQsD,QAAUtD,EAAQoD,aAQrDvD,EAAUgD,MAAQ,SAAU3C,EAAKF,EAASgC,GAqBxC,SAASwC,IACP,IAAI3B,EAAQ4B,KAAKC,KACdC,GAAYR,GAAaA,GACzBS,GAAaR,GAAcA,GAE1BvB,EAAQ,IACVsB,GAAatB,EACbuB,GAAcvB,GAGlB,SAASgC,IACP,IAAIhC,EAAQ4B,KAAKK,KACdrB,GAAYU,GAAaA,GACzBT,GAAaU,GAAcA,GAE1BvB,EAAQ,IACVsB,GAAatB,EACbuB,GAAcvB,GArClB7C,EAAUA,MACV,IAQIyD,EACAC,EACAiB,EACAC,EACAb,EACAC,EACAH,EACAC,EACAiB,EACAC,EACAC,EAlBArB,EAASzD,SAASC,cAAc,UAChC8E,EACFhF,EAAImE,YACHxE,EAAU0E,gBAAgBvE,IAAY4D,EAAOS,WAC5CnB,EAAQhD,EAAIqD,cAAgBrD,EAAIgD,MAChCC,EAASjD,EAAIsD,eAAiBtD,EAAIiD,OAClCgB,EAAYjB,EACZkB,EAAajB,EAuFjB,GAvDI+B,IAEFrB,GADA7D,EAAUH,EAAUkD,sBAAsB7C,EAAKF,EAASgC,IACtCmD,MAAQ,EAC1BrB,EAAU9D,EAAQoF,KAAO,EACrBpF,EAAQ+D,aACVA,EAAc/D,EAAQ+D,iBACAsB,IAAlBrF,EAAQsF,YAAwCD,IAAjBrF,EAAQmF,OACzCtB,EAAUX,EAAQa,EAAc/D,EAAQsF,QAG1CvB,EAAcb,EAAQW,GAAW7D,EAAQsF,OAAS,GAEhDtF,EAAQgE,cACVA,EAAehE,EAAQgE,kBACAqB,IAAnBrF,EAAQuF,aAAwCF,IAAhBrF,EAAQoF,MAC1CtB,EAAUX,EAASa,EAAehE,EAAQuF,SAG5CvB,EAAeb,EAASW,GAAW9D,EAAQuF,QAAU,GAEvDpB,EAAYJ,EACZK,EAAaJ,GAEfP,EAAWzD,EAAQyD,SACnBC,EAAY1D,EAAQ0D,UACpBiB,EAAW3E,EAAQ2E,SACnBC,EAAY5E,EAAQ4E,UAChBM,GAAazB,GAAYC,GAAa1D,EAAQsD,MAChDa,EAAYV,EACZW,EAAaV,GACbuB,EAAMlB,EAAcC,EAAeP,EAAWC,GACpC,GACRM,EAAeN,EAAYK,EAAcN,OACrB4B,IAAhBrF,EAAQoF,UAAwCC,IAAnBrF,EAAQuF,SACvCzB,GAAWX,EAASa,GAAgB,IAE7BiB,EAAM,IACflB,EAAcN,EAAWO,EAAeN,OACnB2B,IAAjBrF,EAAQmF,WAAwCE,IAAlBrF,EAAQsF,QACxCzB,GAAWX,EAAQa,GAAe,OAIlC/D,EAAQwF,SAAWxF,EAAQyF,SAC7Bd,EAAWlB,EAAWA,GAAYkB,EAClCC,EAAYlB,EAAYA,GAAakB,GAEnC5E,EAAQyF,OACVZ,IACAL,MAEAA,IACAK,MAGAK,EAAW,CAUb,IATAH,EAAa/E,EAAQ+E,YACJ,IACfnB,EAAO8B,MAAMxC,MAAQiB,EAAY,KACjCP,EAAO8B,MAAMvC,OAASiB,EAAa,KACnCD,GAAaY,EACbX,GAAcW,EACdnB,EAAOS,WAAW,MAAMxB,MAAMkC,EAAYA,KAE5CC,EAAoBhF,EAAQgF,mBAEN,GACpBA,EAAoB,GACpBb,EAAYJ,GACZK,EAAaJ,EAEb,KAAOD,EAAciB,EAAoBb,GACvCP,EAAOV,MAAQa,EAAciB,EAC7BpB,EAAOT,OAASa,EAAegB,EAC/BnF,EAAU8D,oBACRC,EACA1D,EACA2D,EACAC,EACAC,EACAC,EACA,EACA,EACAJ,EAAOV,MACPU,EAAOT,QAETU,EAAU,EACVC,EAAU,EACVC,EAAcH,EAAOV,MACrBc,EAAeJ,EAAOT,QACtBjD,EAAMC,SAASC,cAAc,WACzB8C,MAAQa,EACZ7D,EAAIiD,OAASa,EACbnE,EAAU8D,oBACRzD,EACA0D,EACA,EACA,EACAG,EACAC,EACA,EACA,EACAD,EACAC,GAON,OAHAJ,EAAOV,MAAQiB,EACfP,EAAOT,OAASiB,EAChBvE,EAAUiD,qBAAqBc,EAAQ5D,GAChCH,EAAU8D,oBACfC,EACA1D,EACA2D,EACAC,EACAC,EACAC,EACA,EACA,EACAG,EACAC,GAKJ,OAFAlE,EAAIgD,MAAQiB,EACZjE,EAAIiD,OAASiB,EACNlE,KCxQV,SAAWwC,GACV,aACsB,mBAAXN,QAAyBA,OAAOC,IAEzCD,QAAQ,gBAAiBM,GAEzBA,EAD2B,iBAAXJ,QAAuBA,OAAOC,QACtCI,QAAQ,gBAGRH,OAAO3C,WATlB,CAWE,SAAUA,GACX,aAEA,IAAI8F,EACc,oBAATC,OACNA,KAAKhE,UAAUiE,OACdD,KAAKhE,UAAUkE,aACfF,KAAKhE,UAAUmE,UAEnBlG,EAAUmG,UACRL,GACA,WAEE,OADYlD,KAAKoD,OAASpD,KAAKqD,aAAerD,KAAKsD,UACtCE,MAAMxD,KAAMyD,YAG7BrG,EAAUsG,iBACRC,MACEC,WAUJxG,EAAUyG,cAAgB,SAAUxG,EAAMC,EAAUC,EAASgC,GAC3DhC,EAAUA,MACVgC,EAAOA,MACP,IAAIuE,EAAO9D,KAEP+D,EAAkBxG,EAAQwG,iBAAmB,UAE3B,oBAAbC,UACP3G,GACAA,EAAK4G,MAAQ,IACC,eAAd5G,EAAK2B,MACL5B,EAAUmG,YAITnG,EAAUkB,SACTlB,EAAUmG,UAAUlE,KAAKhC,EAAM,EAAG0G,GAClC,SAAUxF,GACR,GAAIA,EAAEC,OAAO0F,MAIX,OAFAC,QAAQC,IAAI7F,EAAEC,OAAO0F,YACrB5G,EAASiC,GAOX,IAKI8E,EACAC,EACAC,EACA/D,EARAgE,EAASjG,EAAEC,OAAOC,OAClBgG,EAAW,IAAIT,SAASQ,GACxBE,EAAS,EACTC,EAAYF,EAASG,WAAa,EAClCC,EAAaH,EAMjB,GAA8B,QAA1BD,EAASK,UAAU,GAAe,CACpC,KAAOJ,EAASC,KACdN,EAAcI,EAASK,UAAUJ,KAKf,OAAUL,GAAe,OACzB,QAAhBA,IAPuB,CAcvB,GADAC,EAAeG,EAASK,UAAUJ,EAAS,GAAK,EAC5CA,EAASJ,EAAeG,EAASG,WAAY,CAC/CT,QAAQC,IAAI,4CACZ,MAGF,GADAG,EAAUnH,EAAUsG,gBAAgBC,KAAKU,GAEvC,IAAK7D,EAAI,EAAGA,EAAI+D,EAAQQ,OAAQvE,GAAK,EACnC+D,EAAQ/D,GAAGnB,KACTyE,EACAW,EACAC,EACAJ,EACA/E,EACAhC,GAKNsH,EADAH,GAAUJ,GAUT/G,EAAQyH,kBAAoBH,EAAa,IACxCL,EAAOpB,MACT7D,EAAK0F,UAAYT,EAAOpB,MAAM,EAAGyB,GAIjCtF,EAAK0F,UAAY,IAAIC,WAAWV,GAAQW,SAAS,EAAGN,SAIxDV,QAAQC,IAAI,2CAEd9G,EAASiC,IAEX,sBAGFjC,EAASiC,IAKbnC,EAAUgI,cAAgB,SAAU7H,GAClC,OAAOA,GAAWA,EAAQ8H,MAG5B,IAAIlF,EAAoB/C,EAAUkC,UAClClC,EAAUkC,UAAY,SAAU7B,EAAKF,EAASD,EAAUD,EAAMkC,GACxDnC,EAAUgI,cAAc7H,GAC1BH,EAAUyG,cACRxG,EACA,SAAUkC,GACRY,EAAkBd,KAAKjC,EAAWK,EAAKF,EAASD,EAAUD,EAAMkC,IAElEhC,EACAgC,GAGFY,EAAkBqD,MAAMpG,EAAWqG,cCjKxC,SAAWxD,GACV,aACsB,mBAAXN,QAAyBA,OAAOC,IAEzCD,QAAQ,eAAgB,qBAAsBM,GACnB,iBAAXJ,QAAuBA,OAAOC,QAC9CG,EAAQC,QAAQ,gBAAiBA,QAAQ,sBAGzCD,EAAQF,OAAO3C,WATlB,CAWE,SAAUA,GACX,aAEqB,oBAAVkI,OAA4C,oBAAZC,UACzCnI,EAAUW,UAAY,SAAUP,EAAKF,EAAUC,GAC7C,GAAIH,EAAUgI,cAAc7H,GAC1B,OAAO+H,MAAM,IAAIC,QAAQ/H,EAAKD,IAC3BiI,KAAK,SAAUC,GACd,OAAOA,EAASzH,SAEjBwH,KAAKlI,GACLoI,MAAM,SAAUC,GACfxB,QAAQC,IAAIuB,GACZrI,MAGJA,QC3BP,SAAW2C,GACV,aACsB,mBAAXN,QAAyBA,OAAOC,IAEzCD,QAAQ,eAAgB,qBAAsBM,GACnB,iBAAXJ,QAAuBA,OAAOC,QAC9CG,EAAQC,QAAQ,gBAAiBA,QAAQ,sBAGzCD,EAAQF,OAAO3C,WATlB,CAWE,SAAUA,GACX,aAEAA,EAAUwI,QAAU,WAClB,OAAO5F,MAGT5C,EAAUwI,QAAQzG,UAAU0G,KAC1BC,YAAa,KAGf1I,EAAUwI,QAAQzG,UAAU4G,IAAM,SAAUC,GAC1C,OAAOhG,KAAKgG,IAAOhG,KAAKA,KAAK6F,IAAIG,KAGnC5I,EAAU6I,iBAAmB,SAAUxB,EAAUC,EAAQK,GACvD,IAAImB,EAAS1F,EAAG2F,EAChB,CAAA,GAAKpB,KAAUL,EAASK,EAASN,EAASG,YAA1C,CAKA,IADAsB,KACK1F,EAAI,EAAGA,EAAIuE,EAAQvE,GAAK,EAC3B2F,EAAI1B,EAAS2B,SAAS1B,EAASlE,GAC/B0F,EAAQG,MAAMF,EAAI,GAAK,IAAM,IAAMA,EAAE/G,SAAS,KAEhD,MAAO,oBAAsB8G,EAAQI,KAAK,KARxCnC,QAAQC,IAAI,gDAWhBhH,EAAUmJ,cAERC,GACEC,SAAU,SAAUhC,EAAUiC,GAC5B,OAAOjC,EAAS2B,SAASM,IAE3BzC,KAAM,GAGR0C,GACEF,SAAU,SAAUhC,EAAUiC,GAC5B,OAAOE,OAAOC,aAAapC,EAAS2B,SAASM,KAE/CzC,KAAM,EACN6C,OAAO,GAGTC,GACEN,SAAU,SAAUhC,EAAUiC,EAAYM,GACxC,OAAOvC,EAASK,UAAU4B,EAAYM,IAExC/C,KAAM,GAGRgD,GACER,SAAU,SAAUhC,EAAUiC,EAAYM,GACxC,OAAOvC,EAASyC,UAAUR,EAAYM,IAExC/C,KAAM,GAGRkD,GACEV,SAAU,SAAUhC,EAAUiC,EAAYM,GACxC,OACEvC,EAASyC,UAAUR,EAAYM,GAC/BvC,EAASyC,UAAUR,EAAa,EAAGM,IAGvC/C,KAAM,GAGRmD,GACEX,SAAU,SAAUhC,EAAUiC,EAAYM,GACxC,OAAOvC,EAAS4C,SAASX,EAAYM,IAEvC/C,KAAM,GAGRqD,IACEb,SAAU,SAAUhC,EAAUiC,EAAYM,GACxC,OACEvC,EAAS4C,SAASX,EAAYM,GAC9BvC,EAAS4C,SAASX,EAAa,EAAGM,IAGtC/C,KAAM,IAIV7G,EAAUmJ,aAAa,GAAKnJ,EAAUmJ,aAAa,GAEnDnJ,EAAUmK,aAAe,SACvB9C,EACA+C,EACA9C,EACA1F,EACA+F,EACAiC,GAEA,IACIS,EACAf,EACAgB,EACAlH,EACAmH,EACAC,EANAC,EAAUzK,EAAUmJ,aAAavH,GAOrC,GAAK6I,EAAL,CAWA,GAPAJ,EAAUI,EAAQ5D,KAAOc,KAGzB2B,EACEe,EAAU,EACND,EAAa/C,EAASyC,UAAUxC,EAAS,EAAGsC,GAC5CtC,EAAS,GACE+C,EAAUhD,EAASG,YAApC,CAIA,GAAe,IAAXG,EACF,OAAO8C,EAAQpB,SAAShC,EAAUiC,EAAYM,GAGhD,IADAU,KACKlH,EAAI,EAAGA,EAAIuE,EAAQvE,GAAK,EAC3BkH,EAAOlH,GAAKqH,EAAQpB,SAClBhC,EACAiC,EAAalG,EAAIqH,EAAQ5D,KACzB+C,GAGJ,GAAIa,EAAQf,MAAO,CAGjB,IAFAa,EAAM,GAEDnH,EAAI,EAAGA,EAAIkH,EAAO3C,QAGX,QAFV6C,EAAIF,EAAOlH,IADkBA,GAAK,EAMlCmH,GAAOC,EAET,OAAOD,EAET,OAAOD,EA3BLvD,QAAQC,IAAI,gDAXZD,QAAQC,IAAI,yCAyChBhH,EAAU0K,aAAe,SACvBrD,EACA+C,EACA9C,EACAsC,EACAzH,GAEA,IAAIwI,EAAMtD,EAASK,UAAUJ,EAAQsC,GACrCzH,EAAKyI,KAAKD,GAAO3K,EAAUmK,aACzB9C,EACA+C,EACA9C,EACAD,EAASK,UAAUJ,EAAS,EAAGsC,GAC/BvC,EAASyC,UAAUxC,EAAS,EAAGsC,GAC/BA,IAIJ5J,EAAU6K,cAAgB,SACxBxD,EACA+C,EACAU,EACAlB,EACAzH,GAEA,IAAI4I,EAAYC,EAAc5H,EAC9B,GAAI0H,EAAY,EAAIzD,EAASG,WAC3BT,QAAQC,IAAI,oDADd,CAMA,GAFA+D,EAAa1D,EAASK,UAAUoD,EAAWlB,MAC3CoB,EAAeF,EAAY,EAAI,GAAKC,GACjB,EAAI1D,EAASG,YAAhC,CAIA,IAAKpE,EAAI,EAAGA,EAAI2H,EAAY3H,GAAK,EAC/BR,KAAK8H,aACHrD,EACA+C,EACAU,EAAY,EAAI,GAAK1H,EACrBwG,EACAzH,GAIJ,OAAOkF,EAASyC,UAAUkB,EAAcpB,GAbtC7C,QAAQC,IAAI,gDAgBhBhH,EAAUiL,cAAgB,SAAU5D,EAAUC,EAAQK,EAAQxF,EAAMhC,GAClE,IAAIA,EAAQ+K,YAAZ,CAGA,IACItB,EACAkB,EACAK,EAHAf,EAAa9C,EAAS,GAK1B,GAAuC,aAAnCD,EAASyC,UAAUxC,EAAS,GAIhC,GAAI8C,EAAa,EAAI/C,EAASG,WAC5BT,QAAQC,IAAI,iDAId,GAAuC,IAAnCK,EAASK,UAAUJ,EAAS,GAAhC,CAKA,OAAQD,EAASK,UAAU0C,IACzB,KAAK,MACHR,GAAe,EACf,MACF,KAAK,MACHA,GAAe,EACf,MACF,QAEE,YADA7C,QAAQC,IAAI,qDAIyC,KAArDK,EAASK,UAAU0C,EAAa,EAAGR,IAKvCkB,EAAYzD,EAASyC,UAAUM,EAAa,EAAGR,GAE/CzH,EAAKyI,KAAO,IAAI5K,EAAUwI,SAG1BsC,EAAY9K,EAAU6K,cACpBxD,EACA+C,EACAA,EAAaU,EACblB,EACAzH,MAEgBhC,EAAQiL,uBACxBD,GAAkBP,SAClBE,EAAY9K,EAAU6K,cACpBxD,EACA+C,EACAA,EAAaU,EACblB,EACAuB,GAGEA,EAAcP,KAAK,OACrBzI,EAAKyI,KAAKS,UAAYrL,EAAU6I,iBAC9BxB,EACA+C,EAAae,EAAcP,KAAK,KAChCO,EAAcP,KAAK,QAKrBzI,EAAKyI,KAAK,SAAYzK,EAAQmL,gBAChCtL,EAAU6K,cACRxD,EACA+C,EACAA,EAAajI,EAAKyI,KAAK,OACvBhB,EACAzH,GAIAA,EAAKyI,KAAK,SAAYzK,EAAQoL,gBAChCvL,EAAU6K,cACRxD,EACA+C,EACAA,EAAajI,EAAKyI,KAAK,OACvBhB,EACAzH,IAnDF4E,QAAQC,IAAI,gDAjBZD,QAAQC,IAAI,uDA0EhBhH,EAAUsG,gBAAgBC,KAAK,OAAQ0C,KAAKjJ,EAAUiL,iBCzSvD,SAAWpI,GACV,aACsB,mBAAXN,QAAyBA,OAAOC,IAEzCD,QAAQ,eAAgB,qBAAsBM,GACnB,iBAAXJ,QAAuBA,OAAOC,QAC9CG,EAAQC,QAAQ,gBAAiBA,QAAQ,sBAGzCD,EAAQF,OAAO3C,WATlB,CAWE,SAAUA,GACX,aAEAA,EAAUwI,QAAQzG,UAAUyJ,MAI1BC,IAAQ,aACRC,IAAQ,cACRC,MAAQ,iBACRC,MAAQ,oBACRC,MAAQ,6BACRC,IAAQ,gBACRC,IAAQ,cACRC,IAAQ,4BACRC,IAAQ,cACRC,IAAQ,kBACRC,IAAQ,sBACRC,IAAQ,mBACRC,IAAQ,mBACRC,IAAQ,cACRC,IAAQ,cACRC,IAAQ,iBACRC,IAAQ,eACRC,IAAQ,eACRC,IAAQ,kBACRC,IAAQ,wBACRC,IAAQ,8BACRC,IAAQ,mBACRC,IAAQ,aACRC,IAAQ,wBACRC,IAAQ,oBACRC,IAAQ,sBACRC,IAAQ,WACRC,IAAQ,mBACRC,IAAQ,OACRC,IAAQ,QACRC,IAAQ,WACRC,IAAQ,SACRC,MAAQ,YAIRC,MAAQ,cACRC,MAAQ,kBACRC,MAAQ,aACRC,MAAQ,kBACRC,MAAQ,kBACRC,MAAQ,QACRC,MAAQ,0BACRC,MAAQ,yBACRC,MAAQ,YACRC,MAAQ,cACRC,MAAQ,mBACRC,MAAQ,mBACRC,MAAQ,oBACRC,MAAQ,aACRC,MAAQ,qBACRC,MAAQ,sBACRC,MAAQ,eACRC,MAAQ,UACRC,MAAQ,kBACRC,MAAQ,sBACRC,MAAQ,0BACRC,MAAQ,OACRC,MAAQ,kBACRC,MAAQ,4BACRC,MAAQ,2BACRC,MAAQ,WACRC,MAAQ,sBACRC,MAAQ,sBACRC,MAAQ,oBACRC,MAAQ,gBACRC,MAAQ,kBACRC,MAAQ,eACRC,MAAQ,mBACRC,MAAQ,kBACRC,MAAQ,eACRC,MAAQ,cACRC,MAAQ,QACRC,MAAQ,cACRC,MAAQ,cACRC,MAAQ,cACRC,MAAQ,2BACRC,MAAQ,wBACRC,MAAQ,wBACRC,MAAQ,2BACRC,MAAQ,kBACRC,MAAQ,gBACRC,MAAQ,gBACRC,MAAQ,aACRC,MAAQ,YACRC,MAAQ,aACRC,MAAQ,iBACRC,MAAQ,eACRC,MAAQ,eACRC,MAAQ,mBACRC,MAAQ,wBACRC,MAAQ,mBACRC,MAAQ,cACRC,MAAQ,WACRC,MAAQ,aACRC,MAAQ,YACRC,MAAQ,2BACRC,MAAQ,uBACRC,MAAQ,gBACRC,MAAQ,kBACRC,MAAQ,mBACRC,MAAQ,oBACRC,MAAQ,WACRC,MAAQ,YACRC,MAAQ,mBAIRC,EAAQ,eACR3I,EAAQ,iBACRG,EAAQ,cACRI,EAAQ,kBACRE,EAAQ,eACRE,EAAQ,iBACRiI,EAAQ,cACRC,EAAQ,eACRC,EAAQ,gBACRlI,EAAQ,YACRE,GAAQ,iBACRiI,GAAQ,SACRC,GAAQ,cACRC,GAAQ,WACRC,GAAQ,cACRC,GAAQ,WACRC,GAAQ,qBACRC,GAAQ,kBACRC,GAAQ,cACRC,GAAQ,qBACRC,GAAQ,kBACRC,GAAQ,sBACRC,GAAQ,mBACRC,GAAQ,oBACRC,GAAQ,iBACRC,GAAQ,qBACRC,GAAQ,kBACRC,GAAQ,sBACRC,GAAQ,qBACRC,GAAQ,eACRC,GAAQ,kBACRC,GAAQ,wBAGVvT,EAAUwI,QAAQzG,UAAUyR,cAC1BC,iBACE1B,EAAG,YACH3I,EAAG,SACHG,EAAG,iBACHI,EAAG,oBACHE,EAAG,mBACHE,EAAG,mBACHiI,EAAG,iBACHC,EAAG,gBACHC,EAAG,kBAELwB,cACE3B,EAAG,UACH3I,EAAG,UACHG,EAAG,wBACHI,EAAG,OACHE,EAAG,YACHE,EAAG,UACHiI,EAAG,UACH2B,IAAK,SAEPC,aACE7B,EAAG,UACH3I,EAAG,WACHG,EAAG,cACHI,EAAG,gCACHE,EAAG,QACHG,EAAG,eACHE,GAAI,iBACJiI,GAAI,QACJC,GAAI,wCACJC,GAAI,yCACJC,GAAI,0CACJC,GAAI,sCACJE,GAAI,mBACJC,GAAI,mBACJC,GAAI,mBACJC,GAAI,MACJC,GAAI,MACJC,GAAI,MACJC,GAAI,MACJC,GAAI,sBACJW,IAAK,SAEPE,OACE9B,EAAQ,qBACR3I,EAAQ,cACRW,EAAQ,mCACRkI,EAAQ,+BACRjI,EAAQ,qCACRqI,GAAQ,gEACRE,GAAQ,4DACRC,GAAQ,4CACRQ,GAAQ,gCACRC,GAAQ,yBACRI,GAAQ,oDACRE,GAAQ,gDACRO,GAAQ,oBACRC,GAAQ,sCACRC,GAAQ,iEACRC,GAAQ,6DACRC,GAAQ,6DACRC,GAAQ,wFACRC,GAAQ,oFACRC,GAAQ,iDACRC,GAAQ,4EACRC,GAAQ,yEAEVC,eACEpL,EAAG,YACHG,EAAG,6BACHI,EAAG,6BACHE,EAAG,+BACHE,EAAG,+BACHkI,EAAG,mBACHC,EAAG,kCAELuC,kBACE1C,EAAG,WACH3I,EAAG,YACHG,EAAG,WACHI,EAAG,eAEL+K,WACEtL,EAAG,yBAELuL,gBACE5C,EAAG,iBACH3I,EAAG,kBAELwL,cACE7C,EAAG,qBACH3I,EAAG,wBAELyL,aACE9C,EAAG,OACH3I,EAAG,cACHG,EAAG,eACHI,EAAG,gBACHE,EAAG,kBAELiL,UACE/C,EAAG,SACH3I,EAAG,OACHG,EAAG,QAELwL,YACEhD,EAAG,SACH3I,EAAG,iBACHG,EAAG,mBAELyL,WACEjD,EAAG,SACH3I,EAAG,OACHG,EAAG,QAEL0L,sBACElD,EAAG,UACH3I,EAAG,QACHG,EAAG,aACHI,EAAG,gBAELuL,YACEvL,EAAG,OAELwL,yBACEpD,EAAG,GACH3I,EAAG,IACHG,EAAG,KACHI,EAAG,KACHE,EAAG,IACHE,EAAG,IACHiI,EAAG,KAELtJ,aACEU,EAAG,WACHG,EAAG,YACHI,EAAG,eACHE,EAAG,cACHE,EAAG,WACHiI,EAAG,YACHC,EAAG,eACHC,EAAG,gBAIPlS,EAAUwI,QAAQzG,UAAUqT,QAAU,SAAUxM,GAC9C,IAAIyM,EAAQzS,KAAK+F,IAAIC,GACrB,OAAQA,GACN,IAAK,cACL,IAAK,QACL,IAAK,eACL,IAAK,kBACL,IAAK,gBACL,IAAK,mBACL,IAAK,YACL,IAAK,iBACL,IAAK,eACL,IAAK,cACL,IAAK,WACL,IAAK,aACL,IAAK,YACL,IAAK,uBACL,IAAK,aACL,IAAK,cACH,OAAOhG,KAAK4Q,aAAa5K,GAAIyM,GAC/B,IAAK,cACL,IAAK,kBACH,IAAKA,EAAO,OACZ,OAAO7L,OAAOC,aAAa4L,EAAM,GAAIA,EAAM,GAAIA,EAAM,GAAIA,EAAM,IACjE,IAAK,0BACH,IAAKA,EAAO,OACZ,OACEzS,KAAK4Q,aAAa5K,GAAIyM,EAAM,IAC5BzS,KAAK4Q,aAAa5K,GAAIyM,EAAM,IAC5BzS,KAAK4Q,aAAa5K,GAAIyM,EAAM,IAC5BzS,KAAK4Q,aAAa5K,GAAIyM,EAAM,IAEhC,IAAK,eACH,IAAKA,EAAO,OACZ,OAAOA,EAAM,GAAK,IAAMA,EAAM,GAAK,IAAMA,EAAM,GAAK,IAAMA,EAAM,GAEpE,OAAO7L,OAAO6L,IAEf,SAAWC,GACV,IAEIC,EAFA/J,EAAO8J,EAAiB9J,KACxB/C,EAAM6M,EAAiB7M,IAG3B,IAAK8M,KAAQ/J,EACPA,EAAKhI,eAAe+R,KACtB9M,EAAI+C,EAAK+J,IAASA,GAPvB,CAUEvV,EAAUwI,QAAQzG,WAErB/B,EAAUwI,QAAQzG,UAAUyT,OAAS,WACnC,IACID,EACA3M,EAFAH,KAGJ,IAAK8M,KAAQ3S,KACPA,KAAKY,eAAe+R,KACtB3M,EAAKhG,KAAK4I,KAAK+J,MAEb9M,EAAIG,GAAMhG,KAAKwS,QAAQxM,IAI7B,OAAOH,KCpXV,SAAW5F,GACV,aACsB,mBAAXN,QAAyBA,OAAOC,IAEzCD,QAAQ,eAAgB,qBAAsB,qBAAsBM,GACzC,iBAAXJ,QAAuBA,OAAOC,QAC9CG,EACEC,QAAQ,gBACRA,QAAQ,sBACRA,QAAQ,sBAIVD,EAAQF,OAAO3C,WAblB,CAeE,SAAUA,GACX,aAEA,IAAIyV,EAA0BzV,EAAU0E,gBACpCgR,EAAwB1V,EAAUgI,cAClC2N,EAA+B3V,EAAUiD,qBACzC2S,EAAgC5V,EAAUkD,sBAG9ClD,EAAU0E,gBAAkB,SAAUvE,GACpC,QACIA,EAAQ0V,aAAeJ,EAAwBxT,KAAKjC,EAAWG,IAKrEH,EAAUgI,cAAgB,SAAU7H,GAClC,OACGA,IAAmC,IAAxBA,EAAQ0V,aACpBH,EAAsBzT,KAAKjC,EAAWG,IAM1CH,EAAUiD,qBAAuB,SAAUc,EAAQ5D,GACjDwV,EAA6B1T,KAAKjC,EAAW+D,EAAQ5D,GACrD,IAAI2V,EAAM/R,EAAOS,WAAW,MACxBnB,EAAQU,EAAOV,MACfC,EAASS,EAAOT,OAChByS,EAAahS,EAAO8B,MAAMxC,MAC1B2S,EAAcjS,EAAO8B,MAAMvC,OAC3BuS,EAAc1V,EAAQ0V,YAC1B,GAAKA,KAAeA,EAAc,GASlC,OANIA,EAAc,IAChB9R,EAAOV,MAAQC,EACfS,EAAOT,OAASD,EAChBU,EAAO8B,MAAMxC,MAAQ2S,EACrBjS,EAAO8B,MAAMvC,OAASyS,GAEhBF,GACN,KAAK,EAEHC,EAAIG,UAAU5S,EAAO,GACrByS,EAAI9S,OAAO,EAAG,GACd,MACF,KAAK,EAEH8S,EAAIG,UAAU5S,EAAOC,GACrBwS,EAAII,OAAOtR,KAAKuR,IAChB,MACF,KAAK,EAEHL,EAAIG,UAAU,EAAG3S,GACjBwS,EAAI9S,MAAM,GAAI,GACd,MACF,KAAK,EAEH8S,EAAII,OAAO,GAAMtR,KAAKuR,IACtBL,EAAI9S,MAAM,GAAI,GACd,MACF,KAAK,EAEH8S,EAAII,OAAO,GAAMtR,KAAKuR,IACtBL,EAAIG,UAAU,GAAI3S,GAClB,MACF,KAAK,EAEHwS,EAAII,OAAO,GAAMtR,KAAKuR,IACtBL,EAAIG,UAAU5S,GAAQC,GACtBwS,EAAI9S,OAAO,EAAG,GACd,MACF,KAAK,EAEH8S,EAAII,QAAQ,GAAMtR,KAAKuR,IACvBL,EAAIG,WAAW5S,EAAO,KAO5BrD,EAAUkD,sBAAwB,SAAU7C,EAAK+V,EAAMjU,GACrD,IAEIgB,EACAC,EAHAjD,EAAUyV,EAA8B3T,KAAKjC,EAAWK,EAAK+V,GAC7DP,EAAc1V,EAAQ0V,YAM1B,IAHoB,IAAhBA,GAAwB1T,GAAQA,EAAKyI,OACvCiL,EAAc1T,EAAKyI,KAAKjC,IAAI,iBAEzBkN,GAAeA,EAAc,GAAqB,IAAhBA,EACrC,OAAO1V,EAETgD,KACA,IAAKC,KAAKjD,EACJA,EAAQqD,eAAeJ,KACzBD,EAAWC,GAAKjD,EAAQiD,IAI5B,OADAD,EAAW0S,YAAcA,EACjBA,GACN,KAAK,EAEH1S,EAAWmC,KAAOnF,EAAQsF,MAC1BtC,EAAWsC,MAAQtF,EAAQmF,KAC3B,MACF,KAAK,EAEHnC,EAAWmC,KAAOnF,EAAQsF,MAC1BtC,EAAWoC,IAAMpF,EAAQuF,OACzBvC,EAAWsC,MAAQtF,EAAQmF,KAC3BnC,EAAWuC,OAASvF,EAAQoF,IAC5B,MACF,KAAK,EAEHpC,EAAWoC,IAAMpF,EAAQuF,OACzBvC,EAAWuC,OAASvF,EAAQoF,IAC5B,MACF,KAAK,EAEHpC,EAAWmC,KAAOnF,EAAQoF,IAC1BpC,EAAWoC,IAAMpF,EAAQmF,KACzBnC,EAAWsC,MAAQtF,EAAQuF,OAC3BvC,EAAWuC,OAASvF,EAAQsF,MAC5B,MACF,KAAK,EAEHtC,EAAWmC,KAAOnF,EAAQoF,IAC1BpC,EAAWoC,IAAMpF,EAAQsF,MACzBtC,EAAWsC,MAAQtF,EAAQuF,OAC3BvC,EAAWuC,OAASvF,EAAQmF,KAC5B,MACF,KAAK,EAEHnC,EAAWmC,KAAOnF,EAAQuF,OAC1BvC,EAAWoC,IAAMpF,EAAQsF,MACzBtC,EAAWsC,MAAQtF,EAAQoF,IAC3BpC,EAAWuC,OAASvF,EAAQmF,KAC5B,MACF,KAAK,EAEHnC,EAAWmC,KAAOnF,EAAQuF,OAC1BvC,EAAWoC,IAAMpF,EAAQmF,KACzBnC,EAAWsC,MAAQtF,EAAQoF,IAC3BpC,EAAWuC,OAASvF,EAAQsF,MAWhC,OARItC,EAAW0S,YAAc,IAC3B1S,EAAWS,SAAWzD,EAAQ0D,UAC9BV,EAAWU,UAAY1D,EAAQyD,SAC/BT,EAAW2B,SAAW3E,EAAQ4E,UAC9B5B,EAAW4B,UAAY5E,EAAQ2E,SAC/B3B,EAAWe,YAAc/D,EAAQgE,aACjChB,EAAWgB,aAAehE,EAAQ+D,aAE7Bf"}
\ No newline at end of file
diff --git a/imgur.html b/imgur.html
new file mode 100644
index 0000000..2c7b526
--- /dev/null
+++ b/imgur.html
@@ -0,0 +1,131 @@
+
+
+
+
+ IMGUR TEST
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..52f065a
--- /dev/null
+++ b/index.html
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+ CloudNV
+
+
+
+
+
+
+
+
+