(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{25:function(e,t,n){e.exports=function(){return new Worker(n.p+"e7446815748fd1b8359c.worker.js")}},30:function(e,t,n){e.exports=n(62)},36:function(e,t,n){},37:function(e,t,n){},62:function(e,t,n){"use strict";n.r(t);var a=n(0),o=n.n(a),r=n(21),s=n.n(r),i=(n(36),Boolean("localhost"===window.location.hostname||"[::1]"===window.location.hostname||window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/)));function c(e,t){navigator.serviceWorker.register(e).then(function(e){e.onupdatefound=function(){var n=e.installing;null!=n&&(n.onstatechange=function(){"installed"===n.state&&(navigator.serviceWorker.controller?(console.log("New content is available and will be used when all tabs for this page are closed. See https://bit.ly/CRA-PWA."),t&&t.onUpdate&&t.onUpdate(e)):(console.log("Content is cached for offline use."),t&&t.onSuccess&&t.onSuccess(e)))})}}).catch(function(e){console.error("Error during service worker registration:",e)})}var u=n(6),l=n(22),d=n(23),h=n(27),f=n(24),v=n(5),p=n(28),m=n(29),g=(n(37),n(7)),b=n.n(g),y=n(11),w=n(9),k=n(1),x=n.n(k),E=n(4),M=n(2),C=n(25),D=n.n(C);var T=n(26),B=n.n(T),P=50274091;function L(e,t){return S.apply(this,arguments)}function S(){return(S=Object(M.a)(x.a.mark(function e(t,n){var a,o,r;return x.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(!(a=n.files.get("spawn.mpq"))||a.byteLength===P){e.next=6;break}return n.files.delete("spawn.mpq"),e.next=5,n.delete("spawn.mpq");case 5:a=null;case 6:if(a){e.next=15;break}return e.next=9,B.a.request({url:"/diabloweb/spawn.mpq",responseType:"arraybuffer",onDownloadProgress:function(e){t.onProgress&&t.onProgress({text:"Downloading...",loaded:e.loaded,total:e.total||P})},headers:{"Cache-Control":"max-age=31536000"}});case 9:if((o=e.sent).data.byteLength===P){e.next=12;break}throw Error("Invalid spawn.mpq size. Try clearing cache and refreshing the page.");case 12:r=new Uint8Array(o.data),n.files.set("spawn.mpq",r),n.update("spawn.mpq",r.slice());case 15:return e.abrupt("return",n);case 16:case"end":return e.stop()}},e)}))).apply(this,arguments)}function _(e,t,n){var a=n.bitmap,o=n.images,r=n.text,s=n.clip,i=n.belt;if(a)t.transferFromImageBitmap(a);else{var c=!0,u=!1,l=void 0;try{for(var d,h=o[Symbol.iterator]();!(c=(d=h.next()).done);c=!0){var f=d.value,v=f.x,p=f.y,m=f.w,g=f.h,b=f.data,y=t.createImageData(m,g);y.data.set(b),t.putImageData(y,v,p)}}catch(K){u=!0,l=K}finally{try{c||null==h.return||h.return()}finally{if(u)throw l}}if(r.length){if(t.save(),t.font="bold 13px Times New Roman",s){var w=s.x0,k=s.y0,x=s.x1,E=s.y1;t.beginPath(),t.rect(w,k,x-w,E-k),t.clip()}var M=!0,C=!1,D=void 0;try{for(var T,B=r[Symbol.iterator]();!(M=(T=B.next()).done);M=!0){var P=T.value,L=P.x,S=P.y,_=P.text,A=P.color,j=A>>16&255,O=A>>8&255,N=255&A;t.fillStyle="rgb(".concat(j,", ").concat(O,", ").concat(N,")"),t.fillText(_,L,S+22)}}catch(K){C=!0,D=K}finally{try{M||null==B.return||B.return()}finally{if(C)throw D}}t.restore()}}e.updateBelt(i)}function A(){return(A=Object(M.a)(x.a.mark(function e(t,n,a){var o,r,s,i;return x.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.fs;case 2:if(o=e.sent,r=!0,!a){e.next=8;break}a.name.match(/^spawn\.mpq$/i)||(r=!1,o.files.delete("spawn.mpq")),e.next=10;break;case 8:return e.next=10,L(t,o);case 10:return s=null,i=!1,s=t.canvas.getContext("2d",{alpha:!1}),e.next=14,new Promise(function(e,c){try{var l=new D.a;l.addEventListener("message",function(a){var r=a.data;switch(r.action){case"loaded":e(function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a=32&&1===e.key.length&&!n.showKeyboard&&n.game("DApi_Char",e.key.charCodeAt(0)),n.clearKeySel(),n.showKeyboard||(8===e.keyCode||e.keyCode>=112&&e.keyCode<=119)&&e.preventDefault())},n.onMenu=function(e){e.preventDefault()},n.onKeyUp=function(e){n.canvas&&(n.game("DApi_Key",1,n.eventMods(e),e.keyCode),n.clearKeySel())},n.onKeyboard=function(){if(n.showKeyboard){var e,t=n.keyboard.value,a=(t.match(/[\x20-\x7E]/g)||[]).join("").substring(0,15);t!==a&&(n.keyboard.value=a),n.clearKeySel();var o=Object(u.a)(Array(15)).map(function(e,t){return t0&&n.start(t[0])},n.touchButton=null,n.touchCanvas=null,n.onFullscreenChange=function(){n.setState({touch:document.fullscreenElement===n.element})},n.onTouchStart=function(e){if(n.canvas&&(e.preventDefault(),n.updateTouchButton(e.touches,!1))){var t=n.mousePos(n.touchCanvas),a=t.x,o=t.y;n.game("DApi_Mouse",0,0,n.eventMods(e),a,o),n.touchMods[N]||n.game("DApi_Mouse",1,n.touchMods[K]?2:1,n.eventMods(e),a,o)}},n.onTouchMove=function(e){if(n.canvas&&(e.preventDefault(),n.updateTouchButton(e.touches,!1))){var t=n.mousePos(n.touchCanvas),a=t.x,o=t.y;n.game("DApi_Mouse",0,0,n.eventMods(e),a,o)}},n.onTouchEnd=function(e){if(n.canvas){e.preventDefault();var t=n.touchCanvas;if(n.updateTouchButton(e.touches,!0),t&&!n.touchCanvas){var a=n.mousePos(t),o=a.x,r=a.y;n.game("DApi_Mouse",2,1,n.eventMods(e),o,r),n.game("DApi_Mouse",2,2,n.eventMods(e),o,r),!n.touchMods[K]||n.touchButton&&n.touchButton.index===K||n.setTouchButton(K,!1)}document.fullscreenElement||n.element.requestFullscreen()}},n.setCanvas=function(e){return n.canvas=e},n.setElement=function(e){return n.element=e},n.setKeyboard=function(e){return n.keyboard=e},n.setTouch0=n.setTouch_.bind(Object(v.a)(n),0),n.setTouch1=n.setTouch_.bind(Object(v.a)(n),1),n.setTouch2=n.setTouch_.bind(Object(v.a)(n),2),n.setTouch3=n.setTouchBelt_.bind(Object(v.a)(n),3),n.setTouch4=n.setTouchBelt_.bind(Object(v.a)(n),4),n.setTouch5=n.setTouchBelt_.bind(Object(v.a)(n),5),n}return Object(p.a)(t,e),Object(d.a)(t,[{key:"componentDidMount",value:function(){var e=this;document.addEventListener("drop",this.onDrop,!0),document.addEventListener("dragover",this.onDragOver,!0),document.addEventListener("dragenter",this.onDragEnter,!0),document.addEventListener("dragleave",this.onDragLeave,!0),this.fs.then(function(t){var n=t.files.get("spawn.mpq");n&&n.byteLength===P&&e.setState({has_spawn:!0})})}},{key:"setDropping",value:function(e){this.setState(function(t){var n=t.dropping;return{dropping:Math.max(n+e,0)}})}},{key:"onError",value:function(e,t){this.setState(function(n){return!n.error&&{error:{message:e,stack:t}}})}},{key:"openKeyboard",value:function(e){e?(this.showKeyboard=!0,this.element.classList.add("keyboard"),this.keyboard.focus()):(this.showKeyboard=!1,this.element.classList.remove("keyboard"),this.keyboard.blur())}},{key:"setCursorPos",value:function(e,t){var n=this,a=this.canvas.getBoundingClientRect();this.cursorPos={x:a.left+(a.right-a.left)*e/640,y:a.top+(a.bottom-a.top)*t/480},setTimeout(function(){n.game("DApi_Mouse",0,0,0,e,t)})}},{key:"onProgress",value:function(e){this.setState({progress:e})}},{key:"onExit",value:function(){this.state.error||window.location.reload()}},{key:"setCurrentSave",value:function(e){this.saveName=e}},{key:"drawBelt",value:function(e,t){this.canvas&&this.touchButtons[e]&&(this.touchBelt[e]=t,t>=0?(this.touchButtons[e].style.display="block",this.touchCtx[e].drawImage(this.canvas,205+29*t,357,28,28,0,0,28,28)):this.touchButtons[e].style.display="none")}},{key:"updateBelt",value:function(e){if(e){for(var t=new Set,n=3,a=0;a=0&&!t.has(e[a])&&(this.drawBelt(n++,a),t.add(e[a]));for(;n<6;++n)this.drawBelt(n,-1)}else this.drawBelt(3,-1),this.drawBelt(4,-1),this.drawBelt(5,-1)}},{key:"start",value:function(e){var t=this;if(e&&e.name.match(/\.sv$/i))this.fs.then(function(t){return t.upload(e)}).then(console.log("Updated ".concat(e.name)));else{document.removeEventListener("drop",this.onDrop,!0),document.removeEventListener("dragover",this.onDragOver,!0),document.removeEventListener("dragenter",this.onDragEnter,!0),document.removeEventListener("dragleave",this.onDragLeave,!0),this.setState({dropping:0});var n=!(!e||!e.name.match(/^diabdat\.mpq$/i));y.a.event({category:"Game",action:n?"Start Retail":"Start Shareware"}),this.setState({loading:!0,retail:n}),j(this,e).then(function(e){t.game=e,document.addEventListener("mousemove",t.onMouseMove,!0),document.addEventListener("mousedown",t.onMouseDown,!0),document.addEventListener("mouseup",t.onMouseUp,!0),document.addEventListener("keydown",t.onKeyDown,!0),document.addEventListener("keyup",t.onKeyUp,!0),document.addEventListener("contextmenu",t.onMenu,!0),document.addEventListener("touchstart",t.onTouchStart,{passive:!1,capture:!0}),document.addEventListener("touchmove",t.onTouchMove,{passive:!1,capture:!0}),document.addEventListener("touchend",t.onTouchEnd,{passive:!1,capture:!0}),document.addEventListener("pointerlockchange",t.onPointerLockChange),document.addEventListener("fullscreenchange",t.onFullscreenChange),window.addEventListener("resize",t.onResize),t.setState({started:!0})},function(e){return t.onError(e.message,e.stack)})}}},{key:"pointerLocked",value:function(){return document.pointerLockElement===this.canvas||document.mozPointerLockElement===this.canvas}},{key:"mousePos",value:function(e){var t=this.canvas.getBoundingClientRect();return this.pointerLocked()?(this.cursorPos.x=Math.max(t.left,Math.min(t.right,this.cursorPos.x+e.movementX)),this.cursorPos.y=Math.max(t.top,Math.min(t.bottom,this.cursorPos.y+e.movementY))):this.cursorPos={x:e.clientX,y:e.clientY},{x:Math.max(0,Math.min(Math.round((this.cursorPos.x-t.left)/(t.right-t.left)*640),639)),y:Math.max(0,Math.min(Math.round((this.cursorPos.y-t.top)/(t.bottom-t.top)*480),479))}}},{key:"mouseButton",value:function(e){switch(e.button){case 0:return 1;case 1:return 4;case 2:return 2;case 3:return 5;case 4:return 6;default:return 1}}},{key:"eventMods",value:function(e){return(e.shiftKey||this.touchMods[2]?1:0)+(e.ctrlKey?2:0)+(e.altKey?4:0)+(e.touches?8:0)}},{key:"clearKeySel",value:function(){if(this.showKeyboard){var e=this.keyboard.value.length;this.keyboard.setSelectionRange(e,e)}}},{key:"setTouchMod",value:function(e,t,n){if(e<3)this.touchMods[e]=t,this.touchButtons[e]&&this.touchButtons[e].classList.toggle("active",t);else if(n&&this.touchBelt[e]>=0){var a=performance.now();(!this.beltTime||a-this.beltTime>750)&&(this.game("DApi_Char",49+this.touchBelt[e]),this.beltTime=a)}}},{key:"updateTouchButton",value:function(e,t){var n=this,a=null,o=this.touchButton,r=!0,s=!1,i=void 0;try{for(var c,l=function(){var t=c.value,r=t.target,s=t.identifier,i=t.clientX,l=t.clientY;if(o&&o.id===s&&n.touchButtons[o.index]===r)return e.length>1&&(o.stick=!1),o.clientX=i,o.clientY=l,n.touchCanvas=Object(u.a)(e).find(function(e){return e.identifier!==s}),n.touchCanvas&&(n.touchCanvas={clientX:n.touchCanvas.clientX,clientY:n.touchCanvas.clientY}),delete n.panPos,{v:null!=n.touchCanvas};var d=n.touchButtons.indexOf(r);d>=0&&!a&&(a={id:s,index:d,stick:!0,original:n.touchMods[d],clientX:i,clientY:l})},d=e[Symbol.iterator]();!(r=(c=d.next()).done);r=!0){var h=l();if("object"===typeof h)return h.v}}catch(x){s=!0,i=x}finally{try{r||null==d.return||d.return()}finally{if(s)throw i}}if(o&&!a&&t&&o.stick){var f=this.touchButtons[o.index].getBoundingClientRect(),v=o.clientX,p=o.clientY;v>=f.left&&v=f.top&&pk)b=Math.abs(y)>Math.abs(w)?y>0?37:39:w>0?38:40,this.game("DApi_Key",0,0,b),this.panPos={x:m,y:g}}else this.game("DApi_Mouse",0,0,24,320,180),this.game("DApi_Mouse",2,1,24,320,180),this.panPos={x:m,y:g};return this.touchCanvas=null,!1}delete this.panPos}return this.touchCanvas=Object(u.a)(e).find(function(e){return!a||e.identifier!==a.id}),this.touchCanvas&&(this.touchCanvas={clientX:this.touchCanvas.clientX,clientY:this.touchCanvas.clientY}),null!=this.touchCanvas}},{key:"setTouch_",value:function(e,t){this.touchButtons[e]=t}},{key:"setTouchBelt_",value:function(e,t){if(this.touchButtons[e]=t,t){var n=document.createElement("canvas");n.width=28,n.height=28,t.appendChild(n),this.touchCtx[e]=n.getContext("2d")}else this.touchCtx[e]=null}},{key:"render",value:function(){var e=this,t=this.state,n=t.started,a=t.loading,r=t.error,s=t.progress,i=t.dropping,c=t.touch,u=t.has_spawn;return o.a.createElement("div",{className:b()("App",{touch:c,started:n,dropping:i,keyboard:this.showKeyboard}),ref:this.setElement},o.a.createElement("div",{className:"touch-ui touch-mods"},o.a.createElement("div",{className:b()("touch-button","touch-button-0",{active:this.touchMods[0]}),ref:this.setTouch0}),o.a.createElement("div",{className:b()("touch-button","touch-button-1",{active:this.touchMods[1]}),ref:this.setTouch1}),o.a.createElement("div",{className:b()("touch-button","touch-button-2",{active:this.touchMods[2]}),ref:this.setTouch2})),o.a.createElement("div",{className:"touch-ui touch-belt"},o.a.createElement("div",{className:b()("touch-button","touch-button-0"),ref:this.setTouch3}),o.a.createElement("div",{className:b()("touch-button","touch-button-1"),ref:this.setTouch4}),o.a.createElement("div",{className:b()("touch-button","touch-button-2"),ref:this.setTouch5})),o.a.createElement("div",{className:"Body"},!r&&o.a.createElement("canvas",{ref:this.setCanvas,width:640,height:480}),o.a.createElement("input",{type:"text",className:"keyboard",onChange:this.onKeyboard,ref:this.setKeyboard,spellCheck:!1})),o.a.createElement("div",{className:"BodyV"},!!r&&o.a.createElement(R,{className:"error",href:O(r,this.state.retail)},o.a.createElement("p",{className:"header"},"The following error has occurred:"),o.a.createElement("p",{className:"body"},r.message),o.a.createElement("p",{className:"footer"},"Click to create an issue on GitHub"),null!=this.saveName&&o.a.createElement("p",{className:"link",onClick:this.downloadSave},"Download save file")),!!a&&!n&&!r&&o.a.createElement("div",{className:"loading"},s&&s.text||"Loading...",null!=s&&!!s.total&&o.a.createElement("span",{className:"progressBar"},o.a.createElement("span",null,o.a.createElement("span",{style:{width:"".concat(Math.round(100*s.loaded/s.total),"%")}})))),!n&&!a&&!r&&o.a.createElement("div",{className:"start"},o.a.createElement("p",null,"This is a web port of the original Diablo game, based on source code reconstructed by GalaXyHaXz and devilution team: ",o.a.createElement(R,{href:"https://github.com/diasurgical/devilution"},"https://github.com/diasurgical/devilution")),o.a.createElement("p",null,"If you own the original game, you can drop the original DIABDAT.MPQ onto this page or click the button below to start playing. The game can be purchased from ",o.a.createElement(R,{href:"https://www.gog.com/game/diablo"},"GoG"),"."),!u&&o.a.createElement("p",null,"Or you can play the shareware version for free (50MB download)."),o.a.createElement("form",null,o.a.createElement("label",{htmlFor:"loadFile",className:"startButton"},"Select MPQ"),o.a.createElement("input",{accept:".mpq",type:"file",id:"loadFile",style:{display:"none"},onChange:this.parseFile})),o.a.createElement("span",{className:"startButton",onClick:function(){return e.start()}},"Play Shareware"))))}}]),t}(o.a.Component);s.a.render(o.a.createElement(U,null),document.getElementById("root")),function(e){if("serviceWorker"in navigator){if(new URL("/diabloweb",window.location.href).origin!==window.location.origin)return;window.addEventListener("load",function(){var t="".concat("/diabloweb","/service-worker.js");i?(function(e,t){fetch(e).then(function(n){var a=n.headers.get("content-type");404===n.status||null!=a&&-1===a.indexOf("javascript")?navigator.serviceWorker.ready.then(function(e){e.unregister().then(function(){window.location.reload()})}):c(e,t)}).catch(function(){console.log("No internet connection found. App is running in offline mode.")})}(t,e),navigator.serviceWorker.ready.then(function(){console.log("This web app is being served cache-first by a service worker. To learn more, visit https://bit.ly/CRA-PWA")})):c(t,e)})}}()},9:function(e,t,n){"use strict";n.d(t,"a",function(){return g});var a=n(4),o=n(1),r=n.n(o),s=n(2),i=n(10),c=n.n(i),u=function(){return new Promise(function(e,t){var n=!1,a=document.createElement("iframe");window.addEventListener("message",function(t){var o=t.data;"storage"!==o.method||n||(n=!0,e(o.files),a.contentWindow.postMessage({method:"clear"},"*"))}),a.addEventListener("load",function(){a.contentWindow.postMessage({method:"transfer"},"*")}),a.addEventListener("error",function(){n||(n=!0,e(null))}),a.src="https://diablo.rivsoft.net/storage.html",a.style.display="none",document.body.appendChild(a),setTimeout(function(){n||(n=!0,e(null))},1e4)})};function l(e,t){return d.apply(this,arguments)}function d(){return(d=Object(s.a)(r.a.mark(function e(t,n){var a,o,s,i;return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,t.get(n.toLowerCase());case 2:(a=e.sent)?(o=new Blob([a],{type:"binary/octet-stream"}),s=URL.createObjectURL(o),(i=document.createElement("a")).setAttribute("href",s),i.setAttribute("download",n),document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(s)):console.error("File ".concat(n," does not exist"));case 4:case"end":return e.stop()}},e)}))).apply(this,arguments)}function h(e){return f.apply(this,arguments)}function f(){return(f=Object(s.a)(r.a.mark(function e(t){var n,a,o,s,i,c;return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return n=!0,a=!1,o=void 0,e.prev=3,e.next=6,t.keys();case 6:e.t0=Symbol.iterator,s=e.sent[e.t0]();case 8:if(n=(i=s.next()).done){e.next=14;break}(c=i.value).match(/\.sv$/i)&&l(t,c);case 11:n=!0,e.next=8;break;case 14:e.next=20;break;case 16:e.prev=16,e.t1=e.catch(3),a=!0,o=e.t1;case 20:e.prev=20,e.prev=21,n||null==s.return||s.return();case 23:if(e.prev=23,!a){e.next=26;break}throw o;case 26:return e.finish(23);case 27:return e.finish(20);case 28:case"end":return e.stop()}},e,null,[[3,16,20,28],[21,,23,27]])}))).apply(this,arguments)}var v=function(e){return new Promise(function(t,n){var a=new FileReader;a.onload=function(){return t(a.result)},a.onerror=function(){return n(a.error)},a.onabort=function(){return n()},a.readAsArrayBuffer(e)})};function p(e,t,n){return m.apply(this,arguments)}function m(){return(m=Object(s.a)(r.a.mark(function e(t,n,a){var o;return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=Uint8Array,e.next=3,v(a);case 3:return e.t1=e.sent,o=new e.t0(e.t1),n.set(a.name.toLowerCase(),o),e.abrupt("return",t.set(a.name.toLowerCase(),o));case 7:case"end":return e.stop()}},e)}))).apply(this,arguments)}function g(e){return b.apply(this,arguments)}function b(){return(b=Object(s.a)(r.a.mark(function e(t){var n,o,s,i,d,f,v,m,g,b,y,w,k,x,E,M,C,D;return r.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,n=new c.a("diablo_fs"),o=new Map,s=0,e.t0=Object,e.next=7,n.json();case 7:e.t1=e.sent,i=e.t0.entries.call(e.t0,e.t1);case 9:if(!(s