{
  "extends": [
    "eslint:recommended",
    "plugin:prettier/recommended",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended",
    "prettier/@typescript-eslint",
    "plugin:react-hooks/recommended"
  ],
  "plugins": ["prettier"],
  "env": {
    "es6": true,
    "commonjs": true
  },
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "sourceType": "module",
    "ecmaVersion": 9
  },
  "globals": {
    "window": false,
    "performance": false,
    "document": false,
    "navigator": false,
    "location": false,
    "console": false,
    "setTimeout": false,
    "clearTimeout": false,
    "setInterval": false,
    "clearInterval": false,
    "alert": false,
    "requestAnimationFrame": false,
    "cancelAnimationFrame": false,
    "localStorage": false,
    "sessionStorage": false,
    "FormData": false,
    "Node": false,
    "Image": false,
    "CanvasRenderingContext2D": false
  },
  "rules": {
    "strict": [2, "global"],
    "no-duplicate-imports": [2, { "includeExports": true }],

    "eqeqeq": 2,
    "block-scoped-var": 2,
    "no-constant-condition": 2,
    "no-console": 2,
    "no-debugger": 2,
    "no-lonely-if": 2,
    "no-lone-blocks": 2,
    "no-nested-ternary": 2,
    "no-dupe-keys": 2,
    "no-extra-boolean-cast": 2,
    "no-irregular-whitespace": 2,
    "no-else-return": 2,
    "no-eval": 2,
    "no-multi-str": 2,
    "no-self-compare": 2,
    "no-useless-call": 2,
    "no-shadow-restricted-names": 2,
    "no-shadow": 2,
    "no-undef": 2,
    "no-undef-init": 2,
    "no-unreachable": 2,
    "no-unused-vars": 2,
    "no-use-before-define": 2,

    "radix": 2,
    "curly": 2,
    "no-fallthrough": 2,
    "default-case": 2,

    "no-var": 2,
    "no-unused-expressions": 2,
    "camelcase": [
      2,
      {
        "properties": "always",
        "allow": ["^UNSAFE_"]
      }
    ],
    "@typescript-eslint/no-explicit-any": 2,
    "@typescript-eslint/explicit-function-return-type": 0,
    "@typescript-eslint/member-delimiter-style": 0,
    "@typescript-eslint/type-annotation-spacing": 0,
    "@typescript-eslint/no-unused-vars": 2,
    "@typescript-eslint/no-use-before-define": 2,
    "no-restricted-globals": [
      "error",
      "postMessage",
      "blur",
      "focus",
      "close",
      "frames",
      "self",
      "parent",
      "opener",
      "top",
      "length",
      "closed",
      "location",
      "origin",
      "name",
      "locationbar",
      "menubar",
      "personalbar",
      "scrollbars",
      "statusbar",
      "toolbar",
      "status",
      "frameElement",
      "navigator",
      "customElements",
      "external",
      "screen",
      "innerWidth",
      "innerHeight",
      "scrollX",
      "pageXOffset",
      "scrollY",
      "pageYOffset",
      "screenX",
      "screenY",
      "outerWidth",
      "outerHeight",
      "devicePixelRatio",
      "clientInformation",
      "screenLeft",
      "screenTop",
      "defaultStatus",
      "defaultstatus",
      "styleMedia",
      "onanimationend",
      "onanimationiteration",
      "onanimationstart",
      "onsearch",
      "ontransitionend",
      "onwebkitanimationend",
      "onwebkitanimationiteration",
      "onwebkitanimationstart",
      "onwebkittransitionend",
      "isSecureContext",
      "onabort",
      "onblur",
      "oncancel",
      "oncanplay",
      "oncanplaythrough",
      "onchange",
      "onclick",
      "onclose",
      "oncontextmenu",
      "oncuechange",
      "ondblclick",
      "ondrag",
      "ondragend",
      "ondragenter",
      "ondragleave",
      "ondragover",
      "ondragstart",
      "ondrop",
      "ondurationchange",
      "onemptied",
      "onended",
      "onerror",
      "onfocus",
      "oninput",
      "oninvalid",
      "onkeydown",
      "onkeypress",
      "onkeyup",
      "onload",
      "onloadeddata",
      "onloadedmetadata",
      "onloadstart",
      "onmousedown",
      "onmouseenter",
      "onmouseleave",
      "onmousemove",
      "onmouseout",
      "onmouseover",
      "onmouseup",
      "onmousewheel",
      "onpause",
      "onplay",
      "onplaying",
      "onprogress",
      "onratechange",
      "onreset",
      "onresize",
      "onscroll",
      "onseeked",
      "onseeking",
      "onselect",
      "onstalled",
      "onsubmit",
      "onsuspend",
      "ontimeupdate",
      "ontoggle",
      "onvolumechange",
      "onwaiting",
      "onwheel",
      "onauxclick",
      "ongotpointercapture",
      "onlostpointercapture",
      "onpointerdown",
      "onpointermove",
      "onpointerup",
      "onpointercancel",
      "onpointerover",
      "onpointerout",
      "onpointerenter",
      "onpointerleave",
      "onafterprint",
      "onbeforeprint",
      "onbeforeunload",
      "onhashchange",
      "onlanguagechange",
      "onmessage",
      "onmessageerror",
      "onoffline",
      "ononline",
      "onpagehide",
      "onpageshow",
      "onpopstate",
      "onrejectionhandled",
      "onstorage",
      "onunhandledrejection",
      "onunload",
      "performance",
      "stop",
      "open",
      "print",
      "captureEvents",
      "releaseEvents",
      "getComputedStyle",
      "matchMedia",
      "moveTo",
      "moveBy",
      "resizeTo",
      "resizeBy",
      "getSelection",
      "find",
      "createImageBitmap",
      "scroll",
      "scrollTo",
      "scrollBy",
      "onappinstalled",
      "onbeforeinstallprompt",
      "crypto",
      "ondevicemotion",
      "ondeviceorientation",
      "ondeviceorientationabsolute",
      "indexedDB",
      "webkitStorageInfo",
      "chrome",
      "visualViewport",
      "speechSynthesis",
      "webkitRequestFileSystem",
      "webkitResolveLocalFileSystemURL",
      "openDatabase",
      "setTimeout",
      "clearTimeout",
      "setInterval",
      "clearInterval",
      "requestAnimationFrame",
      "cancelAnimationFrame",
      "addEventListener",
      "removeEventListener"
    ],
    "react-hooks/rules-of-hooks": 2,
    "react-hooks/exhaustive-deps": [
      2,
      { "additionalHooks": "(useSubsequentEffect)" }
    ]
  },
  "overrides": [
    {
      "files": ["*.ts", "*.tsx"],
      "rules": {
        "no-undef": 0,
        "no-unused-vars": 0,
        "no-use-before-define": 0
      }
    }
  ]
}
