g(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D=\"function\"===typeof setTimeout?setTimeout:null,E=\"function\"===typeof clearTimeout?clearTimeout:null,F=\"undefined\"!==typeof setImmediate?setImmediate:null;\n\"undefined\"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if(\"function\"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Qa||125d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"static/js/\" + chunkId + \".\" + \"a5d059c7\" + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"tic-tac-toe:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/tic-tac-toe/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunktic_tac_toe\"] = self[\"webpackChunktic_tac_toe\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","import React, { useState, useEffect } from 'react';\r\nimport './Button.css';\r\n\r\nconst Button = ({ id, value, onClick, playing,playAgainOrRestartClicked,gameOver }) => {\r\n const [clicked, setClicked] = useState(false);\r\n\r\n useEffect(() => {\r\n setClicked(false);\r\n }, [playAgainOrRestartClicked]);\r\n\r\n const handleClick = () => {\r\n setClicked(true);\r\n onClick();\r\n };\r\n\r\n return (\r\n \r\n );\r\n};\r\n\r\nexport default Button;\r\n","import React from 'react'\r\nimport './Board.css'\r\nimport Button from '../Button/Button'\r\n\r\nconst Board = ({board,onClick,playing,playAgainOrRestartClicked,gameOver}) => {\r\n return (\r\n \r\n {board.map((item, id) => (\r\n
\r\n
\r\n ))}\r\n
\r\n );\r\n}\r\n\r\nexport default Board\r\n","import React from 'react'\r\nimport './ScoreBoard.css'\r\n\r\nconst ScoreBoard = ({xScore,oScore,tieScore,playing}) => {\r\n return (\r\n \r\n
\r\n
X
\r\n
Score - {xScore}
\r\n
\r\n
\r\n
O
\r\n
Score - {oScore}
\r\n
\r\n
\r\n
Draw
\r\n
Ties - {tieScore}
\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default ScoreBoard\r\n","import React from 'react';\r\nimport './Modal.css'; \r\n\r\nconst Modal = ({ message,onPlayAgain,onRestartGame}) => {\r\n return (\r\n \r\n
\r\n
\r\n {message === \"tie\" ?
Draw!
:
Winner!
}\r\n
\r\n {message === \"X\" ? \r\n : \r\n message === \"O\" ? : \r\n <>\r\n \r\n \r\n >}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Modal;\r\n","import React from 'react';\n\nimport useOnMount from './use-on-mount';\n\nimport { HookOptions, PlayOptions, PlayFunction, ReturnedValue } from './types';\n\nexport default function useSound(\n src: string | string[],\n {\n id,\n volume = 1,\n playbackRate = 1,\n soundEnabled = true,\n interrupt = false,\n onload,\n ...delegated\n }: HookOptions = {} as HookOptions\n) {\n const HowlConstructor = React.useRef(null);\n const isMounted = React.useRef(false);\n\n const [duration, setDuration] = React.useState(null);\n\n const [sound, setSound] = React.useState(null);\n\n const handleLoad = function() {\n if (typeof onload === 'function') {\n // @ts-ignore\n onload.call(this);\n }\n\n if (isMounted.current) {\n // @ts-ignore\n setDuration(this.duration() * 1000);\n }\n\n // @ts-ignore\n setSound(this);\n };\n\n // We want to lazy-load Howler, since sounds can't play on load anyway.\n useOnMount(() => {\n import('howler').then(mod => {\n if (!isMounted.current) {\n // Depending on the module system used, `mod` might hold\n // the export directly, or it might be under `default`.\n HowlConstructor.current = mod.Howl ?? mod.default.Howl;\n\n isMounted.current = true;\n\n new HowlConstructor.current({\n src: Array.isArray(src) ? src : [src],\n volume,\n rate: playbackRate,\n onload: handleLoad,\n ...delegated,\n });\n }\n });\n\n return () => {\n isMounted.current = false;\n };\n });\n\n // When the `src` changes, we have to do a whole thing where we recreate\n // the Howl instance. This is because Howler doesn't expose a way to\n // tweak the sound\n React.useEffect(() => {\n if (HowlConstructor.current && sound) {\n setSound(\n new HowlConstructor.current({\n src: Array.isArray(src) ? src : [src],\n volume,\n onload: handleLoad,\n ...delegated,\n })\n );\n }\n // The linter wants to run this effect whenever ANYTHING changes,\n // but very specifically I only want to recreate the Howl instance\n // when the `src` changes. Other changes should have no effect.\n // Passing array to the useEffect dependencies list will result in\n // ifinite loop so we need to stringify it, for more details check\n // https://github.com/facebook/react/issues/14476#issuecomment-471199055\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(src)]);\n\n // Whenever volume/playbackRate are changed, change those properties\n // on the sound instance.\n React.useEffect(() => {\n if (sound) {\n sound.volume(volume);\n sound.rate(playbackRate);\n }\n // A weird bug means that including the `sound` here can trigger an\n // error on unmount, where the state loses track of the sprites??\n // No idea, but anyway I don't need to re-run this if only the `sound`\n // changes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [volume, playbackRate]);\n\n const play: PlayFunction = React.useCallback(\n (options?: PlayOptions) => {\n if (typeof options === 'undefined') {\n options = {};\n }\n\n if (!sound || (!soundEnabled && !options.forceSoundEnabled)) {\n return;\n }\n\n if (interrupt) {\n sound.stop();\n }\n\n if (options.playbackRate) {\n sound.rate(options.playbackRate);\n }\n\n sound.play(options.id);\n },\n [sound, soundEnabled, interrupt]\n );\n\n const stop = React.useCallback(\n id => {\n if (!sound) {\n return;\n }\n sound.stop(id);\n },\n [sound]\n );\n\n const pause = React.useCallback(\n id => {\n if (!sound) {\n return;\n }\n sound.pause(id);\n },\n [sound]\n );\n\n const returnedValue: ReturnedValue = [\n play,\n {\n sound,\n stop,\n pause,\n duration,\n },\n ];\n\n return returnedValue;\n}\n\nexport { useSound };\n","import * as React from 'react';\n\nexport default function useOnMount(callback: React.EffectCallback) {\n React.useEffect(callback, []);\n}\n","import { useState } from 'react';\r\nimport './App.css';\r\nimport Board from './components/Board/Board';\r\nimport ScoreBoard from './components/ScoreBoard/ScoreBoard';\r\nimport Modal from './components/Modal/Modal';\r\nimport useSound from 'use-sound';\r\nimport winSound from './Audio/win.mp3';\r\nimport tieSound from './Audio/tie.mp3';\r\nimport btnPopUpSound from './Audio/btnPopUp.mp3';\r\nimport newGameSound from './Audio/newGame.wav';\r\n\r\nfunction App() {\r\n const [board,setBoard] = useState(Array(9).fill(null));\r\n const [isXPlaying,setIsXPlaying] = useState(true);\r\n const [xScore,setXScore] = useState(0);\r\n const [oScore,setOScore] = useState(0);\r\n const [tieScore,setTieScore] = useState(0);\r\n const [gameOver,setGameOver] = useState(false);\r\n\r\n const [playWin , { stop: stopWin }] = useSound(winSound);\r\n const [playTie , { stop: stopTie }] = useSound(tieSound);\r\n const [playBtnPopUp, { stop: stopBtnPopUp }] = useSound(btnPopUpSound);\r\n const [playNewGame, { stop: stopNewGame }] = useSound(newGameSound);\r\n\r\n const WIN_CONDITIONS = [\r\n [0, 1, 2],\r\n [3, 4, 5],\r\n [6, 7, 8],\r\n [0, 3, 6],\r\n [1, 4, 7],\r\n [2, 5, 8],\r\n [0, 4, 8],\r\n [2, 4, 6],\r\n ];\r\n\r\n const handleBtnClick = (clickedBtnId) => {\r\n\r\n const updatedBoard = board.map((value,id) => {\r\n if (id === clickedBtnId) {\r\n stopNewGame()\r\n playBtnPopUp()\r\n return isXPlaying === true ? \"X\" : \"O\"\r\n } else {\r\n return value;\r\n }\r\n })\r\n setBoard(updatedBoard)\r\n setIsXPlaying(!isXPlaying)\r\n const winner = checkWinner(updatedBoard)\r\n\r\n const animateWinningCells = (winningCells) => {\r\n const resultArray = Array(updatedBoard.length).fill(null);\r\n\r\n winningCells.forEach((cell, index) => {\r\n resultArray[cell] = updatedBoard[cell];\r\n });\r\n\r\n setBoard(resultArray);\r\n };\r\n \r\n\r\n if (winner) {\r\n const winningCells = WIN_CONDITIONS.find(([x, y, z]) => {\r\n return (\r\n updatedBoard[x] && updatedBoard[x] === updatedBoard[y] && updatedBoard[y] === updatedBoard[z]\r\n );\r\n });\r\n animateWinningCells(winningCells);\r\n if (winner === \"X\") {\r\n setXScore(xScore+1)\r\n stopBtnPopUp()\r\n playWin()\r\n setGameOver(true)\r\n reset(\"X\")\r\n } else {\r\n setOScore(oScore+1)\r\n stopBtnPopUp()\r\n playWin()\r\n setGameOver(true)\r\n reset(\"O\")\r\n }\r\n }\r\n\r\n let allFilled = true\r\n\r\n updatedBoard.forEach((item) => {\r\n if (item === null) {\r\n allFilled = false;\r\n }\r\n });\r\n \r\n if (allFilled && winner !== \"X\" && winner !== \"O\") {\r\n setTieScore(tieScore+1)\r\n stopBtnPopUp()\r\n playTie()\r\n setGameOver(true)\r\n reset(\"tie\")\r\n }\r\n }\r\n\r\n const checkWinner = (updatedBoard)=>{\r\n for (let i = 0; i < WIN_CONDITIONS.length; i++) {\r\n const [x,y,z] = WIN_CONDITIONS[i]\r\n\r\n if (updatedBoard[x] && updatedBoard[x] === updatedBoard[y] && updatedBoard[y] === updatedBoard[z]) {\r\n return updatedBoard[x];\r\n }\r\n }\r\n }\r\n\r\n const [showModal, setShowModal] = useState(false);\r\n const [modalMessage, setModalMessage] = useState('');\r\n\r\n const reset = (currentWinner) => {\r\n setModalMessage(currentWinner);\r\n setIsXPlaying(true);\r\n setTimeout(() => {\r\n setShowModal(true);\r\n }, 1200);\r\n };\r\n\r\n const [playAgainOrRestartClicked, setPlayAgainOrRestartClicked] = useState(false);\r\n\r\n const onPlayAgain = () => {\r\n stopTie()\r\n stopWin()\r\n playNewGame()\r\n setShowModal(false);\r\n setBoard(Array(9).fill(null));\r\n setGameOver(false);\r\n setPlayAgainOrRestartClicked(true)\r\n setTimeout(() => {\r\n setPlayAgainOrRestartClicked(false)\r\n }, 500);\r\n };\r\n\r\n const onRestartGame = () => {\r\n stopTie()\r\n stopWin()\r\n playNewGame()\r\n setShowModal(false);\r\n setBoard(Array(9).fill(null));\r\n setGameOver(false);\r\n setXScore(0);\r\n setOScore(0);\r\n setTieScore(0);\r\n setPlayAgainOrRestartClicked(true)\r\n setTimeout(() => {\r\n setPlayAgainOrRestartClicked(false)\r\n }, 500); \r\n }\r\n\r\n const nothing = () => {\r\n // nothing (just used to remove some runtime errors...)\r\n }\r\n\r\n return (\r\n \r\n
Tic Tac Toe
\r\n \r\n \r\n {showModal && }\r\n
\r\n );\r\n}\r\n\r\nexport default App;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom/client';\r\nimport './index.css';\r\nimport App from './App';\r\n\r\nconst root = ReactDOM.createRoot(document.getElementById('root'));\r\nroot.render(\r\n \r\n \r\n \r\n);\r\n"],"names":["aa","require","ca","p","a","b","c","arguments","length","encodeURIComponent","da","Set","ea","fa","ha","add","ia","window","document","createElement","ja","Object","prototype","hasOwnProperty","ka","la","ma","v","d","e","f","g","this","acceptsBooleans","attributeName","attributeNamespace","mustUseProperty","propertyName","type","sanitizeURL","removeEmptyString","z","split","forEach","toLowerCase","ra","sa","toUpperCase","ta","slice","pa","isNaN","qa","call","test","oa","removeAttribute","setAttribute","setAttributeNS","replace","xlinkHref","ua","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","va","Symbol","for","wa","ya","za","Aa","Ba","Ca","Da","Ea","Fa","Ga","Ha","Ia","Ja","iterator","Ka","La","A","assign","Ma","Error","stack","trim","match","Na","Oa","prepareStackTrace","defineProperty","set","Reflect","construct","l","h","k","displayName","includes","name","Pa","tag","render","Qa","$$typeof","_context","_payload","_init","Ra","Sa","Ta","nodeName","Va","_valueTracker","getOwnPropertyDescriptor","constructor","get","configurable","enumerable","getValue","setValue","stopTracking","Ua","Wa","checked","value","Xa","activeElement","body","Ya","defaultChecked","defaultValue","_wrapperState","initialChecked","Za","initialValue","controlled","ab","bb","cb","db","ownerDocument","eb","Array","isArray","fb","options","selected","defaultSelected","disabled","gb","dangerouslySetInnerHTML","children","hb","ib","jb","textContent","kb","lb","mb","nb","namespaceURI","innerHTML","valueOf","toString","firstChild","removeChild","appendChild","MSApp","execUnsafeLocalFunction","ob","lastChild","nodeType","nodeValue","pb","animationIterationCount","aspectRatio","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridArea","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","fontWeight","lineClamp","lineHeight","opacity","order","orphans","tabSize","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","qb","rb","sb","style","indexOf","setProperty","keys","charAt","substring","tb","menuitem","area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr","ub","vb","is","wb","xb","target","srcElement","correspondingUseElement","parentNode","yb","zb","Ab","Bb","Cb","stateNode","Db","Eb","push","Fb","Gb","Hb","Ib","Jb","Kb","Lb","Mb","addEventListener","removeEventListener","Nb","apply","m","onError","Ob","Pb","Qb","Rb","Sb","Tb","Vb","alternate","return","flags","Wb","memoizedState","dehydrated","Xb","Zb","child","sibling","current","Yb","$b","ac","unstable_scheduleCallback","bc","unstable_cancelCallback","cc","unstable_shouldYield","dc","unstable_requestPaint","B","unstable_now","ec","unstable_getCurrentPriorityLevel","fc","unstable_ImmediatePriority","gc","unstable_UserBlockingPriority","hc","unstable_NormalPriority","ic","unstable_LowPriority","jc","unstable_IdlePriority","kc","lc","oc","Math","clz32","pc","qc","log","LN2","rc","sc","tc","uc","pendingLanes","suspendedLanes","pingedLanes","entangledLanes","entanglements","vc","xc","yc","zc","Ac","eventTimes","Cc","C","Dc","Ec","Fc","Gc","Hc","Ic","Jc","Kc","Lc","Mc","Nc","Oc","Map","Pc","Qc","Rc","Sc","delete","pointerId","Tc","nativeEvent","blockedOn","domEventName","eventSystemFlags","targetContainers","Vc","Wc","priority","isDehydrated","containerInfo","Xc","Yc","dispatchEvent","shift","Zc","$c","ad","bd","cd","ReactCurrentBatchConfig","dd","ed","transition","fd","gd","hd","id","Uc","stopPropagation","jd","kd","ld","md","nd","od","keyCode","charCode","pd","qd","rd","_reactName","_targetInst","currentTarget","isDefaultPrevented","defaultPrevented","returnValue","isPropagationStopped","preventDefault","cancelBubble","persist","isPersistent","wd","xd","yd","sd","eventPhase","bubbles","cancelable","timeStamp","Date","now","isTrusted","td","ud","view","detail","vd","Ad","screenX","screenY","clientX","clientY","pageX","pageY","ctrlKey","shiftKey","altKey","metaKey","getModifierState","zd","button","buttons","relatedTarget","fromElement","toElement","movementX","movementY","Bd","Dd","dataTransfer","Fd","Hd","animationName","elapsedTime","pseudoElement","Id","clipboardData","Jd","Ld","data","Md","Esc","Spacebar","Left","Up","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","Nd","Od","Alt","Control","Meta","Shift","Pd","Qd","key","String","fromCharCode","code","location","repeat","locale","which","Rd","Td","width","height","pressure","tangentialPressure","tiltX","tiltY","twist","pointerType","isPrimary","Vd","touches","targetTouches","changedTouches","Xd","Yd","deltaX","wheelDeltaX","deltaY","wheelDeltaY","wheelDelta","deltaZ","deltaMode","Zd","$d","ae","be","documentMode","ce","de","ee","fe","ge","he","ie","le","color","date","datetime","email","month","number","password","range","search","tel","text","time","url","week","me","ne","oe","event","listeners","pe","qe","re","se","te","ue","ve","we","xe","ye","ze","oninput","Ae","detachEvent","Be","Ce","attachEvent","De","Ee","Fe","He","Ie","Je","Ke","node","offset","nextSibling","Le","contains","compareDocumentPosition","Me","HTMLIFrameElement","contentWindow","href","Ne","contentEditable","Oe","focusedElem","selectionRange","documentElement","start","end","selectionStart","selectionEnd","min","defaultView","getSelection","extend","rangeCount","anchorNode","anchorOffset","focusNode","focusOffset","createRange","setStart","removeAllRanges","addRange","setEnd","element","left","scrollLeft","top","scrollTop","focus","Pe","Qe","Re","Se","Te","Ue","Ve","We","animationend","animationiteration","animationstart","transitionend","Xe","Ye","Ze","animation","$e","af","bf","cf","df","ef","ff","gf","hf","lf","mf","concat","nf","Ub","instance","listener","D","of","has","pf","qf","rf","random","sf","bind","capture","passive","n","t","J","x","u","w","F","tf","uf","parentWindow","vf","wf","na","xa","$a","ba","je","char","ke","unshift","xf","yf","zf","Af","Bf","Cf","Df","Ef","__html","Ff","setTimeout","Gf","clearTimeout","Hf","Promise","Jf","queueMicrotask","resolve","then","catch","If","Kf","Lf","Mf","previousSibling","Nf","Of","Pf","Qf","Rf","Sf","Tf","Uf","E","G","Vf","H","Wf","Xf","Yf","contextTypes","__reactInternalMemoizedUnmaskedChildContext","__reactInternalMemoizedMaskedChildContext","Zf","childContextTypes","$f","ag","bg","getChildContext","cg","__reactInternalMemoizedMergedChildContext","dg","eg","fg","gg","hg","jg","kg","lg","mg","ng","og","pg","qg","rg","sg","tg","ug","vg","wg","xg","yg","I","zg","Ag","Bg","elementType","deletions","Cg","pendingProps","overflow","treeContext","retryLane","Dg","mode","Eg","Fg","Gg","memoizedProps","Hg","Ig","Jg","Kg","Lg","defaultProps","Mg","Ng","Og","Pg","Qg","Rg","_currentValue","Sg","childLanes","Tg","dependencies","firstContext","lanes","Ug","Vg","context","memoizedValue","next","Wg","Xg","Yg","interleaved","Zg","$g","ah","updateQueue","baseState","firstBaseUpdate","lastBaseUpdate","shared","pending","effects","bh","ch","eventTime","lane","payload","callback","dh","K","eh","fh","gh","q","r","y","hh","ih","jh","Component","refs","kh","nh","isMounted","_reactInternals","enqueueSetState","L","lh","mh","enqueueReplaceState","enqueueForceUpdate","oh","shouldComponentUpdate","isPureReactComponent","ph","contextType","state","updater","qh","componentWillReceiveProps","UNSAFE_componentWillReceiveProps","rh","props","getDerivedStateFromProps","getSnapshotBeforeUpdate","UNSAFE_componentWillMount","componentWillMount","componentDidMount","sh","ref","_owner","_stringRef","th","join","uh","vh","index","wh","xh","yh","implementation","zh","Ah","done","Bh","Ch","Dh","Eh","Fh","Gh","Hh","Ih","tagName","Jh","Kh","Lh","M","Mh","revealOrder","Nh","Oh","_workInProgressVersionPrimary","Ph","ReactCurrentDispatcher","Qh","Rh","N","O","P","Sh","Th","Uh","Vh","Q","Wh","Xh","Yh","Zh","$h","ai","bi","ci","baseQueue","queue","di","ei","fi","lastRenderedReducer","action","hasEagerState","eagerState","lastRenderedState","dispatch","gi","hi","ii","ji","ki","getSnapshot","li","mi","R","ni","lastEffect","stores","oi","pi","qi","ri","create","destroy","deps","si","ti","ui","vi","wi","xi","yi","zi","Ai","Bi","Ci","Di","Ei","Fi","Gi","Hi","Ii","Ji","readContext","useCallback","useContext","useEffect","useImperativeHandle","useInsertionEffect","useLayoutEffect","useMemo","useReducer","useRef","useState","useDebugValue","useDeferredValue","useTransition","useMutableSource","useSyncExternalStore","useId","unstable_isNewReconciler","identifierPrefix","Ki","message","digest","Li","Mi","console","error","Ni","WeakMap","Oi","Pi","Qi","Ri","getDerivedStateFromError","componentDidCatch","Si","componentStack","Ti","pingCache","Ui","Vi","Wi","Xi","ReactCurrentOwner","Yi","Zi","$i","aj","bj","compare","cj","dj","ej","baseLanes","cachePool","transitions","fj","gj","hj","ij","jj","UNSAFE_componentWillUpdate","componentWillUpdate","componentDidUpdate","kj","lj","pendingContext","mj","Aj","Bj","Cj","Dj","nj","oj","pj","fallback","qj","rj","tj","dataset","dgst","uj","vj","_reactRetry","sj","subtreeFlags","wj","xj","isBackwards","rendering","renderingStartTime","last","tail","tailMode","yj","Ej","S","Fj","Gj","wasMultiple","multiple","suppressHydrationWarning","onClick","onclick","size","createElementNS","autoFocus","createTextNode","T","Hj","Ij","Jj","Kj","U","Lj","WeakSet","V","Mj","W","Nj","Oj","Qj","Rj","Sj","Tj","Uj","Vj","Wj","insertBefore","_reactRootContainer","Xj","X","Yj","Zj","ak","onCommitFiberUnmount","componentWillUnmount","bk","ck","dk","ek","fk","isHidden","gk","hk","display","ik","jk","kk","lk","__reactInternalSnapshotBeforeUpdate","src","Wk","mk","ceil","nk","ok","pk","Y","Z","qk","rk","sk","tk","uk","Infinity","vk","wk","xk","yk","zk","Ak","Bk","Ck","Dk","Ek","callbackNode","expirationTimes","expiredLanes","wc","callbackPriority","ig","Fk","Gk","Hk","Ik","Jk","Kk","Lk","Mk","Nk","Ok","Pk","finishedWork","finishedLanes","Qk","timeoutHandle","Rk","Sk","Tk","Uk","Vk","mutableReadLanes","Bc","Pj","onCommitFiberRoot","mc","onRecoverableError","Xk","onPostCommitFiberRoot","Yk","Zk","al","isReactComponent","pendingChildren","bl","mutableSourceEagerHydrationData","cl","cache","pendingSuspenseBoundaries","el","fl","gl","hl","il","jl","zj","$k","ll","reportError","ml","_internalRoot","nl","ol","pl","ql","sl","rl","unmount","unstable_scheduleHydration","splice","querySelectorAll","JSON","stringify","form","tl","usingClientEntryPoint","Events","ul","findFiberByHostInstance","bundleType","version","rendererPackageName","vl","rendererConfig","overrideHookState","overrideHookStateDeletePath","overrideHookStateRenamePath","overrideProps","overridePropsDeletePath","overridePropsRenamePath","setErrorHandler","setSuspenseHandler","scheduleUpdate","currentDispatcherRef","findHostInstanceByFiber","findHostInstancesForRefresh","scheduleRefresh","scheduleRoot","setRefreshHandler","getCurrentFiber","reconcilerVersion","__REACT_DEVTOOLS_GLOBAL_HOOK__","wl","isDisabled","supportsFiber","inject","exports","createPortal","dl","createRoot","unstable_strictMode","findDOMNode","flushSync","hydrate","hydrateRoot","hydratedSources","_getVersion","_source","unmountComponentAtNode","unstable_batchedUpdates","unstable_renderSubtreeIntoContainer","checkDCE","err","module","__self","__source","Fragment","jsx","jsxs","setState","forceUpdate","escape","_status","_result","default","Children","map","count","toArray","only","Profiler","PureComponent","StrictMode","Suspense","cloneElement","createContext","_currentValue2","_threadCount","Provider","Consumer","_defaultValue","_globalName","createFactory","createRef","forwardRef","isValidElement","lazy","memo","startTransition","unstable_act","pop","sortIndex","performance","setImmediate","startTime","expirationTime","priorityLevel","navigator","scheduling","isInputPending","MessageChannel","port2","port1","onmessage","postMessage","unstable_Profiling","unstable_continueExecution","unstable_forceFrameRate","floor","unstable_getFirstCallbackNode","unstable_next","unstable_pauseExecution","unstable_runWithPriority","delay","unstable_wrapCallback","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","leafPrototypes","getProto","getPrototypeOf","obj","__esModule","ns","def","getOwnPropertyNames","definition","o","chunkId","all","reduce","promises","miniCssF","globalThis","Function","prop","inProgress","dataWebpackPrefix","script","needAttach","scripts","getElementsByTagName","i","s","getAttribute","charset","timeout","nc","onScriptComplete","prev","onerror","onload","doneFns","fn","head","toStringTag","installedChunks","j","installedChunkData","promise","reject","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","self","_ref","playing","playAgainOrRestartClicked","gameOver","clicked","setClicked","_jsxs","className","handleClick","board","_jsx","item","Button","xScore","oScore","tieScore","onPlayAgain","onRestartGame","fontSize","marginBottom","_Fragment","_ref2$volume","_ref2","volume","playbackRate","_ref2$playbackRate","soundEnabled","_ref2$soundEnabled","interrupt","_ref2$interrupt","delegated","_objectWithoutPropertiesLoose","HowlConstructor","React__default","duration","_React$useState","setDuration","sound","_React$useState2","setSound","handleLoad","mod","_mod$Howl","Howl","_extends","rate","play","forceSoundEnabled","stop","pause","setBoard","fill","isXPlaying","setIsXPlaying","setXScore","setOScore","setTieScore","setGameOver","playWin","stopWin","useSound","winSound","playTie","stopTie","tieSound","playBtnPopUp","stopBtnPopUp","btnPopUpSound","playNewGame","stopNewGame","newGameSound","WIN_CONDITIONS","checkWinner","updatedBoard","showModal","setShowModal","modalMessage","setModalMessage","reset","currentWinner","setPlayAgainOrRestartClicked","Board","nothing","clickedBtnId","winner","winningCells","resultArray","cell","animateWinningCells","find","allFilled","ScoreBoard","Modal","ReactDOM","getElementById","React","App"],"sourceRoot":""}
\ No newline at end of file
diff --git a/static/media/btnPopUp.27c066957dbe687b7e7d.mp3 b/static/media/btnPopUp.27c066957dbe687b7e7d.mp3
new file mode 100644
index 0000000..e76bc33
Binary files /dev/null and b/static/media/btnPopUp.27c066957dbe687b7e7d.mp3 differ
diff --git a/static/media/newGame.ab583e220d9d8c0b969c.wav b/static/media/newGame.ab583e220d9d8c0b969c.wav
new file mode 100644
index 0000000..8045121
Binary files /dev/null and b/static/media/newGame.ab583e220d9d8c0b969c.wav differ
diff --git a/static/media/tie.c7095a48ea6657c8d942.mp3 b/static/media/tie.c7095a48ea6657c8d942.mp3
new file mode 100644
index 0000000..59ea711
Binary files /dev/null and b/static/media/tie.c7095a48ea6657c8d942.mp3 differ
diff --git a/static/media/win.0020897289ad8c523adb.mp3 b/static/media/win.0020897289ad8c523adb.mp3
new file mode 100644
index 0000000..ec7608c
Binary files /dev/null and b/static/media/win.0020897289ad8c523adb.mp3 differ